ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmMTk2YzMKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2J1aWxkL3Nvb25nL3NjcmlwdHMvc3lzdGVtLWNsYW5nLWZvcm1hdC0yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5icCBiL0FuZHJvaWQuYnAKaW5kZXggMDc3YmUyMS4uZGJhZjA1ZSAxMDA2NDQKLS0tIGEvQW5kcm9pZC5icAorKysgYi9BbmRyb2lkLmJwCkBAIC04Nyw4ICs4Nyw4IEBACiAgICAgICAgICJhaWRsX3RvX3J1c3QuY3BwIiwKICAgICAgICAgImFpZGxfdHlwZW5hbWVzLmNwcCIsCiAgICAgICAgICJhaWRsLmNwcCIsCi0gICAgICAgICJhc3RfY3BwLmNwcCIsCiAgICAgICAgICJhc3RfamF2YS5jcHAiLAorICAgICAgICAiY2hlY2tfdmFsaWQuY3BwIiwKICAgICAgICAgImNvZGVfd3JpdGVyLmNwcCIsCiAgICAgICAgICJjb21tZW50cy5jcHAiLAogICAgICAgICAiZGlhZ25vc3RpY3MuY3BwIiwKQEAgLTEwMCwxMSArMTAwLDEyIEBACiAgICAgICAgICJnZW5lcmF0ZV9ydXN0LmNwcCIsCiAgICAgICAgICJpbXBvcnRfcmVzb2x2ZXIuY3BwIiwKICAgICAgICAgImlvX2RlbGVnYXRlLmNwcCIsCi0gICAgICAgICJsaW5lX3JlYWRlci5jcHAiLAogICAgICAgICAibG9jYXRpb24uY3BwIiwKICAgICAgICAgImxvZ2dpbmcuY3BwIiwKICAgICAgICAgIm9wdGlvbnMuY3BwIiwKICAgICAgICAgInBhcnNlci5jcHAiLAorICAgICAgICAicGVybWlzc2lvbi5jcHAiLAorICAgICAgICAicHJlcHJvY2Vzcy5jcHAiLAogICAgIF0sCiAgICAgeWFjYzogewogICAgICAgICBnZW5fbG9jYXRpb25faGg6IHRydWUsCkBAIC0xNTMsNyArMTU0LDYgQEAKIAogICAgIHNyY3M6IFsKICAgICAgICAgImFpZGxfdW5pdHRlc3QuY3BwIiwKLSAgICAgICAgImFzdF9jcHBfdW5pdHRlc3QuY3BwIiwKICAgICAgICAgImFzdF9qYXZhX3VuaXR0ZXN0LmNwcCIsCiAgICAgICAgICJjb2RlX3dyaXRlcl91bml0dGVzdC5jcHAiLAogICAgICAgICAiZGlhZ25vc3RpY3NfdW5pdHRlc3QuY3BwIiwKQEAgLTE3Myw2ICsxNzMsMTAgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAorICAgIHNhbml0aXplOiB7CisgICAgICAgIGFkZHJlc3M6IHRydWUsCisgICAgfSwKKwogICAgIHJlcXVpcmVkOiBbImFpZGwtZ29sZGVuLXRlc3QtYnVpbGQtaG9vayJdLAogfQogCkBAIC0xODYsMTAgKzE5MCw3IEBACiAKICAgICBmdXp6X2NvbmZpZzogewogICAgICAgICBjYzogWwotICAgICAgICAgICAgImRldmlubW9vcmVAZ29vZ2xlLmNvbSIsCi0gICAgICAgICAgICAic21vcmVsYW5kQGdvb2dsZS5jb20iLAotICAgICAgICAgICAgImppeW9uZ0Bnb29nbGUuY29tIiwKLSAgICAgICAgICAgICJqZW9uZ2lrQGdvb2dsZS5jb20iLAorICAgICAgICAgICAgImFpZGwtYnVnc0Bnb29nbGUuY29tIiwKICAgICAgICAgXSwKICAgICB9LAogCkBAIC0yMjAsMTEgKzIyMSwxNyBAQAogICAgIHRlc3RfY29uZmlnOiAidGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnhtbCIsCiAgICAgdGFyZ2V0X3JlcXVpcmVkOiBbCiAgICAgICAgICJhaWRsX3Rlc3RfY2xpZW50IiwKKyAgICAgICAgImFpZGxfdGVzdF9jbGllbnRfbmRrIiwKICAgICAgICAgImFpZGxfdGVzdF9zZXJ2aWNlIiwKICAgICAgICAgImFpZGxfdGVzdF9qYXZhX2NsaWVudCIsCiAgICAgICAgICJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlIiwKICAgICAgICAgImFpZGxfdGVzdF9ydXN0X2NsaWVudCIsCiAgICAgICAgICJhaWRsX3Rlc3RfcnVzdF9zZXJ2aWNlIiwKKyAgICAgICAgImFpZGxfdGVzdF9ydXN0X3NlcnZpY2VfYXN5bmMiLAorICAgICAgICAiYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazEiLAorICAgICAgICAiYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsxIiwKKyAgICAgICAgImFpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGsyOSIsCisgICAgICAgICJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazI5IiwKICAgICBdLAogICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKICAgICB0ZXN0X29wdGlvbnM6IHsKQEAgLTI3MiwyNCArMjc5LDMyIEBACiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJhaWRsLWludGVncmF0aW9uLXRlc3QtZmlsZXMiLAogICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIiwKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5haWRsIiwKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vKi5haWRsIiwKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvKi5haWRsIiwKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuYWlkbCIsCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmFpZGwiLAogICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy8qLmFpZGwiLAogICAgIF0sCiAgICAgcGF0aDogInRlc3RzIiwKQEAgLTI5OCw5ICszMTMsMTcgQEAKIGZpbGVncm91cCB7CiAgICAgbmFtZTogImxpYmFpZGwtaW50ZWdyYXRpb24tY3BwLWphdmEtdGVzdC1maWxlcyIsCiAgICAgc3JjczogWworICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhZFBhcmNlbGFibGUuYWlkbCIsCiAgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSUNwcEphdmFUZXN0cy5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TaW1wbGVQYXJjZWxhYmxlLmFpZGwiLAotICAgICAgICAidGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi8qLmFpZGwiLAorICAgIF0sCisgICAgcGF0aDogInRlc3RzIiwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGliYWlkbC1pbnRlZ3JhdGlvbi1wbGF0Zm9ybS10ZXN0LWZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS8qLmFpZGwiLAogICAgIF0sCiAgICAgcGF0aDogInRlc3RzIiwKIH0KQEAgLTMzMCwxMSArMzUzLDE0IEBACiAgICAgICAgIGdlbmVyYXRlX3RyYWNlczogdHJ1ZSwKICAgICAgICAgZXhwb3J0X2FpZGxfaGVhZGVyczogdHJ1ZSwKICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInRlc3RzIl0sCi0gICAgICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL25hdGl2ZS9haWRsL2JpbmRlciJdLAorICAgICAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9haWRsL2JpbmRlciIsCisgICAgICAgIF0sCiAgICAgfSwKICAgICBzcmNzOiBbCiAgICAgICAgICI6bGliYWlkbC1pbnRlZ3JhdGlvbi10ZXN0LWZpbGVzIiwKICAgICAgICAgIjpsaWJhaWRsLWludGVncmF0aW9uLWNwcC1qYXZhLXRlc3QtZmlsZXMiLAorICAgICAgICAidGVzdHMvYmFkX3BhcmNlbGFibGUuY3BwIiwKICAgICAgICAgInRlc3RzL3NpbXBsZV9wYXJjZWxhYmxlLmNwcCIsCiAgICAgXSwKIH0KQEAgLTM0OSw2ICszNzUsNyBAQAogICAgICAgICAvLyBzZXJ2aWNlIHVzZXMgdGhlIG9sZCB2ZXJzaW9uCiAgICAgICAgICJhaWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMS1jcHAiLAogICAgICAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAiLAorICAgICAgICAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcCIsCiAgICAgXSwKICAgICBzcmNzOiBbInRlc3RzL2FpZGxfdGVzdF9zZXJ2aWNlLmNwcCJdLAogfQpAQCAtMzYyLDEwICszODksMTIgQEAKICAgICAgICAgImxpYmdtb2NrIiwKICAgICAgICAgLy8gIGNsaWVudCB1c2VzIHRoZSBsYXRlc3QgdmVyc2lvbgogICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItY3BwIiwKLSAgICAgICAgImFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwIgorICAgICAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAiLAorICAgICAgICAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcCIsCiAgICAgXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50LmNwcCIsCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2J1aWx0aW5fdHJhbnNhY3Rpb25zLmNwcCIsCiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2ZpbGVfZGVzY3JpcHRvcnMuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfcGFyY2VsYWJsZXMuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbnVsbGFibGVzLmNwcCIsCkBAIC0zNzMsOSArNDAyLDExIEBACiAgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3V0Zjhfc3RyaW5ncy5jcHAiLAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9zZXJ2aWNlX2V4Y2VwdGlvbnMuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfZGVmYXVsdGltcGwuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfZGVsZWdhdGUuY3BwIiwKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAiLAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9yZW5hbWVkX2ludGVyZmFjZS5jcHAiLAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9sb2dnYWJsZV9pbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmVzdGVkLmNwcCIsCiAgICAgXSwKIH0KIApAQCAtMzg2LDE5ICs0MTcsNDYgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgICAgIC8vICBjbGllbnQgdXNlcyB0aGUgbGF0ZXN0IHZlcnNpb24KLSAgICAgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJhaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIKKyAgICAgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLW5kayIsCisgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLW5kayIsCisgICAgICAgICJhaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kayIsCisgICAgICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICBdLAogICAgIHNyY3M6IFsKICAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX2xvZ2dhYmxlX2ludGVyZmFjZS5jcHAiLAorICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbmVzdGVkLmNwcCIsCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19udWxsYWJsZXMuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3BhcmNlbGFibGVzLmNwcCIsCisgICAgICAgICJ0ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19wcmltaXRpdmVzX3Rlc3QuY3BwIiwKKyAgICAgICAgInRlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3N0cmluZ3NfdGVzdC5jcHAiLAogICAgICAgICAidGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAiLAogICAgIF0sCiB9CiAKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAiYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5IiwKKyAgICBzcmNzOiBbInRlc3RzL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuYWlkbCJdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAidGVzdHMiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBqYXZhOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBuZGs6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgICAgIHJ1c3Q6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgfQorfQorCiBqYXZhX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiYWlkbF90ZXN0X2phdmFfZGVmYXVsdHMiLAogICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCkBAIC00MTUsNiArNDczLDcgQEAKICAgICAgICAgImFpZGxfdGVzdF9ub252aW50Zl9wYXJjZWxhYmxlLVYxLWphdmEiLAogICAgICAgICAiYWlkbF90ZXN0X3Vuc3RhYmxlX3BhcmNlbGFibGUtamF2YSIsCiAgICAgICAgICJhaWRsX3Rlc3RfdmludGZfcGFyY2VsYWJsZS1WMS1qYXZhIiwKKyAgICAgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhIiwKICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgQW5kcm9pZCBtaWdyYXRlcyB0byBKVW5pdCA0LjEyLAogICAgICAgICAvLyB3aGljaCBwcm92aWRlcyBhc3NlcnRUaHJvd3MKICAgICAgICAgInRlc3RuZyIsCkBAIC00MjUsNyArNDg0LDkgQEAKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9pbW11dGFibGUvKi5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9tYXAvKi5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vKi5haWRsIiwKKyAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvKi5haWRsIiwKICAgICAgICAgInRlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvKi5haWRsIiwKKyAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWRQYXJjZWxhYmxlLmphdmEiLAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL1NpbXBsZVBhcmNlbGFibGUuamF2YSIsCiAgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvZ2VuZXJpYy9QYWlyLmphdmEiLAogICAgIF0sCkBAIC00NDQsNyArNTA1LDcgQEAKICAgICBkZWZhdWx0czogWyJhaWRsX3Rlc3RfamF2YV9kZWZhdWx0cyJdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgIC8vIGNsaWVudCB1c2VzIHRoZSBuZXcgdmVyc2lvbgotICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YSIsCisgICAgICAgICJhaWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMy1qYXZhIiwKICAgICBdLAogICAgIC8vIHRlc3RzIGFyZSBpbmNsdWRlZCBpbiBkZWZhdWx0cwogICAgIHNyY3M6IFsKQEAgLTQ1Miw3ICs1MTMsMTAgQEAKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhIiwKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9KYXZhT25seUltbXV0YWJsZUFubm90YXRpb25UZXN0cy5qYXZhIiwKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9BaWRsSmF2YVRlc3RzLmphdmEiLAorICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0J1aWx0SW5UZXN0cy5qYXZhIiwKKyAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9EZWxlZ2F0b3JUZXN0cy5qYXZhIiwKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljVGVzdHMuamF2YSIsCisgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTmVzdGVkVHlwZXNUZXN0cy5qYXZhIiwKICAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0VmVyc2lvbmVkSW50ZXJmYWNlLmphdmEiLAogICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uVGVzdHMuamF2YSIsCiAgICAgICAgICJ0ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YSIsCkBAIC00NzMsNiArNTM3LDc1IEBACiAgICAgXSwKIH0KIAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYWlkbC1mb3Itc2RrdmVyc2lvbi10ZXN0cyIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vSVRlc3RTZXJ2aWNlLmFpZGwiLAorICAgIF0sCisgICAgcGF0aDogInRlc3RzL2phdmEvc3JjIiwKK30KKworamF2YV9kZWZhdWx0cyB7CisgICAgbmFtZTogImFpZGxfdGVzdF9qYXZhX3Nka3ZlcnNpb25fZGVmYXVsdHMiLAorICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCisgICAgLy8gVHVybiBvZmYgSmF2YSBvcHRpbWl6YXRpb24gdG9vbHMgdG8gc3BlZWQgdXAgb3VyIHRlc3QgaXRlcmF0aW9ucy4KKyAgICBvcHRpbWl6ZTogeworICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICB9LAorICAgIGRleF9wcmVvcHQ6IHsKKyAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgfSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZHgudGVzdC5jb3JlIiwKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphaWRsLWZvci1zZGt2ZXJzaW9uLXRlc3RzIiwKKyAgICBdLAorICAgIGFpZGw6IHsKKyAgICAgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvYWlkbC9iaW5kZXIiLAorICAgICAgICBdLAorICAgIH0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCitqYXZhX3Rlc3QgeworICAgIG5hbWU6ICJhaWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMjkiLAorICAgIGRlZmF1bHRzOiBbImFpZGxfdGVzdF9qYXZhX3Nka3ZlcnNpb25fZGVmYXVsdHMiXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vdGVzdHMvKi5qYXZhIiwKKyAgICBdLAorfQorCitqYXZhX3Rlc3QgeworICAgIG5hbWU6ICJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazI5IiwKKyAgICBkZWZhdWx0czogWyJhaWRsX3Rlc3RfamF2YV9zZGt2ZXJzaW9uX2RlZmF1bHRzIl0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZGt2ZXJzaW9uL3NlcnZpY2UvKi5qYXZhIiwKKyAgICBdLAorfQorCitqYXZhX3Rlc3QgeworICAgIG5hbWU6ICJhaWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMSIsCisgICAgZGVmYXVsdHM6IFsiYWlkbF90ZXN0X2phdmFfc2RrdmVyc2lvbl9kZWZhdWx0cyJdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZGt2ZXJzaW9uL3Rlc3RzLyouamF2YSIsCisgICAgXSwKK30KKworamF2YV90ZXN0IHsKKyAgICBuYW1lOiAiYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsxIiwKKyAgICBkZWZhdWx0czogWyJhaWRsX3Rlc3RfamF2YV9zZGt2ZXJzaW9uX2RlZmF1bHRzIl0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMSIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vc2VydmljZS8qLmphdmEiLAorICAgIF0sCit9CisKIC8vCiAvLyAiR29sZGVuIiB0ZXN0IG9mIGNvbXBpbGVyIG91dHB1dAogLy8KQEAgLTQ4NiwxNyArNjE5LDIyIEBACiAgICAgbmFtZTogImFpZGwtZ29sZGVuLXRlc3QtYnVpbGQtaG9vay1nZW4iLAogICAgIHRvb2xzOiBbImFpZGwtZ29sZGVuLXRlc3QiXSwKICAgICBjbWQ6ICIkKGxvY2F0aW9uIGFpZGwtZ29sZGVuLXRlc3QpIGNoZWNrICYmICIgKwotICAgICAgICAgImVjaG8gJ2ludCBtYWluKCl7cmV0dXJuIDA7fScgPiAkKGdlbkRpcikvVE9ET19iXzM3NTc1ODgzLmNwcCIsCisgICAgICAgICJlY2hvICdpbnQgbWFpbigpe3JldHVybiAwO30nID4gJChnZW5EaXIpL1RPRE9fYl8zNzU3NTg4My5jcHAiLAogICAgIHNyY3M6IFsKICAgICAgICAgLy8gd2FybmluZzoga2VlcCB0aGlzIGxpc3QgdXAgdG8gZGF0ZSB3aXRoIHRlc3RzL2dvbGRlbl90ZXN0LnNoCiAgICAgICAgICI6YWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlIiwKICAgICAgICAgIjphaWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlIiwKLSAgICAgICAgIjphaWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlIiwKKyAgICAgICAgIjphaWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UiLAogICAgICAgICAiOmFpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UiLAogICAgICAgICAiOmFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZSIsCiAgICAgICAgICI6YWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZSIsCi0gICAgICAgICI6YWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlIiwKICAgICAgICAgIjphaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC1pbnRlcmZhY2UtcGxhdGZvcm0tamF2YS1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlIiwKKyAgICAgICAgIjphaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktamF2YS1zb3VyY2UiLAorICAgICAgICAiOmFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1uZGstc291cmNlIiwKKyAgICAgICAgIjphaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UiLAogICAgICAgICAidGVzdHMvZ29sZGVuX291dHB1dC8qKi8qIiwKICAgICBdLAogICAgIG91dDogWyJUT0RPX2JfMzc1NzU4ODMuY3BwIl0sCkBAIC01MjYsMjQgKzY2NCwxNyBAQAogICAgIGdlbl90cmFjZTogdHJ1ZSwKICAgICBiYWNrZW5kOiB7CiAgICAgICAgIGNwcDogewotICAgICAgICAgICAgc3Jjc19hdmFpbGFibGU6IHRydWUsCiAgICAgICAgICAgICBnZW5fbG9nOiB0cnVlLAogICAgICAgICB9LAogICAgICAgICBuZGs6IHsKLSAgICAgICAgICAgIHNyY3NfYXZhaWxhYmxlOiB0cnVlLAogICAgICAgICAgICAgZ2VuX2xvZzogdHJ1ZSwKICAgICAgICAgfSwKICAgICAgICAgamF2YTogewotICAgICAgICAgICAgc3Jjc19hdmFpbGFibGU6IHRydWUsCiAgICAgICAgICAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCiB9CiAKLS8vCi0vLyBSdXN0IHRlc3RzCi0vLwotCiBhaWRsX2ludGVyZmFjZSB7CiAgICAgbmFtZTogImFpZGwtdGVzdC1pbnRlcmZhY2UiLAogICAgIHVuc3RhYmxlOiB0cnVlLApAQCAtNTUyLDIzICs2ODMsNDkgQEAKICAgICBsb2NhbF9pbmNsdWRlX2RpcjogInRlc3RzIiwKICAgICBiYWNrZW5kOiB7CiAgICAgICAgIGNwcDogewotICAgICAgICAgICAgc3Jjc19hdmFpbGFibGU6IHRydWUsCiAgICAgICAgIH0sCiAgICAgICAgIGphdmE6IHsKICAgICAgICAgICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCi0gICAgICAgICAgICBzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIGdlbl9ycGM6IHRydWUsCiAgICAgICAgIH0sCiAgICAgICAgIHJ1c3Q6IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgICAgICAgICBzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgfSwKICAgICAgICAgbmRrOiB7CiAgICAgICAgICAgICBhcHBzX2VuYWJsZWQ6IGZhbHNlLAotICAgICAgICAgICAgc3Jjc19hdmFpbGFibGU6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKIH0KIAorYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhaWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBmbGFnczogWyItV2Vycm9yIl0sCisgICAgc3JjczogWyI6bGliYWlkbC1pbnRlZ3JhdGlvbi1wbGF0Zm9ybS10ZXN0LWZpbGVzIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIiwKKyAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAidGVzdHMiLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICAgICAgcnVzdDogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgICAgIG5kazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8KKy8vIFJ1c3QgdGVzdHMKKy8vCisKIHJ1c3RfdGVzdCB7CiAgICAgbmFtZTogImFpZGxfdGVzdF9ydXN0X2NsaWVudCIsCiAgICAgc3JjczogWwpAQCAtNTc3LDcgKzczNCwxNSBAQAogICAgIHJ1c3RsaWJzOiBbCiAgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3QiLAogICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItcnVzdCIsCisgICAgICAgICJhaWRsX3Rlc3Rfbm9udmludGZfcGFyY2VsYWJsZS1WMS1ydXN0IiwKKyAgICAgICAgImFpZGxfdGVzdF91bnN0YWJsZV9wYXJjZWxhYmxlLXJ1c3QiLAorICAgICAgICAiYWlkbF90ZXN0X3ZpbnRmX3BhcmNlbGFibGUtVjEtcnVzdCIsCisgICAgICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdCIsCiAgICAgICAgICJsaWJsaWJjIiwKKyAgICAgICAgLy8gV2UgbmVlZCB0byBpbXBvcnQgYmluZGVyX3JzIGRpcmVjdGx5CisgICAgICAgIC8vIGZvciBhIGZldyBpbnRlcm5hbCB0eXBlcyBsaWtlIFBhcmNlbAorICAgICAgICAvLyBhbmQgdHJhaXRzIGxpa2UgUGFyY2VsYWJsZQorICAgICAgICAibGliYmluZGVyX3JzIiwKICAgICBdLAogICAgIHByZWZlcl9ybGliOiB0cnVlLAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKQEAgLTYwMSw2ICs3NjYsNyBAQAogICAgIHJ1c3RsaWJzOiBbCiAgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3QiLAogICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdCIsCisgICAgICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdCIsCiAgICAgICAgICJsaWJsaWJjIiwKICAgICBdLAogICAgIHByZWZlcl9ybGliOiB0cnVlLApAQCAtNjE1LDMgKzc4MSwzMCBAQAogICAgIH0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAogfQorCitydXN0X3Rlc3QgeworICAgIG5hbWU6ICJhaWRsX3Rlc3RfcnVzdF9zZXJ2aWNlX2FzeW5jIiwKKyAgICB0ZXN0X2hhcm5lc3M6IGZhbHNlLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlX2FzeW5jLnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3QiLAorICAgICAgICAiYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjEtcnVzdCIsCisgICAgICAgICJsaWJsaWJjIiwKKyAgICAgICAgImxpYmJpbmRlcl90b2tpb19ycyIsCisgICAgICAgICJsaWJ0b2tpbyIsCisgICAgXSwKKyAgICBwcm9jX21hY3JvczogWyJsaWJhc3luY190cmFpdCJdLAorICAgIHByZWZlcl9ybGliOiB0cnVlLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBsaWIzMjogeworICAgICAgICAgICAgc3VmZml4OiAiMzIiLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgc3VmZml4OiAiNjQiLAorICAgICAgICB9LAorICAgIH0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCmluZGV4IGZjNDU1NTAuLmNjMzViMTEgMTAwNjQ0Ci0tLSBhL09XTkVSUworKysgYi9PV05FUlMKQEAgLTEsNSArMSw2IEBACiBlbHNrQGdvb2dsZS5jb20KIGppeW9uZ0Bnb29nbGUuY29tCitqb295dW5nQGdvb2dsZS5jb20KIG1hbGNoZXZAZ29vZ2xlLmNvbQogc2FkbWFjQGdvb2dsZS5jb20KIHNtb3JlbGFuZEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9QUkVVUExPQUQuY2ZnIGIvUFJFVVBMT0FELmNmZwppbmRleCAxMjU0NWUxLi4wMTE0NzMxIDEwMDY0NAotLS0gYS9QUkVVUExPQUQuY2ZnCisrKyBiL1BSRVVQTE9BRC5jZmcKQEAgLTUsMyArNSw3IEBACiBjbGFuZ19mb3JtYXQgPSB0cnVlCiBnb2ZtdCA9IHRydWUKIGFpZGxfZm9ybWF0ID0gdHJ1ZQorcnVzdGZtdCA9IHRydWUKKworW0J1aWx0aW4gSG9va3MgT3B0aW9uc10KK3J1c3RmbXQgPSAtLWNvbmZpZy1wYXRoPXJ1c3RmbXQudG9tbApkaWZmIC0tZ2l0IGEvVEVTVF9NQVBQSU5HIGIvVEVTVF9NQVBQSU5HCmluZGV4IDZiMjk3NDUuLjc5ZjQ5ZTIgMTAwNjQ0Ci0tLSBhL1RFU1RfTUFQUElORworKysgYi9URVNUX01BUFBJTkcKQEAgLTcsMTAgKzcsMTUgQEAKICAgICAgICJuYW1lIjogImFpZGxfaW50ZWdyYXRpb25fdGVzdCIKICAgICB9LAogICAgIHsKLSAgICAgICJuYW1lIjogIkN0c05ka0JpbmRlclRlc3RDYXNlcyIKKyAgICAgICJuYW1lIjogImFpZGxfbGF6eV90ZXN0IgogICAgIH0sCiAgICAgewotICAgICAgIm5hbWUiOiAiYWlkbF9sYXp5X3Rlc3QiCisgICAgICAibmFtZSI6ICJDdHNOZGtCaW5kZXJUZXN0Q2FzZXMiCisgICAgfQorICBdLAorICAiaW1wb3J0cyI6IFsKKyAgICB7CisgICAgICAicGF0aCI6ICJmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2JpbmRlciIKICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL2FpZGwtZm9ybWF0LnNoIGIvYWlkbC1mb3JtYXQuc2gKaW5kZXggNGYyYTEwNC4uZGJmM2UyYSAxMDA3NTUKLS0tIGEvYWlkbC1mb3JtYXQuc2gKKysrIGIvYWlkbC1mb3JtYXQuc2gKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgIyAiYSA9IDEsIGIgPSAyIiB3b3VsZCBtYXRjaCBvbmx5IG9uY2UgYW5kIHdpbGwgYmVjb21lICJhID0gMSwgYj0yIi4KICAgICAgIGdhd2sgLWkgaW5wbGFjZSBcCiAgICAgICAgICcvQFteQF0rXCguKj0uKlwpLyB7ICMgbWF0Y2hlcyBhIGxpbmUgaGF2aW5nIEBhbm5vKHBhcmFtID0gdmFsKSBcCi0gICAgICAgICAgICAgIHByaW50KGdlbnN1YigvKFteQCw9XSspID0gKFteQCw9XSspLywgIlxcMT1cXDIiLCAiZyIsICQwKSk7IFwKKyAgICAgICAgICAgICAgcHJpbnQoZ2Vuc3ViKC8oW15ALD1dKykgPSAoW15ALD1dK3wiW14iXSoiKS8sICJcXDE9XFwyIiwgImciLCAkMCkpOyBcCiAgICAgICAgICAgICAgIGRvbmU9MTtcCiAgICAgICAgIH0gXAogICAgICAgICB7aWYgKCFkb25lKSB7cHJpbnQoJDApO30gZG9uZT0wO30nICIkMSIKZGlmZiAtLWdpdCBhL2FpZGwuY3BwIGIvYWlkbC5jcHAKaW5kZXggNzdjNWYzMS4uZmQ2M2M2YSAxMDA2NDQKLS0tIGEvYWlkbC5jcHAKKysrIGIvYWlkbC5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlICJhaWRsX2R1bXBhcGkuaCIKICNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCiAjaW5jbHVkZSAiYWlkbF90eXBlbmFtZXMuaCIKKyNpbmNsdWRlICJjaGVja192YWxpZC5oIgogI2luY2x1ZGUgImdlbmVyYXRlX2FpZGxfbWFwcGluZ3MuaCIKICNpbmNsdWRlICJnZW5lcmF0ZV9jcHAuaCIKICNpbmNsdWRlICJnZW5lcmF0ZV9qYXZhLmgiCkBAIC01MCw2ICs1MSw3IEBACiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAicHJlcHJvY2Vzcy5oIgogCiAjaWZuZGVmIE9fQklOQVJZCiAjICBkZWZpbmUgT19CSU5BUlkgIDAKQEAgLTI1MCw3ICsyNTIsNyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi1ib29sIGNoZWNrX2FuZF9hc3NpZ25fbWV0aG9kX2lkcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1ldGhvZD4+JiBpdGVtcykgeworYm9vbCBDaGVja0FuZEFzc2lnbk1ldGhvZElEcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1ldGhvZD4+JiBpdGVtcykgewogICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbWV0aG9kcyB3aXRoIG1hbnVhbGx5IGFzc2lnbmVkIGlkJ3MgYW5kIGFueQogICAvLyB0aGF0IGFyZSBub3QuIEVpdGhlciBhbGwgbWV0aG9kIGlkJ3MgbXVzdCBiZSBtYW51YWxseSBhc3NpZ25lZCBvciBhbGwgb2YKICAgLy8gdGhlbSBtdXN0IG5vdC4gQWxzbywgY2hlY2sgZm9yIHVwbGljYXRlcyBvZiB1c2VyIHNldCBJRCdzIGFuZCB0aGF0IHRoZQpAQCAtMzAyLDU4ICszMDQsMTMgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLS8vIFRPRE86IFJlbW92ZSB0aGlzIGluIGZhdm9yIG9mIHVzaW5nIHRoZSBZQUNDIHBhcnNlciBiLzI1NDc5Mzc4Ci1ib29sIFBhcnNlUHJlcHJvY2Vzc2VkTGluZShjb25zdCBzdHJpbmcmIGxpbmUsIHN0cmluZyogZGVjbCwgc3RkOjpzdHJpbmcqIHBhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGNsYXNzX25hbWUpIHsKLSAgLy8gZXJhc2UgYWxsIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIHNlbWljb2xvbnMKLSAgY29uc3Qgc2l6ZV90IGVuZCA9IGxpbmUuZmluZF9sYXN0X25vdF9vZigiIDtcdCIpOwotICBpZiAoZW5kID09IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAobGluZS5yZmluZCgnOycsIGVuZCkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVjbC0+Y2xlYXIoKTsKLSAgc3RyaW5nIHR5cGU7Ci0gIHZlY3RvcjxzdHJpbmc+IHBpZWNlcyA9IFNwbGl0KGxpbmUuc3Vic3RyKDAsIGVuZCArIDEpLCAiIFx0Iik7Ci0gIGZvciAoY29uc3Qgc3RyaW5nJiBwaWVjZSA6IHBpZWNlcykgewotICAgIGlmIChwaWVjZS5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGRlY2wtPmVtcHR5KCkpIHsKLSAgICAgICpkZWNsID0gc3RkOjptb3ZlKHBpZWNlKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUuZW1wdHkoKSkgewotICAgICAgdHlwZSA9IHN0ZDo6bW92ZShwaWVjZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpYyBpcyBhYnNvbHV0ZWx5IHdyb25nLiAgR2l2ZW4gYSBwYXJjZWxhYmxlCi0gIC8vIG9yZy5zb21lLkZvby5CYXIsIHRoZSBjbGFzcyBuYW1lIGlzIEZvby5CYXIsIGJ1dCB0aGlzIGNvZGUgd2lsbCBjbGFpbSB0aGF0Ci0gIC8vIHRoZSBjbGFzcyBpcyBqdXN0IEJhci4gIEhvd2V2ZXIsIHRoaXMgd2FzIHRoZSB3YXkgaXQgd2FzIGRvbmUgaW4gdGhlIHBhc3QuCi0gIC8vCi0gIC8vIFNlZSBiLzE3NDE1NjkyCi0gIHNpemVfdCBkb3RfcG9zID0gdHlwZS5yZmluZCgnLicpOwotICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAqY2xhc3NfbmFtZSA9IHR5cGUuc3Vic3RyKGRvdF9wb3MgKyAxKTsKLSAgICAqcGFja2FnZSA9IHR5cGUuc3Vic3RyKDAsIGRvdF9wb3MpOwotICB9IGVsc2UgewotICAgICpjbGFzc19uYW1lID0gdHlwZTsKLSAgICBwYWNrYWdlLT5jbGVhcigpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KIGJvb2wgVmFsaWRhdGVBbm5vdGF0aW9uQ29udGV4dChjb25zdCBBaWRsRG9jdW1lbnQmIGRvYykgewogICBzdHJ1Y3QgQW5ub3RhdGlvblZhbGlkYXRvciA6IEFpZGxWaXNpdG9yIHsKICAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwogCiAgICAgdm9pZCBDaGVjayhjb25zdCBBaWRsQW5ub3RhdGFibGUmIGFubm90YXRhYmxlLCBBaWRsQW5ub3RhdGlvbjo6VGFyZ2V0Q29udGV4dCBjb250ZXh0KSB7CiAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFubm90IDogYW5ub3RhdGFibGUuR2V0QW5ub3RhdGlvbnMoKSkgewotICAgICAgICBpZiAoIWFubm90LkNoZWNrQ29udGV4dChjb250ZXh0KSkgeworICAgICAgICBpZiAoIWFubm90LT5DaGVja0NvbnRleHQoY29udGV4dCkpIHsKICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTM5OCw2OSArMzU1LDM4IEBACiAgIHJldHVybiB2YWxpZGF0b3Iuc3VjY2VzczsKIH0KIAorYm9vbCBWYWxpZGF0ZUNwcEhlYWRlcihjb25zdCBBaWRsRG9jdW1lbnQmIGRvYykgeworICBzdHJ1Y3QgQ3BwSGVhZGVyVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFBhcmNlbGFibGUmIHApIG92ZXJyaWRlIHsKKyAgICAgIGlmIChwLkdldENwcEhlYWRlcigpLmVtcHR5KCkpIHsKKyAgICAgICAgQUlETF9FUlJPUihwKSA8PCAiVW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGUgXCIiIDw8IHAuR2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiIG11c3QgaGF2ZSBDKysgaGVhZGVyIGRlZmluZWQuIjsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBtKSBvdmVycmlkZSB7CisgICAgICBhdXRvIHR5cGUgPSBtLkdldERlZmluZWRUeXBlKCk7CisgICAgICBpZiAodHlwZSkgeworICAgICAgICBhdXRvIHVuc3RydWN0dXJlZCA9IHR5cGUtPkFzVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpOworICAgICAgICBpZiAodW5zdHJ1Y3R1cmVkICYmIHVuc3RydWN0dXJlZC0+R2V0Q3BwSGVhZGVyKCkuZW1wdHkoKSkgeworICAgICAgICAgIEFJRExfRVJST1IobSkgPDwgIlVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIFwiIiA8PCBtLkdldFVucmVzb2x2ZWROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiBtdXN0IGhhdmUgQysrIGhlYWRlciBkZWZpbmVkLiI7CisgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIENwcEhlYWRlclZpc2l0b3IgdmFsaWRhdG9yOworICBWaXNpdFRvcERvd24odmFsaWRhdG9yLCBkb2MpOworICByZXR1cm4gdmFsaWRhdG9yLnN1Y2Nlc3M7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgaW50ZXJuYWxzIHsKIAotYm9vbCBwYXJzZV9wcmVwcm9jZXNzZWRfZmlsZShjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyogdHlwZW5hbWVzKSB7Ci0gIGJvb2wgc3VjY2VzcyA9IHRydWU7Ci0gIHVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gbGluZV9yZWFkZXIgPSBpb19kZWxlZ2F0ZS5HZXRMaW5lUmVhZGVyKGZpbGVuYW1lKTsKLSAgaWYgKCFsaW5lX3JlYWRlcikgewotICAgIEFJRExfRVJST1IoZmlsZW5hbWUpIDw8ICJjYW5ub3Qgb3BlbiBwcmVwcm9jZXNzZWQgZmlsZSI7Ci0gICAgc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBzdWNjZXNzOwotICB9Ci0KLSAgc3RyaW5nIGxpbmU7Ci0gIGludCBsaW5lbm8gPSAxOwotICBmb3IgKCA7IGxpbmVfcmVhZGVyLT5SZWFkTGluZSgmbGluZSk7ICsrbGluZW5vKSB7Ci0gICAgaWYgKGxpbmUuZW1wdHkoKSB8fCBsaW5lLmNvbXBhcmUoMCwgMiwgIi8vIikgPT0gMCkgewotICAgICAgLy8gc2tpcCBjb21tZW50cyBhbmQgZW1wdHkgbGluZXMKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIHN0cmluZyBkZWNsOwotICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2U7Ci0gICAgc3RyaW5nIGNsYXNzX25hbWU7Ci0gICAgaWYgKCFQYXJzZVByZXByb2Nlc3NlZExpbmUobGluZSwgJmRlY2wsICZwYWNrYWdlLCAmY2xhc3NfbmFtZSkpIHsKLSAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEFpZGxMb2NhdGlvbjo6UG9pbnQgcG9pbnQgPSB7LmxpbmUgPSBsaW5lbm8sIC5jb2x1bW4gPSAwIC8qY29sdW1uKi99OwotICAgIEFpZGxMb2NhdGlvbiBsb2NhdGlvbiA9IEFpZGxMb2NhdGlvbihmaWxlbmFtZSwgcG9pbnQsIHBvaW50LCBBaWRsTG9jYXRpb246OlNvdXJjZTo6RVhURVJOQUwpOwotCi0gICAgaWYgKGRlY2wgPT0gInBhcmNlbGFibGUiKSB7Ci0gICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvciBpcyB0cmVhdGVkIGFzIGEgYnVpbHQtaW4gdHlwZSwgYnV0IGl0J3MgYWxzbyBpbiB0aGUgZnJhbWV3b3JrLmFpZGwuCi0gICAgICAvLyBTbyBhaWRsIHNob3VsZCBpZ25vcmUgYnVpbHQtaW4gdHlwZXMgaW4gZnJhbWV3b3JrLmFpZGwgdG8gcHJldmVudCBkdXBsaWNhdGlvbi4KLSAgICAgIC8vIChiLzEzMDg5OTQ5MSkKLSAgICAgIGlmIChBaWRsVHlwZW5hbWVzOjpJc0J1aWx0aW5UeXBlbmFtZShjbGFzc19uYW1lKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIEFpZGxQYXJjZWxhYmxlKiBkb2MgPSBuZXcgQWlkbFBhcmNlbGFibGUobG9jYXRpb24sIGNsYXNzX25hbWUsIHBhY2thZ2UsIENvbW1lbnRze30pOwotICAgICAgdHlwZW5hbWVzLT5BZGRQcmVwcm9jZXNzZWRUeXBlKHVuaXF1ZV9wdHI8QWlkbFBhcmNlbGFibGU+KGRvYykpOwotICAgIH0gZWxzZSBpZiAoZGVjbCA9PSAic3RydWN0dXJlZF9wYXJjZWxhYmxlIikgewotICAgICAgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBkb2MgPQotICAgICAgICAgIG5ldyBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUobG9jYXRpb24sIGNsYXNzX25hbWUsIHBhY2thZ2UsIENvbW1lbnRze30sIG51bGxwdHIsIG51bGxwdHIpOwotICAgICAgdHlwZW5hbWVzLT5BZGRQcmVwcm9jZXNzZWRUeXBlKHVuaXF1ZV9wdHI8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlPihkb2MpKTsKLSAgICB9IGVsc2UgaWYgKGRlY2wgPT0gImludGVyZmFjZSIpIHsKLSAgICAgIEFpZGxJbnRlcmZhY2UqIGRvYyA9Ci0gICAgICAgICAgbmV3IEFpZGxJbnRlcmZhY2UobG9jYXRpb24sIGNsYXNzX25hbWUsIENvbW1lbnRze30sIGZhbHNlLCBwYWNrYWdlLCBudWxscHRyKTsKLSAgICAgIHR5cGVuYW1lcy0+QWRkUHJlcHJvY2Vzc2VkVHlwZSh1bmlxdWVfcHRyPEFpZGxJbnRlcmZhY2U+KGRvYykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgQUlETF9FUlJPUihmaWxlbmFtZSkgPDwgIiBvbiBsaW5lICIgPDwgbGluZW5vIDw8ICIgbWFsZm9ybWVkIHByZXByb2Nlc3NlZCBmaWxlIGxpbmU6ICciIDw8IGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyI7Ci0gIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQogQWlkbEVycm9yIGxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0X2ZpbGVfbmFtZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLCBBaWRsVHlwZW5hbWVzKiB0eXBlbmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogaW1wb3J0ZWRfZmlsZXMpIHsKQEAgLTQ3MSwxMiArMzk3LDEyIEBACiAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICAgLy8gUGFyc2UgdGhlIG1haW4gaW5wdXQgZmlsZQotICBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VyPiBtYWluX3BhcnNlciA9IFBhcnNlcjo6UGFyc2UoaW5wdXRfZmlsZV9uYW1lLCBpb19kZWxlZ2F0ZSwgKnR5cGVuYW1lcyk7Ci0gIGlmIChtYWluX3BhcnNlciA9PSBudWxscHRyKSB7CisgIGNvbnN0IEFpZGxEb2N1bWVudCogZG9jdW1lbnQgPSBQYXJzZXI6OlBhcnNlKGlucHV0X2ZpbGVfbmFtZSwgaW9fZGVsZWdhdGUsICp0eXBlbmFtZXMpOworICBpZiAoZG9jdW1lbnQgPT0gbnVsbHB0cikgewogICAgIHJldHVybiBBaWRsRXJyb3I6OlBBUlNFX0VSUk9SOwogICB9CiAgIGludCBudW1fdG9wX2xldmVsX2RlY2xzID0gMDsKLSAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogbWFpbl9wYXJzZXItPlBhcnNlZERvY3VtZW50KCkuRGVmaW5lZFR5cGVzKCkpIHsKKyAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogZG9jdW1lbnQtPkRlZmluZWRUeXBlcygpKSB7CiAgICAgaWYgKHR5cGUtPkFzVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpID09IG51bGxwdHIpIHsKICAgICAgIG51bV90b3BfbGV2ZWxfZGVjbHMrKzsKICAgICAgIGlmIChudW1fdG9wX2xldmVsX2RlY2xzID4gMSkgewpAQCAtNDg3LDQ1ICs0MTMsMzQgQEAKICAgfQogCiAgIC8vIEltcG9ydCB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUKLSAgZm9yIChjb25zdCBzdHJpbmcmIHMgOiBvcHRpb25zLlByZXByb2Nlc3NlZEZpbGVzKCkpIHsKLSAgICBpZiAoIXBhcnNlX3ByZXByb2Nlc3NlZF9maWxlKGlvX2RlbGVnYXRlLCBzLCB0eXBlbmFtZXMpKSB7Ci0gICAgICBlcnIgPSBBaWRsRXJyb3I6OkJBRF9QUkVfUFJPQ0VTU0VEX0ZJTEU7CisgIGZvciAoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSA6IG9wdGlvbnMuUHJlcHJvY2Vzc2VkRmlsZXMoKSkgeworICAgIGF1dG8gcHJlcHJvY2Vzc2VkID0gUGFyc2VyOjpQYXJzZShmaWxlbmFtZSwgaW9fZGVsZWdhdGUsICp0eXBlbmFtZXMsIC8qaXNfcHJlcHJvY2Vzc2VkPSovdHJ1ZSk7CisgICAgaWYgKCFwcmVwcm9jZXNzZWQpIHsKKyAgICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9QUkVfUFJPQ0VTU0VEX0ZJTEU7CiAgICAgfQogICB9Ci0gIGlmIChlcnIgIT0gQWlkbEVycm9yOjpPSykgewotICAgIHJldHVybiBlcnI7Ci0gIH0KIAogICAvLyBGaW5kIGZpbGVzIHRvIGltcG9ydCBhbmQgcGFyc2UgdGhlbQogICB2ZWN0b3I8c3RyaW5nPiBpbXBvcnRfcGF0aHM7Ci0gIEltcG9ydFJlc29sdmVyIGltcG9ydF9yZXNvbHZlcntpb19kZWxlZ2F0ZSwgaW5wdXRfZmlsZV9uYW1lLCBvcHRpb25zLkltcG9ydERpcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuSW5wdXRGaWxlcygpfTsKLSAgZm9yIChjb25zdCBhdXRvJiBpbXBvcnQgOiBtYWluX3BhcnNlci0+UGFyc2VkRG9jdW1lbnQoKS5JbXBvcnRzKCkpIHsKLSAgICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUoaW1wb3J0LT5HZXROZWVkZWRDbGFzcygpKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICh0eXBlbmFtZXMtPklzSWdub3JhYmxlSW1wb3J0KGltcG9ydC0+R2V0TmVlZGVkQ2xhc3MoKSkpIHsKKyAgSW1wb3J0UmVzb2x2ZXIgaW1wb3J0X3Jlc29sdmVye2lvX2RlbGVnYXRlLCBpbnB1dF9maWxlX25hbWUsIG9wdGlvbnMuSW1wb3J0RGlycygpfTsKKyAgZm9yIChjb25zdCBhdXRvJiBpbXBvcnQgOiBkb2N1bWVudC0+SW1wb3J0cygpKSB7CisgICAgaWYgKHR5cGVuYW1lcy0+SXNJZ25vcmFibGVJbXBvcnQoaW1wb3J0KSkgewogICAgICAgLy8gVGhlcmUgYXJlIHBsYWNlcyBpbiB0aGUgQW5kcm9pZCB0cmVlIHdoZXJlIGFuIGltcG9ydCBkb2Vzbid0IHJlc29sdmUsCiAgICAgICAvLyBidXQgd2UnbGwgcGljayB0aGUgdHlwZSB1cCB0aHJvdWdoIHRoZSBwcmVwcm9jZXNzZWQgdHlwZXMuCiAgICAgICAvLyBUaGlzIHNlZW1zIGxpa2UgYW4gZXJyb3IsIGJ1dCBsZWdhY3kgc3VwcG9ydCBkZW1hbmRzIHdlIHN1cHBvcnQgaXQuLi4KICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBzdHJpbmcgaW1wb3J0X3BhdGggPSBpbXBvcnRfcmVzb2x2ZXIuRmluZEltcG9ydEZpbGUoaW1wb3J0LT5HZXROZWVkZWRDbGFzcygpKTsKKyAgICBzdHJpbmcgaW1wb3J0X3BhdGggPSBpbXBvcnRfcmVzb2x2ZXIuRmluZEltcG9ydEZpbGUoaW1wb3J0KTsKICAgICBpZiAoaW1wb3J0X3BhdGguZW1wdHkoKSkgewotICAgICAgaWYgKHR5cGVuYW1lcy0+UmVzb2x2ZVR5cGVuYW1lKGltcG9ydC0+R2V0TmVlZGVkQ2xhc3MoKSkuaXNfcmVzb2x2ZWQpIHsKLSAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgdHlwZSBpcyBmcm9tIHRoZSBwcmVwcm9jZXNzZWQgYWlkbCBmaWxlLgotICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHVzZSB0aGUgdHlwZSBmcm9tIHByZXByb2Nlc3NlZCBhaWRsIGZpbGUKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBBSURMX0VSUk9SKGlucHV0X2ZpbGVfbmFtZSkgPDwgIkNvdWxkbid0IGZpbmQgaW1wb3J0IGZvciBjbGFzcyAiIDw8IGltcG9ydC0+R2V0TmVlZGVkQ2xhc3MoKTsKKyAgICAgIEFJRExfRVJST1IoaW5wdXRfZmlsZV9uYW1lKSA8PCAiQ291bGRuJ3QgZmluZCBpbXBvcnQgZm9yIGNsYXNzICIgPDwgaW1wb3J0OwogICAgICAgZXJyID0gQWlkbEVycm9yOjpCQURfSU1QT1JUOwogICAgICAgY29udGludWU7CiAgICAgfQogCiAgICAgaW1wb3J0X3BhdGhzLmVtcGxhY2VfYmFjayhpbXBvcnRfcGF0aCk7CiAKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VyPiBpbXBvcnRfcGFyc2VyID0gUGFyc2VyOjpQYXJzZShpbXBvcnRfcGF0aCwgaW9fZGVsZWdhdGUsICp0eXBlbmFtZXMpOwotICAgIGlmIChpbXBvcnRfcGFyc2VyID09IG51bGxwdHIpIHsKKyAgICBhdXRvIGltcG9ydGVkX2RvYyA9IFBhcnNlcjo6UGFyc2UoaW1wb3J0X3BhdGgsIGlvX2RlbGVnYXRlLCAqdHlwZW5hbWVzKTsKKyAgICBpZiAoaW1wb3J0ZWRfZG9jID09IG51bGxwdHIpIHsKICAgICAgIEFJRExfRVJST1IoaW1wb3J0X3BhdGgpIDw8ICJlcnJvciB3aGlsZSBpbXBvcnRpbmcgIiA8PCBpbXBvcnRfcGF0aCA8PCAiIGZvciAiIDw8IGltcG9ydDsKICAgICAgIGVyciA9IEFpZGxFcnJvcjo6QkFEX0lNUE9SVDsKICAgICAgIGNvbnRpbnVlOwpAQCAtNTM1LDUyICs0NTAsMzIgQEAKICAgICByZXR1cm4gZXJyOwogICB9CiAKLSAgZm9yIChjb25zdCBhdXRvJiBpbXBvcnRlZF9maWxlIDogb3B0aW9ucy5JbXBvcnRGaWxlcygpKSB7Ci0gICAgaW1wb3J0X3BhdGhzLmVtcGxhY2VfYmFjayhpbXBvcnRlZF9maWxlKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IGltcG9ydF9wYXJzZXIgPSBQYXJzZXI6OlBhcnNlKGltcG9ydGVkX2ZpbGUsIGlvX2RlbGVnYXRlLCAqdHlwZW5hbWVzKTsKLSAgICBpZiAoaW1wb3J0X3BhcnNlciA9PSBudWxscHRyKSB7Ci0gICAgICBBSURMX0VSUk9SKGltcG9ydGVkX2ZpbGUpIDw8ICJlcnJvciB3aGlsZSBpbXBvcnRpbmcgIiA8PCBpbXBvcnRlZF9maWxlOwotICAgICAgZXJyID0gQWlkbEVycm9yOjpCQURfSU1QT1JUOwotICAgICAgY29udGludWU7CisgIFR5cGVSZXNvbHZlciByZXNvbHZlciA9IFsmXShjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHNjb3BlLCBBaWRsVHlwZVNwZWNpZmllciogdHlwZSkgeworICAgIC8vIHJlc29sdmUgd2l0aCBhbHJlYWR5IGxvYWRlZCB0eXBlcworICAgIGlmICh0eXBlLT5SZXNvbHZlKCp0eXBlbmFtZXMsIHNjb3BlKSkgeworICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICB9Ci0gIGlmIChlcnIgIT0gQWlkbEVycm9yOjpPSykgewotICAgIHJldHVybiBlcnI7Ci0gIH0KLQotICBUeXBlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBbJl0oY29uc3QgQWlkbERvY3VtZW50KiBkb2MsIEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlKSB7Ci0gICAgaWYgKHR5cGUtPlJlc29sdmUoKnR5cGVuYW1lcykpIHJldHVybiB0cnVlOwotCi0gICAgY29uc3Qgc3RyaW5nIHVucmVzb2x2ZWRfbmFtZSA9IHR5cGUtPkdldFVucmVzb2x2ZWROYW1lKCk7Ci0gICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdHJpbmc+IGNhbm9uaWNhbF9uYW1lID0gZG9jLT5SZXNvbHZlTmFtZSh1bnJlc29sdmVkX25hbWUpOwotICAgIGlmICghY2Fub25pY2FsX25hbWUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY29uc3Qgc3RyaW5nIGltcG9ydF9wYXRoID0gaW1wb3J0X3Jlc29sdmVyLkZpbmRJbXBvcnRGaWxlKCpjYW5vbmljYWxfbmFtZSk7CisgICAgY29uc3Qgc3RyaW5nIGltcG9ydF9wYXRoID0gaW1wb3J0X3Jlc29sdmVyLkZpbmRJbXBvcnRGaWxlKHNjb3BlLT5SZXNvbHZlTmFtZSh0eXBlLT5HZXROYW1lKCkpKTsKICAgICBpZiAoaW1wb3J0X3BhdGguZW1wdHkoKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpbXBvcnRfcGF0aHMucHVzaF9iYWNrKGltcG9ydF9wYXRoKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IGltcG9ydF9wYXJzZXIgPSBQYXJzZXI6OlBhcnNlKGltcG9ydF9wYXRoLCBpb19kZWxlZ2F0ZSwgKnR5cGVuYW1lcyk7Ci0gICAgaWYgKGltcG9ydF9wYXJzZXIgPT0gbnVsbHB0cikgeworICAgIGF1dG8gaW1wb3J0ZWRfZG9jID0gUGFyc2VyOjpQYXJzZShpbXBvcnRfcGF0aCwgaW9fZGVsZWdhdGUsICp0eXBlbmFtZXMpOworICAgIGlmIChpbXBvcnRlZF9kb2MgPT0gbnVsbHB0cikgewogICAgICAgQUlETF9FUlJPUihpbXBvcnRfcGF0aCkgPDwgImVycm9yIHdoaWxlIGltcG9ydGluZyAiIDw8IGltcG9ydF9wYXRoIDw8ICIgZm9yICIgPDwgaW1wb3J0X3BhdGg7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmICghdHlwZS0+UmVzb2x2ZSgqdHlwZW5hbWVzKSkgeworCisgICAgLy8gbm93LCB0cnkgdG8gcmVzb2x2ZSBpdCBhZ2FpbgorICAgIGlmICghdHlwZS0+UmVzb2x2ZSgqdHlwZW5hbWVzLCBzY29wZSkpIHsKICAgICAgIEFJRExfRVJST1IodHlwZSkgPDwgIkNhbid0IHJlc29sdmUgIiA8PCB0eXBlLT5HZXROYW1lKCk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9OwotICBjb25zdCBib29sIGlzX2NoZWNrX2FwaSA9IG9wdGlvbnMuR2V0VGFzaygpID09IE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSTsKLSAgY29uc3QgYm9vbCBpc19kdW1wX2FwaSA9IG9wdGlvbnMuR2V0VGFzaygpID09IE9wdGlvbnM6OlRhc2s6OkRVTVBfQVBJOwogCi0gIC8vIFJlc29sdmUgdGhlIHVucmVzb2x2ZWQgdHlwZSByZWZlcmVuY2VzIGZvdW5kIGZyb20gdGhlIGlucHV0IGZpbGUKLSAgaWYgKCFpc19jaGVja19hcGkgJiYgIW1haW5fcGFyc2VyLT5SZXNvbHZlKHJlc29sdmVyKSkgewotICAgIC8vIFJlc29sdXRpb24gaXMgbm90IG5lZWQgZm9yIGNoZWNrIGFwaSBiZWNhdXNlIGFsbCB0eXBlc3BlY3MgYXJlCi0gICAgLy8gdXNpbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWVzLgorICAvLyBSZXNvbHZlIHRoZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMKKyAgaWYgKCFSZXNvbHZlUmVmZXJlbmNlcygqZG9jdW1lbnQsIHJlc29sdmVyKSkgewogICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9UWVBFOwogICB9CiAKQEAgLTU5MiwxNiArNDg3LDEwIEBACiAgIC8vIFZhbGlkYXRpb24gcGhhc2UKICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAvLyBGb3IgbGVnYWN5IHJlYXNvbnMsIGJ5IGRlZmF1bHQsIGNvbXBpbGluZyBhbiB1bnN0cnVjdHVyZWQgcGFyY2VsYWJsZSAod2hpY2ggY29udGFpbnMgbm8gb3V0cHV0KQotICAvLyBpcyBhbGxvd2VkLiBUaGlzIG11c3Qgbm90IGJlIHJldHVybmVkIGFzIGFuIGVycm9yIHVudGlsIHRoZSB2ZXJ5IGVuZCBvZiB0aGlzIHByb2NlZHVyZSBzaW5jZQotICAvLyB0aGlzIG1heSBiZSBjb25zaWRlcmVkIGEgc3VjY2VzcywgYW5kIHdlIHNob3VsZCBmaXJzdCBjaGVjayB0aGF0IHRoZXJlIGFyZSBub3Qgb3RoZXIsIG1vcmUKLSAgLy8gc2VyaW91cyBmYWlsdXJlcy4KLSAgYm9vbCBjb250YWluc191bnN0cnVjdHVyZWRfcGFyY2VsYWJsZSA9IGZhbHNlOwotCi0gIGNvbnN0IGF1dG8mIHR5cGVzID0gbWFpbl9wYXJzZXItPlBhcnNlZERvY3VtZW50KCkuRGVmaW5lZFR5cGVzKCk7CisgIGNvbnN0IGF1dG8mIHR5cGVzID0gZG9jdW1lbnQtPkRlZmluZWRUeXBlcygpOwogICBjb25zdCBpbnQgbnVtX2RlZmluZWRfdHlwZXMgPSB0eXBlcy5zaXplKCk7CiAgIGZvciAoY29uc3QgYXV0byYgZGVmaW5lZF90eXBlIDogdHlwZXMpIHsKLSAgICBBSURMX0ZBVEFMX0lGKGRlZmluZWRfdHlwZSA9PSBudWxscHRyLCBtYWluX3BhcnNlci0+RmlsZU5hbWUoKSk7CisgICAgQUlETF9GQVRBTF9JRihkZWZpbmVkX3R5cGUgPT0gbnVsbHB0ciwgZG9jdW1lbnQpOwogCiAgICAgLy8gRW5zdXJlIHR5cGUgaXMgZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgICBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBkZWZpbmVkX3R5cGUtPkFzSW50ZXJmYWNlKCk7CkBAIC02MjEsMTcgKzUxMCwxMiBAQAogICAgIHsKICAgICAgIGJvb2wgdmFsaWRfdHlwZSA9IHRydWU7CiAKLSAgICAgIGlmICghaXNfY2hlY2tfYXBpKSB7Ci0gICAgICAgIC8vIElkZWFsbHksIHdlIGNvdWxkIGRvIHRoaXMgZm9yIGNoZWNrIGFwaSwgYnV0IHdlIGNhbid0IHJlc29sdmUgaW1wb3J0cwotICAgICAgICBpZiAoIWRlZmluZWRfdHlwZS0+Q2hlY2tWYWxpZCgqdHlwZW5hbWVzKSkgewotICAgICAgICAgIHZhbGlkX3R5cGUgPSBmYWxzZTsKLSAgICAgICAgfQorICAgICAgaWYgKCFkZWZpbmVkX3R5cGUtPkNoZWNrVmFsaWQoKnR5cGVuYW1lcykpIHsKKyAgICAgICAgdmFsaWRfdHlwZSA9IGZhbHNlOwogICAgICAgfQogCi0gICAgICBpZiAoIWlzX2R1bXBfYXBpICYmICFpc19jaGVja19hcGkpIHsKLSAgICAgICAgaWYgKCFkZWZpbmVkX3R5cGUtPkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKCp0eXBlbmFtZXMsIG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSkpIHsKLSAgICAgICAgICB2YWxpZF90eXBlID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgIGlmICghZGVmaW5lZF90eXBlLT5MYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChvcHRpb25zLlRhcmdldExhbmd1YWdlKCkpKSB7CisgICAgICAgIHZhbGlkX3R5cGUgPSBmYWxzZTsKICAgICAgIH0KIAogICAgICAgaWYgKCF2YWxpZF90eXBlKSB7CkBAIC02NDAsMjEgKzUyNCwyMSBAQAogICAgIH0KIAogICAgIGlmICh1bnN0cnVjdHVyZWRfcGFyY2VsYWJsZSAhPSBudWxscHRyKSB7Ci0gICAgICBib29sIGlzU3RhYmxlID0gdW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUtPklzU3RhYmxlQXBpUGFyY2VsYWJsZShvcHRpb25zLlRhcmdldExhbmd1YWdlKCkpOworICAgICAgYXV0byBsYW5nID0gb3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpOworICAgICAgYm9vbCBpc1N0YWJsZSA9IHVuc3RydWN0dXJlZF9wYXJjZWxhYmxlLT5Jc1N0YWJsZUFwaVBhcmNlbGFibGUobGFuZyk7CiAgICAgICBpZiAob3B0aW9ucy5Jc1N0cnVjdHVyZWQoKSAmJiAhaXNTdGFibGUpIHsKICAgICAgICAgQUlETF9FUlJPUih1bnN0cnVjdHVyZWRfcGFyY2VsYWJsZSkKLSAgICAgICAgICAgIDw8ICJDYW5ub3QgZGVjbGFyZWQgcGFyY2VsYWJsZSBpbiBhIC0tc3RydWN0dXJlZCBpbnRlcmZhY2UuIFBhcmNlbGFibGUgbXVzdCBiZSBkZWZpbmVkICIKLSAgICAgICAgICAgICAgICJpbiBBSURMIGRpcmVjdGx5LiI7CisgICAgICAgICAgICA8PCAiQ2Fubm90IGRlY2xhcmUgdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGUgaW4gYSAtLXN0cnVjdHVyZWQgaW50ZXJmYWNlLiBQYXJjZWxhYmxlICIKKyAgICAgICAgICAgICAgICJtdXN0IGJlIGRlZmluZWQgaW4gQUlETCBkaXJlY3RseS4iOwogICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpOT1RfU1RSVUNUVVJFRDsKICAgICAgIH0KLSAgICAgIGlmIChvcHRpb25zLkZhaWxPblBhcmNlbGFibGUoKSkgeworICAgICAgaWYgKG9wdGlvbnMuRmFpbE9uUGFyY2VsYWJsZSgpIHx8IGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESyB8fAorICAgICAgICAgIGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpIHsKICAgICAgICAgQUlETF9FUlJPUih1bnN0cnVjdHVyZWRfcGFyY2VsYWJsZSkKICAgICAgICAgICAgIDw8ICJSZWZ1c2luZyB0byBnZW5lcmF0ZSBjb2RlIHdpdGggdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzLiBEZWNsYXJlZCBwYXJjZWxhYmxlcyAiCiAgICAgICAgICAgICAgICAic2hvdWxkIGJlIGluIHRoZWlyIG93biBmaWxlIGFuZC9vciBjYW5ub3QgYmUgdXNlZCB3aXRoIC0tc3RydWN0dXJlZCBpbnRlcmZhY2VzLiI7Ci0gICAgICAgIC8vIENvbnRpbnVlIHBhcnNpbmcgZm9yIG1vcmUgZXJyb3JzCisgICAgICAgIHJldHVybiBBaWRsRXJyb3I6OkZPVU5EX1BBUkNFTEFCTEU7CiAgICAgICB9Ci0KLSAgICAgIGNvbnRhaW5zX3Vuc3RydWN0dXJlZF9wYXJjZWxhYmxlID0gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAoZGVmaW5lZF90eXBlLT5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKQEAgLTY3Miw1OCArNTU2LDc4IEBACiAgICAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBBaWRsRXJyb3I6Ok5PVF9TVFJVQ1RVUkVEOwogICAgIH0KIAorICAgIC8vIFZlcmlmeSB0aGUgdmFyL2NvbnN0IGRlY2xhcmF0aW9ucy4KKyAgICAvLyBjb25zdCBleHByZXNzaW9ucyBzaG91bGQgYmUgbm9uLWVtcHR5IHdoZW4gZXZhbHVhdGVkIHdpdGggdGhlIHZhci9jb25zdCB0eXBlLgorICAgIGZvciAoY29uc3QgYXV0byYgY29uc3RhbnQgOiBkZWZpbmVkX3R5cGUtPkdldENvbnN0YW50RGVjbGFyYXRpb25zKCkpIHsKKyAgICAgIGlmIChjb25zdGFudC0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEFpZGxFcnJvcjo6QkFEX1RZUEU7CisgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdmFyIDogZGVmaW5lZF90eXBlLT5HZXRGaWVsZHMoKSkgeworICAgICAgaWYgKHZhci0+R2V0RGVmYXVsdFZhbHVlKCkgJiYgdmFyLT5WYWx1ZVN0cmluZyhBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcikuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBBZGQgbWV0YSBtZXRob2RzIGFuZCBhc3NpZ24gbWV0aG9kIElEcyB0byBlYWNoIGludGVyZmFjZQorICB0eXBlbmFtZXMtPkl0ZXJhdGVUeXBlcyhbJl0oY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CisgICAgYXV0byBpbnRlcmZhY2UgPSBjb25zdF9jYXN0PEFpZGxJbnRlcmZhY2UqPih0eXBlLkFzSW50ZXJmYWNlKCkpOwogICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgewogICAgICAgLy8gYWRkIHRoZSBtZXRhLW1ldGhvZCAnaW50IGdldEludGVyZmFjZVZlcnNpb24oKScgaWYgdmVyc2lvbiBpcyBzcGVjaWZpZWQuCiAgICAgICBpZiAob3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7Ci0gICAgICAgIEFpZGxUeXBlU3BlY2lmaWVyKiByZXQgPQotICAgICAgICAgICAgbmV3IEFpZGxUeXBlU3BlY2lmaWVyKEFJRExfTE9DQVRJT05fSEVSRSwgImludCIsIGZhbHNlLCBudWxscHRyLCBDb21tZW50c3t9KTsKLSAgICAgICAgcmV0LT5SZXNvbHZlKCp0eXBlbmFtZXMpOworICAgICAgICBhdXRvIHJldCA9IHR5cGVuYW1lcy0+TWFrZVJlc29sdmVkVHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCBmYWxzZSk7CiAgICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4+KiBhcmdzID0gbmV3IHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4+KCk7CiAgICAgICAgIGF1dG8gbWV0aG9kID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsTWV0aG9kPigKLSAgICAgICAgICAgIEFJRExfTE9DQVRJT05fSEVSRSwgZmFsc2UsIHJldCwgImdldEludGVyZmFjZVZlcnNpb24iLCBhcmdzLCBDb21tZW50c3t9LAorICAgICAgICAgICAgQUlETF9MT0NBVElPTl9IRVJFLCBmYWxzZSwgcmV0LnJlbGVhc2UoKSwgImdldEludGVyZmFjZVZlcnNpb24iLCBhcmdzLCBDb21tZW50c3t9LAogICAgICAgICAgICAga0dldEludGVyZmFjZVZlcnNpb25JZCwgZmFsc2UgLyogaXNfdXNlcl9kZWZpbmVkICovKTsKICAgICAgICAgaW50ZXJmYWNlLT5BZGRNZXRob2Qoc3RkOjptb3ZlKG1ldGhvZCkpOwogICAgICAgfQogICAgICAgLy8gYWRkIHRoZSBtZXRhLW1ldGhvZCAnc3RyaW5nIGdldEludGVyZmFjZUhhc2goKScgaWYgaGFzaCBpcyBzcGVjaWZpZWQuCiAgICAgICBpZiAoIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICAgICAgQWlkbFR5cGVTcGVjaWZpZXIqIHJldCA9Ci0gICAgICAgICAgICBuZXcgQWlkbFR5cGVTcGVjaWZpZXIoQUlETF9MT0NBVElPTl9IRVJFLCAiU3RyaW5nIiwgZmFsc2UsIG51bGxwdHIsIENvbW1lbnRze30pOwotICAgICAgICByZXQtPlJlc29sdmUoKnR5cGVuYW1lcyk7CisgICAgICAgIGF1dG8gcmV0ID0gdHlwZW5hbWVzLT5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIlN0cmluZyIsIGZhbHNlKTsKICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50Pj4qIGFyZ3MgPSBuZXcgdmVjdG9yPHVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50Pj4oKTsKICAgICAgICAgYXV0byBtZXRob2QgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxNZXRob2Q+KAotICAgICAgICAgICAgQUlETF9MT0NBVElPTl9IRVJFLCBmYWxzZSwgcmV0LCBrR2V0SW50ZXJmYWNlSGFzaCwgYXJncywgQ29tbWVudHN7fSwKKyAgICAgICAgICAgIEFJRExfTE9DQVRJT05fSEVSRSwgZmFsc2UsIHJldC5yZWxlYXNlKCksIGtHZXRJbnRlcmZhY2VIYXNoLCBhcmdzLCBDb21tZW50c3t9LAogICAgICAgICAgICAga0dldEludGVyZmFjZUhhc2hJZCwgZmFsc2UgLyogaXNfdXNlcl9kZWZpbmVkICovKTsKICAgICAgICAgaW50ZXJmYWNlLT5BZGRNZXRob2Qoc3RkOjptb3ZlKG1ldGhvZCkpOwogICAgICAgfQotICAgICAgaWYgKCFjaGVja19hbmRfYXNzaWduX21ldGhvZF9pZHMoaW50ZXJmYWNlLT5HZXRNZXRob2RzKCkpKSB7Ci0gICAgICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9NRVRIT0RfSUQ7CisgICAgICBpZiAoIUNoZWNrQW5kQXNzaWduTWV0aG9kSURzKGludGVyZmFjZS0+R2V0TWV0aG9kcygpKSkgeworICAgICAgICBlcnIgPSBBaWRsRXJyb3I6OkJBRF9NRVRIT0RfSUQ7CiAgICAgICB9CiAgICAgfQotICAgIC8vIFZlcmlmeSB0aGUgdmFyL2NvbnN0IGRlY2xhcmF0aW9ucy4KLSAgICAvLyBjb25zdCBleHByZXNzaW9ucyBzaG91bGQgYmUgbm9uLWVtcHR5IHdoZW4gZXZhbHVhdGVkIHdpdGggdGhlIHZhci9jb25zdCB0eXBlLgotICAgIGlmICghaXNfY2hlY2tfYXBpKSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0YW50IDogZGVmaW5lZF90eXBlLT5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7Ci0gICAgICAgIGlmIChjb25zdGFudC0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmVtcHR5KCkpIHsKLSAgICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChjb25zdCBhdXRvJiB2YXIgOiBkZWZpbmVkX3R5cGUtPkdldEZpZWxkcygpKSB7Ci0gICAgICAgIGlmICh2YXItPkdldERlZmF1bHRWYWx1ZSgpICYmIHZhci0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmVtcHR5KCkpIHsKLSAgICAgICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KKyAgfSk7CisgIGlmIChlcnIgIT0gQWlkbEVycm9yOjpPSykgeworICAgIHJldHVybiBlcnI7CiAgIH0KIAotICBpZiAoIVZhbGlkYXRlQW5ub3RhdGlvbkNvbnRleHQobWFpbl9wYXJzZXItPlBhcnNlZERvY3VtZW50KCkpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZG9jIDogdHlwZW5hbWVzLT5BbGxEb2N1bWVudHMoKSkgeworICAgIFZpc2l0VG9wRG93bihbXShjb25zdCBBaWRsTm9kZSYgbikgeyBuLk1hcmtWaXNpdGVkKCk7IH0sICpkb2MpOworICB9CisKKyAgaWYgKCFDaGVja1ZhbGlkKCpkb2N1bWVudCwgb3B0aW9ucykpIHsKICAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKICAgfQogCi0gIGlmICghaXNfY2hlY2tfYXBpICYmICFEaWFnbm9zZShtYWluX3BhcnNlci0+UGFyc2VkRG9jdW1lbnQoKSwgb3B0aW9ucy5HZXREaWFnbm9zdGljTWFwcGluZygpKSkgeworICBpZiAoIVZhbGlkYXRlQW5ub3RhdGlvbkNvbnRleHQoKmRvY3VtZW50KSkgeworICAgIHJldHVybiBBaWRsRXJyb3I6OkJBRF9UWVBFOworICB9CisKKyAgaWYgKChvcHRpb25zLlRhcmdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCB8fAorICAgICAgIG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSA9PSBPcHRpb25zOjpMYW5ndWFnZTo6TkRLKSAmJgorICAgICAgIVZhbGlkYXRlQ3BwSGVhZGVyKCpkb2N1bWVudCkpIHsKKyAgICByZXR1cm4gQWlkbEVycm9yOjpCQURfVFlQRTsKKyAgfQorCisgIGlmICghRGlhZ25vc2UoKmRvY3VtZW50LCBvcHRpb25zLkdldERpYWdub3N0aWNNYXBwaW5nKCkpKSB7CiAgICAgcmV0dXJuIEFpZGxFcnJvcjo6QkFEX1RZUEU7CiAgIH0KIAogICB0eXBlbmFtZXMtPkl0ZXJhdGVUeXBlcyhbJl0oY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CisgICAgaWYgKCF0eXBlLkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSkpIHsKKyAgICAgIGVyciA9IEFpZGxFcnJvcjo6QkFEX1RZUEU7CisgICAgfQorCiAgICAgaWYgKG9wdGlvbnMuSXNTdHJ1Y3R1cmVkKCkgJiYgdHlwZS5Bc1Vuc3RydWN0dXJlZFBhcmNlbGFibGUoKSAhPSBudWxscHRyICYmCiAgICAgICAgICF0eXBlLkFzVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpLT5Jc1N0YWJsZUFwaVBhcmNlbGFibGUob3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpKSkgewogICAgICAgZXJyID0gQWlkbEVycm9yOjpOT1RfU1RSVUNUVVJFRDsKQEAgLTc3NywxNyArNjgxLDEyIEBACiAgICAgKmltcG9ydGVkX2ZpbGVzID0gaW1wb3J0X3BhdGhzOwogICB9CiAKLSAgaWYgKGNvbnRhaW5zX3Vuc3RydWN0dXJlZF9wYXJjZWxhYmxlKSB7Ci0gICAgLy8gQ29uc2lkZXJlZCBhIHN1Y2Nlc3MgZm9yIHRoZSBsZWdhY3kgY2FzZSwgc28gdGhpcyBtdXN0IGJlIHJldHVybmVkIGxhc3QuCi0gICAgcmV0dXJuIEFpZGxFcnJvcjo6Rk9VTkRfUEFSQ0VMQUJMRTsKLSAgfQotCiAgIHJldHVybiBBaWRsRXJyb3I6Ok9LOwogfQogCiB9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbHMKIAotaW50IGNvbXBpbGVfYWlkbChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworYm9vbCBjb21waWxlX2FpZGwoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKICAgY29uc3QgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZyA9IG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKTsKICAgZm9yIChjb25zdCBzdHJpbmcmIGlucHV0X2ZpbGUgOiBvcHRpb25zLklucHV0RmlsZXMoKSkgewogICAgIEFpZGxUeXBlbmFtZXMgdHlwZW5hbWVzOwpAQCAtNzk2LDkgKzY5NSw4IEBACiAKICAgICBBaWRsRXJyb3IgYWlkbF9lcnIgPSBpbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoaW5wdXRfZmlsZSwgb3B0aW9ucywgaW9fZGVsZWdhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlbmFtZXMsICZpbXBvcnRlZF9maWxlcyk7Ci0gICAgYm9vbCBhbGxvd0Vycm9yID0gYWlkbF9lcnIgPT0gQWlkbEVycm9yOjpGT1VORF9QQVJDRUxBQkxFICYmICFvcHRpb25zLkZhaWxPblBhcmNlbGFibGUoKTsKLSAgICBpZiAoYWlkbF9lcnIgIT0gQWlkbEVycm9yOjpPSyAmJiAhYWxsb3dFcnJvcikgewotICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGFpZGxfZXJyICE9IEFpZGxFcnJvcjo6T0spIHsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRlZmluZWRfdHlwZSA6IHR5cGVuYW1lcy5NYWluRG9jdW1lbnQoKS5EZWZpbmVkVHlwZXMoKSkgewpAQCAtODA5LDEzICs3MDcsMTMgQEAKICAgICAgIGlmIChvdXRwdXRfZmlsZV9uYW1lLmVtcHR5KCkgJiYgIW9wdGlvbnMuT3V0cHV0RGlyKCkuZW1wdHkoKSkgewogICAgICAgICBvdXRwdXRfZmlsZV9uYW1lID0gR2V0T3V0cHV0RmlsZVBhdGgob3B0aW9ucywgKmRlZmluZWRfdHlwZSk7CiAgICAgICAgIGlmIChvdXRwdXRfZmlsZV9uYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgaWYgKCF3cml0ZV9kZXBfZmlsZShvcHRpb25zLCAqZGVmaW5lZF90eXBlLCBpbXBvcnRlZF9maWxlcywgaW9fZGVsZWdhdGUsIGlucHV0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlX25hbWUpKSB7Ci0gICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAKICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwpAQCAtODMwLDIxICs3MjgsMjEgQEAKICAgICAgICAgICAvLyBMZWdhY3kgYmVoYXZpb3IuIEZvciBwYXJjZWxhYmxlIGRlY2xhcmF0aW9ucyBpbiBKYXZhLCBkb24ndCBnZW5lcmF0ZSBvdXRwdXQgZmlsZS4KICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWNjZXNzID0gamF2YTo6Z2VuZXJhdGVfamF2YShvdXRwdXRfZmlsZV9uYW1lLCBkZWZpbmVkX3R5cGUuZ2V0KCksIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19kZWxlZ2F0ZSwgb3B0aW9ucyk7CisgICAgICAgICAgamF2YTo6R2VuZXJhdGVKYXZhKG91dHB1dF9maWxlX25hbWUsIG9wdGlvbnMsIHR5cGVuYW1lcywgKmRlZmluZWRfdHlwZSwgaW9fZGVsZWdhdGUpOworICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpIHsKLSAgICAgICAgc3VjY2VzcyA9IHJ1c3Q6OkdlbmVyYXRlUnVzdChvdXRwdXRfZmlsZV9uYW1lLCBkZWZpbmVkX3R5cGUuZ2V0KCksIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgICAgIHJ1c3Q6OkdlbmVyYXRlUnVzdChvdXRwdXRfZmlsZV9uYW1lLCBvcHRpb25zLCB0eXBlbmFtZXMsICpkZWZpbmVkX3R5cGUsIGlvX2RlbGVnYXRlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICBBSURMX0ZBVEFMKGlucHV0X2ZpbGUpIDw8ICJTaG91bGQgbm90IHJlYWNoIGhlcmUuIjsKICAgICAgIH0KICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KICAgfQotICByZXR1cm4gMDsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgZHVtcF9tYXBwaW5ncyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewpAQCAtODU5LDcgKzc1Nyw3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgZGVmaW5lZF90eXBlIDogdHlwZW5hbWVzLk1haW5Eb2N1bWVudCgpLkRlZmluZWRUeXBlcygpKSB7Ci0gICAgICBhdXRvIG1hcHBpbmdzID0gbWFwcGluZ3M6OmdlbmVyYXRlX21hcHBpbmdzKGRlZmluZWRfdHlwZS5nZXQoKSwgdHlwZW5hbWVzKTsKKyAgICAgIGF1dG8gbWFwcGluZ3MgPSBtYXBwaW5nczo6Z2VuZXJhdGVfbWFwcGluZ3MoZGVmaW5lZF90eXBlLmdldCgpKTsKICAgICAgIGFsbF9tYXBwaW5ncy5pbnNlcnQobWFwcGluZ3MuYmVnaW4oKSwgbWFwcGluZ3MuZW5kKCkpOwogICAgIH0KICAgfQpAQCAtODcyLDU4ICs3NzAsNTYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgcHJlcHJvY2Vzc19haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihvcHRpb25zLk91dHB1dEZpbGUoKSk7CitpbnQgYWlkbF9lbnRyeShjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICBBaWRsRXJyb3JMb2c6OmNsZWFyRXJyb3IoKTsKKyAgQWlkbE5vZGU6OkNsZWFyVW52aXNpdGVkTm9kZXMoKTsKIAotICBmb3IgKGNvbnN0IGF1dG8mIGZpbGUgOiBvcHRpb25zLklucHV0RmlsZXMoKSkgewotICAgIEFpZGxUeXBlbmFtZXMgdHlwZW5hbWVzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IHAgPSBQYXJzZXI6OlBhcnNlKGZpbGUsIGlvX2RlbGVnYXRlLCB0eXBlbmFtZXMpOwotICAgIGlmIChwID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgIGlmIChvcHRpb25zLk9rKCkpIHsKKyAgICBzd2l0Y2ggKG9wdGlvbnMuR2V0VGFzaygpKSB7CisgICAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkhFTFA6CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT3B0aW9uczo6VGFzazo6Q09NUElMRToKKyAgICAgICAgc3VjY2VzcyA9IGFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPcHRpb25zOjpUYXNrOjpQUkVQUk9DRVNTOgorICAgICAgICBzdWNjZXNzID0gYW5kcm9pZDo6YWlkbDo6UHJlcHJvY2VzcyhvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPcHRpb25zOjpUYXNrOjpEVU1QX0FQSToKKyAgICAgICAgc3VjY2VzcyA9IGFuZHJvaWQ6OmFpZGw6OmR1bXBfYXBpKG9wdGlvbnMsIGlvX2RlbGVnYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSToKKyAgICAgICAgc3VjY2VzcyA9IGFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPcHRpb25zOjpUYXNrOjpEVU1QX01BUFBJTkdTOgorICAgICAgICBzdWNjZXNzID0gYW5kcm9pZDo6YWlkbDo6ZHVtcF9tYXBwaW5ncyhvcHRpb25zLCBpb19kZWxlZ2F0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgQUlETF9GQVRBTChBSURMX0xPQ0FUSU9OX0hFUkUpCisgICAgICAgICAgICA8PCAiVW5yZWNvZ25pemVkIHRhc2s6ICIgPDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihvcHRpb25zLkdldFRhc2soKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEFJRExfRVJST1Iob3B0aW9ucy5HZXRFcnJvck1lc3NhZ2UoKSkgPDwgb3B0aW9ucy5HZXRVc2FnZSgpOworICB9CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRlZmluZWRfdHlwZSA6IHAtPlBhcnNlZERvY3VtZW50KCkuRGVmaW5lZFR5cGVzKCkpIHsKLSAgICAgIGlmICghd3JpdGVyLT5Xcml0ZSgiJXMgJXM7XG4iLCBkZWZpbmVkX3R5cGUtPkdldFByZXByb2Nlc3NEZWNsYXJhdGlvbk5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWRfdHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpLmNfc3RyKCkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgYm9vbCByZXBvcnRlZEVycm9yID0gQWlkbEVycm9yTG9nOjpoYWRFcnJvcigpOworICBBSURMX0ZBVEFMX0lGKHN1Y2Nlc3MgPT0gcmVwb3J0ZWRFcnJvciwgQUlETF9MT0NBVElPTl9IRVJFKQorICAgICAgPDwgIkNvbXBpbGVyIHJldHVybmVkIHN1Y2Nlc3MgIiA8PCBzdWNjZXNzIDw8ICIgYnV0IGRpZCIgPDwgKHJlcG9ydGVkRXJyb3IgPyAiIiA6ICIgbm90IikKKyAgICAgIDw8ICIgZW1pdCBlcnJvciBsb2dzIjsKKworICBpZiAoc3VjY2VzcykgeworICAgIGF1dG8gbG9jYXRpb25zID0gQWlkbE5vZGU6OkdldExvY2F0aW9uc09mVW52aXNpdGVkTm9kZXMoKTsKKyAgICBpZiAoIWxvY2F0aW9ucy5lbXB0eSgpKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxvY2F0aW9uIDogbG9jYXRpb25zKSB7CisgICAgICAgIEFJRExfRVJST1IobG9jYXRpb24pIDw8ICJBaWRsTm9kZSBhdCBsb2NhdGlvbiB3YXMgbm90IHZpc2l0ZWQhIjsKICAgICAgIH0KKyAgICAgIEFJRExfRkFUQUwoQUlETF9MT0NBVElPTl9IRVJFKQorICAgICAgICAgIDw8ICJUaGUgQUlETCBBU1Qgd2FzIG5vdCBwcm9jZXNzZWQgZnVsbHkuIFBsZWFzZSByZXBvcnQgYW4gaXNzdWUuIjsKICAgICB9CiAgIH0KIAotICByZXR1cm4gd3JpdGVyLT5DbG9zZSgpOwotfQotCi1pbnQgYWlkbF9lbnRyeShjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBBaWRsRXJyb3JMb2c6OmNsZWFyRXJyb3IoKTsKLQotICBpbnQgcmV0ID0gMTsKLSAgc3dpdGNoIChvcHRpb25zLkdldFRhc2soKSkgewotICAgIGNhc2UgT3B0aW9uczo6VGFzazo6Q09NUElMRToKLSAgICAgIHJldCA9IGFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OlBSRVBST0NFU1M6Ci0gICAgICByZXQgPSBhbmRyb2lkOjphaWRsOjpwcmVwcm9jZXNzX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGUpID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkRVTVBfQVBJOgotICAgICAgcmV0ID0gYW5kcm9pZDo6YWlkbDo6ZHVtcF9hcGkob3B0aW9ucywgaW9fZGVsZWdhdGUpID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSToKLSAgICAgIHJldCA9IGFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zLCBpb19kZWxlZ2F0ZSkgPyAwIDogMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT3B0aW9uczo6VGFzazo6RFVNUF9NQVBQSU5HUzoKLSAgICAgIHJldCA9IGFuZHJvaWQ6OmFpZGw6OmR1bXBfbWFwcGluZ3Mob3B0aW9ucywgaW9fZGVsZWdhdGUpID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQUlETF9GQVRBTChBSURMX0xPQ0FUSU9OX0hFUkUpCi0gICAgICAgICAgPDwgIlVucmVjb2duaXplZCB0YXNrOiAiIDw8IHN0YXRpY19jYXN0PHNpemVfdD4ob3B0aW9ucy5HZXRUYXNrKCkpOwotICB9Ci0KLSAgLy8gY29tcGlsZXIgaW52YXJpYW50cwotICBjb25zdCBib29sIHNob3VsZFJlcG9ydEVycm9yID0gcmV0ICE9IDA7Ci0gIGNvbnN0IGJvb2wgcmVwb3J0ZWRFcnJvciA9IEFpZGxFcnJvckxvZzo6aGFkRXJyb3IoKTsKLSAgQUlETF9GQVRBTF9JRihzaG91bGRSZXBvcnRFcnJvciAhPSByZXBvcnRlZEVycm9yLCBBSURMX0xPQ0FUSU9OX0hFUkUpCi0gICAgICA8PCAiQ29tcGlsZXIgcmV0dXJuZWQgZXJyb3IgIiA8PCByZXQgPDwgIiBidXQgZGlkIiA8PCAocmVwb3J0ZWRFcnJvciA/ICIiIDogIiBub3QiKQotICAgICAgPDwgIiBlbWl0IGVycm9yIGxvZ3MiOwotCi0gIHJldHVybiByZXQ7CisgIHJldHVybiBzdWNjZXNzID8gMCA6IDE7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9haWRsLmggYi9haWRsLmgKaW5kZXggMWZmOGQ0Ni4uMmQxNWMwNiAxMDA2NDQKLS0tIGEvYWlkbC5oCisrKyBiL2FpZGwuaApAQCAtNDUsOCArNDUsNyBAQAogICBPSyA9IDAsCiB9OwogCi1pbnQgY29tcGlsZV9haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKLWJvb2wgcHJlcHJvY2Vzc19haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKK2Jvb2wgY29tcGlsZV9haWRsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKIGJvb2wgZHVtcF9tYXBwaW5ncyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSk7CiAKIC8vIG1haW4gZW50cnkgcG9pbnQgdG8gQUlETApAQCAtODIsOSArODEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIEFpZGxUeXBlbmFtZXMqIHR5cGVuYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBpbXBvcnRlZF9maWxlcyk7CiAKLWJvb2wgcGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGUoY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyogdHlwZW5hbWVzKTsKLQogfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWxzCiAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xLy5oYXNoIGIvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMS8uaGFzaAppbmRleCAzNGQ4ZWM2Li5kZmRiMjQ5IDEwMDY0NAotLS0gYS9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8xLy5oYXNoCisrKyBiL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLzEvLmhhc2gKQEAgLTEgKzEsMiBAQAorZjIxMWY3ODIzYzgyNzkyMjQ0MzRmNWI5YTBiMDk1YzFmNWViZmMxNQogOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YgpkaWZmIC0tZ2l0IGEvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsIGIvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCmluZGV4IGRhZDA1ZTYuLjY4MzY0ZDggMTAwNjQ0Ci0tLSBhL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbAorKysgYi9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIC8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgogCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHM7CitASmF2YVN1cHByZXNzTGludCh2YWx1ZT17Ik5ld0FwaSJ9KQogcGFyY2VsYWJsZSBGb28gewotICBpbnQgaW50RGVmYXVsdDQyID0gNDI7CisgICAgaW50IGludERlZmF1bHQ0MiA9IDQyOwogfQpkaWZmIC0tZ2l0IGEvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbCBiL2FpZGxfYXBpL2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmFpZGwKaW5kZXggMDFkZjMxMC4uNjAyYzg5MiAxMDA2NDQKLS0tIGEvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbAorKysgYi9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsCkBAIC0xNywxMCArMTcsMTUgQEAKIC8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgogCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHM7CitASmF2YURlbGVnYXRvcgogaW50ZXJmYWNlIElGb29JbnRlcmZhY2UgewotICB2b2lkIG9yaWdpbmFsQXBpKCk7Ci0gIEB1dGY4SW5DcHAgU3RyaW5nIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKGluIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24gdSk7Ci0gIEBTdXBwcmVzc1dhcm5pbmdzKHZhbHVlPXsiaW5vdXQtcGFyYW1ldGVyIn0pIGludCBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChpbiBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbkZvbywgaW5vdXQgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gaW5vdXRGb28sIG91dCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBvdXRGb28sIGludCB2YWx1ZSk7Ci0gIGludCByZXR1cm5zTGVuZ3RoT2ZGb29BcnJheShpbiBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvb1tdIGZvb3MpOwotICB2b2lkIG5ld0FwaSgpOworICAgIHZvaWQgb3JpZ2luYWxBcGkoKTsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZygKKyAgICAgICAgICAgIGluIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24gdSk7CisgICAgQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJpbm91dC1wYXJhbWV0ZXIifSkKKyAgICBpbnQgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoaW4gYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gaW5Gb28sCisgICAgICAgICAgICBpbm91dCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbm91dEZvbywKKyAgICAgICAgICAgIG91dCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBvdXRGb28sIGludCB2YWx1ZSk7CisgICAgaW50IHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGluIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gZm9vcyk7CisgICAgdm9pZCBuZXdBcGkoKTsKIH0KZGlmZiAtLWdpdCBhL2FpZGxfY2hlY2thcGkuY3BwIGIvYWlkbF9jaGVja2FwaS5jcHAKaW5kZXggNDc3MzNjMS4uYzFkM2M2NiAxMDA2NDQKLS0tIGEvYWlkbF9jaGVja2FwaS5jcHAKKysrIGIvYWlkbF9jaGVja2FwaS5jcHAKQEAgLTQxLDE4ICs0MSwxMCBAQAogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnZlY3RvcjsKIAotc3RydWN0IER1bXBGb3JFcXVhbGl0eVZpc2l0b3IgOiBEdW1wVmlzaXRvciB7Ci0gIER1bXBGb3JFcXVhbGl0eVZpc2l0b3IoQ29kZVdyaXRlciYgb3V0KSA6IER1bXBWaXNpdG9yKG91dCkge30KLQotICB2b2lkIER1bXBDb25zdGFudFZhbHVlKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiwgY29uc3QgQWlkbENvbnN0YW50VmFsdWUmIGMpIHsKLSAgICBvdXQgPDwgYy5MaXRlcmFsKCk7Ci0gIH0KLX07Ci0KIHN0YXRpYyBzdGQ6OnN0cmluZyBEdW1wKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgewogICBzdHJpbmcgY29kZTsKICAgQ29kZVdyaXRlclB0ciBvdXQgPSBDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvZGUpOwotICBEdW1wRm9yRXF1YWxpdHlWaXNpdG9yIHZpc2l0b3IoKm91dCk7CisgIER1bXBWaXNpdG9yIHZpc2l0b3IoKm91dCk7CiAgIHR5cGUuRGlzcGF0Y2hWaXNpdCh2aXNpdG9yKTsKICAgb3V0LT5DbG9zZSgpOwogICByZXR1cm4gY29kZTsKQEAgLTg2LDcgKzc4LDEwIEBACiAgICAgICBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6TlVMTEFCTEUsCiAgICAgICAvLyBASmF2YURlcml2ZSBkb2Vzbid0IGFmZmVjdCByZWFkL3dyaXRlCiAgICAgICBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9ERVJJVkUsCisgICAgICBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9ERUZBVUxULAorICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfREVMRUdBVE9SLAogICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfT05MWV9JTU1VVEFCTEUsCisgICAgICBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9TVVBQUkVTU19MSU5ULAogICAgICAgLy8gQEJhY2tpbmcgZm9yIGEgZW51bSB0eXBlIGlzIGNoZWNrZWQgYnkgdGhlIGVudW0gY2hlY2tlcgogICAgICAgQWlkbEFubm90YXRpb246OlR5cGU6OkJBQ0tJTkcsCiAgICAgICAvLyBAUnVzdERlcml2ZSBkb2Vzbid0IGFmZmVjdCByZWFkL3dyaXRlCkBAIC05NCwxMSArODksMTEgQEAKICAgICAgIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpTVVBQUkVTU19XQVJOSU5HUywKICAgfTsKICAgdmVjdG9yPHN0cmluZz4gYW5ub3RhdGlvbnM7Ci0gIGZvciAoY29uc3QgQWlkbEFubm90YXRpb24mIGFubm90YXRpb24gOiBub2RlLkdldEFubm90YXRpb25zKCkpIHsKLSAgICBpZiAoa0lnbm9yZUFubm90YXRpb25zLmZpbmQoYW5ub3RhdGlvbi5HZXRUeXBlKCkpICE9IGtJZ25vcmVBbm5vdGF0aW9ucy5lbmQoKSkgeworICBmb3IgKGNvbnN0IGF1dG8mIGFubm90YXRpb24gOiBub2RlLkdldEFubm90YXRpb25zKCkpIHsKKyAgICBpZiAoa0lnbm9yZUFubm90YXRpb25zLmZpbmQoYW5ub3RhdGlvbi0+R2V0VHlwZSgpKSAhPSBrSWdub3JlQW5ub3RhdGlvbnMuZW5kKCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBhdXRvIGFubm90YXRpb25fc3RyaW5nID0gYW5ub3RhdGlvbi5Ub1N0cmluZygpOworICAgIGF1dG8gYW5ub3RhdGlvbl9zdHJpbmcgPSBhbm5vdGF0aW9uLT5Ub1N0cmluZygpOwogICAgIC8vIGFkZGluZyBARGVwcmVjYXRlZCAod2l0aCBvcHRpb25hbCBhcmdzKSBpcyBva2F5CiAgICAgaWYgKFN0YXJ0c1dpdGgoYW5ub3RhdGlvbl9zdHJpbmcsICJASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249XCJARGVwcmVjYXRlZCIpKSB7CiAgICAgICBjb250aW51ZTsKQEAgLTE1NCw4ICsxNDksOCBAQAogICAgIGNvbnN0IGF1dG8gbmV3X2MgPSBmb3VuZC0+c2Vjb25kOwogICAgIGNvbXBhdGlibGUgJj0gYXJlX2NvbXBhdGlibGVfdHlwZXMob2xkX2MtPkdldFR5cGUoKSwgbmV3X2MtPkdldFR5cGUoKSk7CiAKLSAgICBjb25zdCBzdHJpbmcgb2xkX3ZhbHVlID0gb2xkX2MtPkdldFZhbHVlKCkuTGl0ZXJhbCgpOwotICAgIGNvbnN0IHN0cmluZyBuZXdfdmFsdWUgPSBuZXdfYy0+R2V0VmFsdWUoKS5MaXRlcmFsKCk7CisgICAgY29uc3Qgc3RyaW5nIG9sZF92YWx1ZSA9IG9sZF9jLT5WYWx1ZVN0cmluZyhBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CisgICAgY29uc3Qgc3RyaW5nIG5ld192YWx1ZSA9IG5ld19jLT5WYWx1ZVN0cmluZyhBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgICAgaWYgKG9sZF92YWx1ZSAhPSBuZXdfdmFsdWUpIHsKICAgICAgIEFJRExfRVJST1IobmV3ZXIpIDw8ICJDaGFuZ2VkIGNvbnN0YW50IHZhbHVlOiAiIDw8IG9sZGVyLkdldENhbm9uaWNhbE5hbWUoKSA8PCAiLiIKICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG9sZF9jLT5HZXROYW1lKCkgPDwgIiBmcm9tICIgPDwgb2xkX3ZhbHVlIDw8ICIgdG8gIiA8PCBuZXdfdmFsdWUgPDwgIi4iOwpAQCAtMjI3LDIxICsyMjIsMTQgQEAKIHN0YXRpYyBib29sIEhhc1plcm9FbnVtZXJhdG9yKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgewogICByZXR1cm4gc3RkOjphbnlfb2YoZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkuYmVnaW4oKSwgZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICBbJl0oY29uc3QgdW5pcXVlX3B0cjxBaWRsRW51bWVyYXRvcj4mIGVudW1lcmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudW1lcmF0b3ItPkdldFZhbHVlKCktPkxpdGVyYWwoKSA9PSAiMCI7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhdG9yLT5HZXRWYWx1ZSgpLT5WYWx1ZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpID09ICIwIjsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogfQogCi1zdGF0aWMgYm9vbCBFdmFsdWF0ZXNUb1plcm8oY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09ICIiKSByZXR1cm4gdHJ1ZTsKLSAgLy8gQmVjYXVzZSAtLWNoZWNrX2FwaSBydW5zIHdpdGggInZhbGlkIiBBSURMIGRlZmluaXRpb25zLCB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0Ci0gIC8vIHRoZSB2YWx1ZSBpcyBmb3JtYXR0ZWQgYXMgPHNjb3BlPi48ZW51bWVyYXRvcj4uCi0gIGF1dG8gZW51bWVyYXRvcl9uYW1lID0gdmFsdWUuc3Vic3RyKHZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7Ci0gIGZvciAoY29uc3QgYXV0byYgZW51bWVyYXRvciA6IGVudW1fZGVjbC5HZXRFbnVtZXJhdG9ycygpKSB7Ci0gICAgaWYgKGVudW1lcmF0b3ItPkdldE5hbWUoKSA9PSBlbnVtZXJhdG9yX25hbWUpIHsKLSAgICAgIHJldHVybiBlbnVtZXJhdG9yLT5HZXRWYWx1ZSgpLT5MaXRlcmFsKCkgPT0gIjAiOwotICAgIH0KLSAgfQotICBBSURMX0ZBVEFMKGVudW1fZGVjbCkgPDwgIkNhbid0IGZpbmQgIiA8PCBlbnVtZXJhdG9yX25hbWUgPDwgIiBpbiAiIDw8IGVudW1fZGVjbC5HZXROYW1lKCk7CitzdGF0aWMgYm9vbCBFdmFsdWF0ZXNUb1plcm8oY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLCBjb25zdCBBaWRsQ29uc3RhbnRWYWx1ZSogdmFsdWUpIHsKKyAgaWYgKHZhbHVlID09IG51bGxwdHIpIHJldHVybiB0cnVlOworICByZXR1cm4gdmFsdWUtPlZhbHVlU3RyaW5nKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcikgPT0gIjAiOwogfQogCiBzdGF0aWMgYm9vbCBhcmVfY29tcGF0aWJsZV9wYXJjZWxhYmxlcyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIG9sZGVyLCBjb25zdCBBaWRsVHlwZW5hbWVzJiwKQEAgLTI3NywxNSArMjY1LDE0IEBACiAgICAgY29uc3QgYXV0byYgbmV3X2ZpZWxkID0gbmV3X2ZpZWxkcy5hdChpKTsKICAgICBjb21wYXRpYmxlICY9IGFyZV9jb21wYXRpYmxlX3R5cGVzKG9sZF9maWVsZC0+R2V0VHlwZSgpLCBuZXdfZmllbGQtPkdldFR5cGUoKSk7CiAKLSAgICBzdHJpbmcgb2xkX3ZhbHVlID0gb2xkX2ZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKSA/IG9sZF9maWVsZC0+R2V0RGVmYXVsdFZhbHVlKCktPkxpdGVyYWwoKSA6ICIiOwotICAgIHN0cmluZyBuZXdfdmFsdWUgPSBuZXdfZmllbGQtPkdldERlZmF1bHRWYWx1ZSgpID8gbmV3X2ZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKS0+TGl0ZXJhbCgpIDogIiI7Ci0KKyAgICBjb25zdCBzdHJpbmcgb2xkX3ZhbHVlID0gb2xkX2ZpZWxkLT5WYWx1ZVN0cmluZyhBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CisgICAgY29uc3Qgc3RyaW5nIG5ld192YWx1ZSA9IG5ld19maWVsZC0+VmFsdWVTdHJpbmcoQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwogICAgIGlmIChvbGRfdmFsdWUgPT0gbmV3X3ZhbHVlKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgLy8gRm9yIGVudW0gdHlwZSBmaWVsZHMsIHdlIGFjY2VwdCBzZXR0aW5nIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgInplcm8iCiAgICAgYXV0byBlbnVtX2RlY2wgPSBuZXdfdHlwZXMuR2V0RW51bURlY2xhcmF0aW9uKG5ld19maWVsZC0+R2V0VHlwZSgpKTsKLSAgICBpZiAob2xkX3ZhbHVlID09ICIiICYmIGVudW1fZGVjbCAmJiBFdmFsdWF0ZXNUb1plcm8oKmVudW1fZGVjbCwgbmV3X3ZhbHVlKSkgeworICAgIGlmIChvbGRfdmFsdWUgPT0gIiIgJiYgZW51bV9kZWNsICYmIEV2YWx1YXRlc1RvWmVybygqZW51bV9kZWNsLCBuZXdfZmllbGQtPkdldERlZmF1bHRWYWx1ZSgpKSkgewogICAgICAgY29udGludWU7CiAgICAgfQogCkBAIC0zOTAsOCArMzc3LDEwIEBACiAgICAgICBjb21wYXRpYmxlID0gZmFsc2U7CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgY29uc3Qgc3RyaW5nIG9sZF92YWx1ZSA9IG9sZF9lbnVtX21hcFtuYW1lXS0+TGl0ZXJhbCgpOwotICAgIGNvbnN0IHN0cmluZyBuZXdfdmFsdWUgPSBuZXdfZW51bV9tYXBbbmFtZV0tPkxpdGVyYWwoKTsKKyAgICBjb25zdCBzdHJpbmcgb2xkX3ZhbHVlID0KKyAgICAgICAgb2xkX2VudW1fbWFwW25hbWVdLT5WYWx1ZVN0cmluZyhvbGRlci5HZXRCYWNraW5nVHlwZSgpLCBBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CisgICAgY29uc3Qgc3RyaW5nIG5ld192YWx1ZSA9CisgICAgICAgIG5ld19lbnVtX21hcFtuYW1lXS0+VmFsdWVTdHJpbmcobmV3ZXIuR2V0QmFja2luZ1R5cGUoKSwgQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwogICAgIGlmIChvbGRfdmFsdWUgIT0gbmV3X3ZhbHVlKSB7CiAgICAgICBBSURMX0VSUk9SKG5ld2VyKSA8PCAiQ2hhbmdlZCBlbnVtZXJhdG9yIHZhbHVlOiAiIDw8IG9sZGVyLkdldENhbm9uaWNhbE5hbWUoKSA8PCAiOjoiIDw8IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZnJvbSAiIDw8IG9sZF92YWx1ZSA8PCAiIHRvICIgPDwgbmV3X3ZhbHVlIDw8ICIuIjsKQEAgLTQwMSw4ICszOTAsOCBAQAogICByZXR1cm4gY29tcGF0aWJsZTsKIH0KIAotc3RhdGljIFJlc3VsdDxBaWRsVHlwZW5hbWVzPiBsb2FkX2Zyb21fZGlyKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIpIHsKK3N0YXRpYyBSZXN1bHQ8QWlkbFR5cGVuYW1lcz4gTG9hZEFwaUR1bXAoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIpIHsKICAgUmVzdWx0PHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gZGlyX2ZpbGVzID0gaW9fZGVsZWdhdGUuTGlzdEZpbGVzKGRpcik7CiAgIGlmICghZGlyX2ZpbGVzLm9rKCkpIHsKICAgICBBSURMX0VSUk9SKGRpcikgPDwgZGlyX2ZpbGVzLmVycm9yKCk7CkBAIC00MTIsNyArNDAxLDkgQEAKICAgQWlkbFR5cGVuYW1lcyB0eXBlbmFtZXM7CiAgIGZvciAoY29uc3QgYXV0byYgZmlsZSA6ICpkaXJfZmlsZXMpIHsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKGZpbGUsICIuYWlkbCIpKSBjb250aW51ZTsKLSAgICBpZiAoaW50ZXJuYWxzOjpsb2FkX2FuZF92YWxpZGF0ZV9haWRsKGZpbGUsIG9wdGlvbnMsIGlvX2RlbGVnYXRlLCAmdHlwZW5hbWVzLAorICAgIC8vIGN1cnJlbnQgImRpciIgaXMgYWRkZWQgdG8gImltcG9ydHMiIHNvIHRoYXQgcmVmZXJlbmNlZC5haWRsIGZpbGVzIGluIHRoZSBjdXJyZW50CisgICAgLy8gbW9kdWxlIGFyZSBhdmFpbGFibGUgd2hlbiByZXNvbHZpbmcgcmVmZXJlbmNlcy4KKyAgICBpZiAoaW50ZXJuYWxzOjpsb2FkX2FuZF92YWxpZGF0ZV9haWRsKGZpbGUsIG9wdGlvbnMuUGx1c0ltcG9ydERpcihkaXIpLCBpb19kZWxlZ2F0ZSwgJnR5cGVuYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogaW1wb3J0ZWRfZmlsZXMgKi8pICE9IEFpZGxFcnJvcjo6T0spIHsKICAgICAgIEFJRExfRVJST1IoZmlsZSkgPDwgIkZhaWxlZCB0byByZWFkLiI7CiAgICAgICByZXR1cm4gRXJyb3IoKTsKQEAgLTQyNywxOSArNDE4LDMxIEBACiAgIEFJRExfRkFUQUxfSUYob3B0aW9ucy5JbnB1dEZpbGVzKCkuc2l6ZSgpICE9IDIsIEFJRExfTE9DQVRJT05fSEVSRSkKICAgICAgIDw8ICItLWNoZWNrYXBpIHJlcXVpcmVzIHR3byBpbnB1dHMgIgogICAgICAgPDwgImJ1dCBnb3QgIiA8PCBvcHRpb25zLklucHV0RmlsZXMoKS5zaXplKCk7Ci0gIGF1dG8gb2xkX3RucyA9IGxvYWRfZnJvbV9kaXIob3B0aW9ucywgaW9fZGVsZWdhdGUsIG9wdGlvbnMuSW5wdXRGaWxlcygpLmF0KDApKTsKKyAgYXV0byBvbGRfdG5zID0gTG9hZEFwaUR1bXAob3B0aW9ucywgaW9fZGVsZWdhdGUsIG9wdGlvbnMuSW5wdXRGaWxlcygpLmF0KDApKTsKICAgaWYgKCFvbGRfdG5zLm9rKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgYXV0byBuZXdfdG5zID0gbG9hZF9mcm9tX2RpcihvcHRpb25zLCBpb19kZWxlZ2F0ZSwgb3B0aW9ucy5JbnB1dEZpbGVzKCkuYXQoMSkpOworICBhdXRvIG5ld190bnMgPSBMb2FkQXBpRHVtcChvcHRpb25zLCBpb19kZWxlZ2F0ZSwgb3B0aW9ucy5JbnB1dEZpbGVzKCkuYXQoMSkpOwogICBpZiAoIW5ld190bnMub2soKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIGNvbnN0IE9wdGlvbnM6OkNoZWNrQXBpTGV2ZWwgbGV2ZWwgPSBvcHRpb25zLkdldENoZWNrQXBpTGV2ZWwoKTsKIAotICBzdGQ6OnZlY3RvcjxBaWRsRGVmaW5lZFR5cGUqPiBvbGRfdHlwZXMgPSBvbGRfdG5zLT5BbGxEZWZpbmVkVHlwZXMoKTsKLSAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gbmV3X3R5cGVzID0gbmV3X3Rucy0+QWxsRGVmaW5lZFR5cGVzKCk7CisgIC8vIFdlIGRvbid0IGNoZWNrIGltcG90ZWQgdHlwZXMuCisgIGF1dG8gZ2V0X3R5cGVzX2luID0gW10oY29uc3QgQWlkbFR5cGVuYW1lcyYgdG5zLCBjb25zdCBzdGQ6OnN0cmluZyYgbG9jYXRpb24pIHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBBaWRsRGVmaW5lZFR5cGUqPiB0eXBlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiB0bnMuQWxsRGVmaW5lZFR5cGVzKCkpIHsKKyAgICAgIGlmIChTdGFydHNXaXRoKHR5cGUtPkdldExvY2F0aW9uKCkuR2V0RmlsZSgpLCBsb2NhdGlvbikpIHsKKyAgICAgICAgdHlwZXMucHVzaF9iYWNrKHR5cGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHlwZXM7CisgIH07CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IG9sZF90eXBlcyA9CisgICAgICBnZXRfdHlwZXNfaW4oKm9sZF90bnMsIG9wdGlvbnMuSW5wdXRGaWxlcygpLmF0KDApKTsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbERlZmluZWRUeXBlKj4gbmV3X3R5cGVzID0KKyAgICAgIGdldF90eXBlc19pbigqbmV3X3Rucywgb3B0aW9ucy5JbnB1dEZpbGVzKCkuYXQoMSkpOwogCiAgIGJvb2wgY29tcGF0aWJsZSA9IHRydWU7CiAKQEAgLTQ1OCw3ICs0NjEsNyBAQAogICAgIH0KICAgfQogCi0gIG1hcDxzdHJpbmcsIEFpZGxEZWZpbmVkVHlwZSo+IG5ld19tYXA7CisgIG1hcDxzdHJpbmcsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IG5ld19tYXA7CiAgIGZvciAoY29uc3QgYXV0byB0IDogbmV3X3R5cGVzKSB7CiAgICAgbmV3X21hcC5lbXBsYWNlKHQtPkdldENhbm9uaWNhbE5hbWUoKSwgdCk7CiAgIH0KZGlmZiAtLWdpdCBhL2FpZGxfY29uc3RfZXhwcmVzc2lvbnMuY3BwIGIvYWlkbF9jb25zdF9leHByZXNzaW9ucy5jcHAKaW5kZXggYjliNjJlYS4uZWVlYjE0YiAxMDA2NDQKLS0tIGEvYWlkbF9jb25zdF9leHByZXNzaW9ucy5jcHAKKysrIGIvYWlkbF9jb25zdF9leHByZXNzaW9ucy5jcHAKQEAgLTI0Miw2ICsyNDIsMTIgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgYm9vbCBpc1ZhbGlkTGl0ZXJhbENoYXIoY2hhciBjKSB7CisgIHJldHVybiAhKGMgPD0gMHgxZiB8fCAgLy8gY29udHJvbCBjaGFyYWN0ZXJzIGFyZSA8IDB4MjAKKyAgICAgICAgICAgYyA+PSAweDdmIHx8ICAvLyBERUwgaXMgMHg3ZgorICAgICAgICAgICBjID09ICdcXCcpOyAgIC8vIERpc2FsbG93IGJhY2tzbGFzaGVzIGZvciBmdXR1cmUgcHJvb2ZpbmcuCit9CisKIGJvb2wgUGFyc2VGbG9hdGluZyhzdGQ6OnN0cmluZ192aWV3IHN2LCBkb3VibGUqIHBhcnNlZCkgewogICAvLyBmbG9hdCBsaXRlcmFsIHNob3VsZCBiZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5LgogICBhbmRyb2lkOjpiYXNlOjpDb25zdW1lU3VmZml4KCZzdiwgImYiKTsKQEAgLTI3Myw2ICsyNzksMTEgQEAKIAogYm9vbCBBaWRsQmluYXJ5Q29uc3RFeHByZXNzaW9uOjpBcmVDb21wYXRpYmxlVHlwZXMoVHlwZSB0MSwgVHlwZSB0MikgewogICBzd2l0Y2ggKHQxKSB7CisgICAgY2FzZSBUeXBlOjpBUlJBWToKKyAgICAgIGlmICh0MiA9PSBUeXBlOjpBUlJBWSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVHlwZTo6U1RSSU5HOgogICAgICAgaWYgKHQyID09IFR5cGU6OlNUUklORykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM1Myw2ICszNjQsMTkgQEAKIAogQWlkbENvbnN0YW50VmFsdWUqIEFpZGxDb25zdGFudFZhbHVlOjpDaGFyYWN0ZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzdGF0aWMgY29uc3QgY2hhcioga1plcm9TdHJpbmcgPSAiJ1xcMCciOworCisgIC8vIFdlIHNob3VsZCBoYXZlIGJldHRlciBzdXBwb3J0cyBmb3IgZXNjYXBlcyBpbiB0aGUgZnV0dXJlLCBidXQgZm9yIG5vdworICAvLyBhbGxvdyBvbmx5IHdoYXQgaXMgbmVlZGVkIGZvciBkZWZhdWx0cy4KKyAgaWYgKHZhbHVlICE9IGtaZXJvU3RyaW5nKSB7CisgICAgQUlETF9GQVRBTF9JRih2YWx1ZS5zaXplKCkgIT0gMyB8fCB2YWx1ZVswXSAhPSAnXCcnIHx8IHZhbHVlWzJdICE9ICdcJycsIGxvY2F0aW9uKSA8PCB2YWx1ZTsKKworICAgIGlmICghaXNWYWxpZExpdGVyYWxDaGFyKHZhbHVlWzFdKSkgeworICAgICAgQUlETF9FUlJPUihsb2NhdGlvbikgPDwgIkludmFsaWQgY2hhcmFjdGVyIGxpdGVyYWwgIiA8PCB2YWx1ZVsxXTsKKyAgICAgIHJldHVybiBuZXcgQWlkbENvbnN0YW50VmFsdWUobG9jYXRpb24sIFR5cGU6OkVSUk9SLCB2YWx1ZSk7CisgICAgfQorICB9CisKICAgcmV0dXJuIG5ldyBBaWRsQ29uc3RhbnRWYWx1ZShsb2NhdGlvbiwgVHlwZTo6Q0hBUkFDVEVSLCB2YWx1ZSk7CiB9CiAKQEAgLTM3MSw4ICszOTUsMTUgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBjb25zdCBib29sIGlzTG9uZyA9IEVuZHNXaXRoKHZhbHVlLCAnbCcpIHx8IEVuZHNXaXRoKHZhbHVlLCAnTCcpOwotICBjb25zdCBzdGQ6OnN0cmluZyB2YWx1ZV9zdWJzdHIgPSBpc0xvbmcgPyB2YWx1ZS5zdWJzdHIoMCwgdmFsdWUuc2l6ZSgpIC0gMSkgOiB2YWx1ZTsKKyAgc3RkOjpzdHJpbmdfdmlldyB2YWx1ZV92aWV3ID0gdmFsdWU7CisgIGNvbnN0IGJvb2wgaXNfYnl0ZSA9IENvbnN1bWVTdWZmaXgoJnZhbHVlX3ZpZXcsICJ1OCIpOworICBjb25zdCBib29sIGlzX2xvbmcgPSBDb25zdW1lU3VmZml4KCZ2YWx1ZV92aWV3LCAibCIpIHx8IENvbnN1bWVTdWZmaXgoJnZhbHVlX3ZpZXcsICJMIik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHZhbHVlX3N1YnN0ciA9IHN0ZDo6c3RyaW5nKHZhbHVlX3ZpZXcpOworCisgICpwYXJzZWRfdmFsdWUgPSAwOworICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpFUlJPUjsKKworICBpZiAoaXNfYnl0ZSAmJiBpc19sb25nKSByZXR1cm4gZmFsc2U7CiAKICAgaWYgKElzSGV4KHZhbHVlKSkgewogICAgIC8vIEFJREwgY29uc2lkZXJzICdjb25zdCBpbnQgZm9vID0gMHhmZmZmZmZmZicgYXMgLTEsIGJ1dCBpZiB3ZSB3YW50IHRvCkBAIC0zODYsMjggKzQxNywzOCBAQAogICAgIC8vIE5vdGUsIGZvciBoaXN0b3JpY2FsIGNvbnNpc3RlbmN5LCB3ZSBuZWVkIHRvIGNvbnNpZGVyIHNtYWxsIGhleCB2YWx1ZXMKICAgICAvLyBhcyBhbiBpbnRlZ3JhbCB0eXBlLiBSZWNvZ25pemluZyB0aGVtIGFzIElOVDggY291bGQgYnJlYWsgc29tZSBmaWxlcywKICAgICAvLyBldmVuIHRob3VnaCBpdCB3b3VsZCBzaW1wbGlmeSB0aGlzIGNvZGUuCi0gICAgaWYgKHVpbnQzMl90IHJhd1ZhbHVlMzI7Ci0gICAgICAgICFpc0xvbmcgJiYgYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50PHVpbnQzMl90Pih2YWx1ZV9zdWJzdHIsICZyYXdWYWx1ZTMyKSkgewotICAgICAgKnBhcnNlZF92YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHJhd1ZhbHVlMzIpOworICAgIGlmIChpc19ieXRlKSB7CisgICAgICB1aW50OF90IHJhd192YWx1ZTg7CisgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludDx1aW50OF90Pih2YWx1ZV9zdWJzdHIsICZyYXdfdmFsdWU4KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAqcGFyc2VkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50OF90PihyYXdfdmFsdWU4KTsKKyAgICAgICpwYXJzZWRfdHlwZSA9IFR5cGU6OklOVDg7CisgICAgfSBlbHNlIGlmICh1aW50MzJfdCByYXdfdmFsdWUzMjsKKyAgICAgICAgICAgICAgICFpc19sb25nICYmIGFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludDx1aW50MzJfdD4odmFsdWVfc3Vic3RyLCAmcmF3X3ZhbHVlMzIpKSB7CisgICAgICAqcGFyc2VkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmF3X3ZhbHVlMzIpOwogICAgICAgKnBhcnNlZF90eXBlID0gVHlwZTo6SU5UMzI7Ci0gICAgfSBlbHNlIGlmICh1aW50NjRfdCByYXdWYWx1ZTY0OyBhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQ8dWludDY0X3Q+KHZhbHVlX3N1YnN0ciwgJnJhd1ZhbHVlNjQpKSB7Ci0gICAgICAqcGFyc2VkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmF3VmFsdWU2NCk7CisgICAgfSBlbHNlIGlmICh1aW50NjRfdCByYXdfdmFsdWU2NDsKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludDx1aW50NjRfdD4odmFsdWVfc3Vic3RyLCAmcmF3X3ZhbHVlNjQpKSB7CisgICAgICAqcGFyc2VkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmF3X3ZhbHVlNjQpOwogICAgICAgKnBhcnNlZF90eXBlID0gVHlwZTo6SU5UNjQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICpwYXJzZWRfdmFsdWUgPSAwOwotICAgICAgKnBhcnNlZF90eXBlID0gVHlwZTo6RVJST1I7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludDxpbnQ2NF90Pih2YWx1ZV9zdWJzdHIsIHBhcnNlZF92YWx1ZSkpIHsKLSAgICAqcGFyc2VkX3ZhbHVlID0gMDsKLSAgICAqcGFyc2VkX3R5cGUgPSBUeXBlOjpFUlJPUjsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBpZiAoaXNMb25nKSB7CisgIGlmIChpc19ieXRlKSB7CisgICAgaWYgKCpwYXJzZWRfdmFsdWUgPiBVSU5UOF9NQVggfHwgKnBhcnNlZF92YWx1ZSA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKnBhcnNlZF92YWx1ZSA9IHN0YXRpY19jYXN0PGludDhfdD4oKnBhcnNlZF92YWx1ZSk7CisgICAgKnBhcnNlZF90eXBlID0gVHlwZTo6SU5UODsKKyAgfSBlbHNlIGlmIChpc19sb25nKSB7CiAgICAgKnBhcnNlZF90eXBlID0gVHlwZTo6SU5UNjQ7CiAgIH0gZWxzZSB7CiAgICAgLy8gZ3Vlc3MgbGl0ZXJhbCB0eXBlLgpAQCAtNDM4LDE0ICs0NzksMjcgQEAKIEFpZGxDb25zdGFudFZhbHVlKiBBaWRsQ29uc3RhbnRWYWx1ZTo6QXJyYXkoCiAgICAgY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgc3RkOjp1bmlxdWVfcHRyPHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4+IHZhbHVlcykgewogICBBSURMX0ZBVEFMX0lGKHZhbHVlcyA9PSBudWxscHRyLCBsb2NhdGlvbik7CisgIC8vIFJlY29uc3RydWN0IGxpdGVyYWwgdmFsdWUKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cl92YWx1ZXM7CiAgIGZvciAoY29uc3QgYXV0byYgdiA6ICp2YWx1ZXMpIHsKICAgICBzdHJfdmFsdWVzLnB1c2hfYmFjayh2LT52YWx1ZV8pOwogICB9Ci0gIHJldHVybiBuZXcgQWlkbENvbnN0YW50VmFsdWUobG9jYXRpb24sIFR5cGU6OkFSUkFZLCBzdGQ6Om1vdmUodmFsdWVzKSwgSm9pbihzdHJfdmFsdWVzLCAiLCAiKSk7CisgIHJldHVybiBuZXcgQWlkbENvbnN0YW50VmFsdWUobG9jYXRpb24sIFR5cGU6OkFSUkFZLCBzdGQ6Om1vdmUodmFsdWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyIgKyBKb2luKHN0cl92YWx1ZXMsICIsICIpICsgIn0iKTsKIH0KIAogQWlkbENvbnN0YW50VmFsdWUqIEFpZGxDb25zdGFudFZhbHVlOjpTdHJpbmcoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBBSURMX0ZBVEFMX0lGKHZhbHVlLnNpemUoKSA9PSAwLCAiSWYgdGhpcyBpcyB1bnF1b3RlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGluZGV4IGxvZyIpOworICBBSURMX0ZBVEFMX0lGKHZhbHVlWzBdICE9ICdcIicsICJJZiB0aGlzIGlzIHVucXVvdGVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW5kZXggbG9nIik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7CisgICAgaWYgKCFpc1ZhbGlkTGl0ZXJhbENoYXIodmFsdWVbaV0pKSB7CisgICAgICBBSURMX0VSUk9SKGxvY2F0aW9uKSA8PCAiRm91bmQgaW52YWxpZCBjaGFyYWN0ZXIgJyIgPDwgdmFsdWVbaV0gPDwgIicgYXQgaW5kZXggIiA8PCBpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiBzdHJpbmcgY29uc3RhbnQgJyIgPDwgdmFsdWUgPDwgIiciOworICAgICAgcmV0dXJuIG5ldyBBaWRsQ29uc3RhbnRWYWx1ZShsb2NhdGlvbiwgVHlwZTo6RVJST1IsIHZhbHVlKTsKKyAgICB9CisgIH0KKwogICByZXR1cm4gbmV3IEFpZGxDb25zdGFudFZhbHVlKGxvY2F0aW9uLCBUeXBlOjpTVFJJTkcsIHZhbHVlKTsKIH0KIApAQCAtNDcwLDcgKzUyNCw3IEBACiAgIH0KIAogICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsKLSAgaWYgKGRlZmluZWRfdHlwZSAmJiAhdHlwZS5Jc0FycmF5KCkpIHsKKyAgaWYgKGRlZmluZWRfdHlwZSAmJiBmaW5hbF90eXBlXyAhPSBUeXBlOjpBUlJBWSkgewogICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKICAgICBpZiAoIWVudW1fdHlwZSkgewogICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiSW52YWxpZCB0eXBlICgiIDw8IGRlZmluZWRfdHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpCkBAIC00ODUsNyArNTM5LDcgQEAKICAgICByZXR1cm4gZGVjb3JhdG9yKHR5cGUsIHZhbHVlXyk7CiAgIH0KIAotICBjb25zdCBzdHJpbmcmIHR5cGVfc3RyaW5nID0gdHlwZS5HZXROYW1lKCk7CisgIGNvbnN0IHN0cmluZyYgdHlwZV9zdHJpbmcgPSB0eXBlLlNpZ25hdHVyZSgpOwogICBpbnQgZXJyID0gMDsKIAogICBzd2l0Y2ggKGZpbmFsX3R5cGVfKSB7CkBAIC01MzQsOCArNTg4LDEwIEBACiAgICAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwogCiAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogdmFsdWVzXykgewotICAgICAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYXJyYXlfYmFzZSA9IHR5cGUuQXJyYXlCYXNlKCk7Ci0gICAgICAgIGNvbnN0IHN0cmluZyB2YWx1ZV9zdHJpbmcgPSB2YWx1ZS0+VmFsdWVTdHJpbmcoYXJyYXlfYmFzZSwgZGVjb3JhdG9yKTsKKyAgICAgICAgc3RyaW5nIHZhbHVlX3N0cmluZzsKKyAgICAgICAgdHlwZS5WaWV3QXNBcnJheUJhc2UoWyZdKGNvbnN0IGF1dG8mIGJhc2VfdHlwZSkgeworICAgICAgICAgIHZhbHVlX3N0cmluZyA9IHZhbHVlLT5WYWx1ZVN0cmluZyhiYXNlX3R5cGUsIGRlY29yYXRvcik7CisgICAgICAgIH0pOwogICAgICAgICBpZiAodmFsdWVfc3RyaW5nLmVtcHR5KCkpIHsKICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgYnJlYWs7CkBAIC01NDYsOCArNjAyLDE3IEBACiAgICAgICAgIGVyciA9IC0xOwogICAgICAgICBicmVhazsKICAgICAgIH0KLQotICAgICAgcmV0dXJuIGRlY29yYXRvcih0eXBlLCAieyIgKyBKb2luKHZhbHVlX3N0cmluZ3MsICIsICIpICsgIn0iKTsKKyAgICAgIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgICAgICBhdXRvIHNpemUgPQorICAgICAgICAgICAgc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KHR5cGUuR2V0QXJyYXkoKSkuZGltZW5zaW9ucy5mcm9udCgpLT5FdmFsdWF0ZWRWYWx1ZTxpbnQzMl90PigpOworICAgICAgICBpZiAodmFsdWVzXy5zaXplKCkgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplKSkgeworICAgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkV4cGVjdGVkIGFuIGFycmF5IG9mICIgPDwgc2l6ZSA8PCAiIGVsZW1lbnRzLCBidXQgZm91bmQgb25lIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWVzXy5zaXplKCkgPDwgIiBlbGVtZW50cyI7CisgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBkZWNvcmF0b3IodHlwZSwgdmFsdWVfc3RyaW5ncyk7CiAgICAgfQogICAgIGNhc2UgVHlwZTo6RkxPQVRJTkc6IHsKICAgICAgIGlmICh0eXBlX3N0cmluZyA9PSAiZG91YmxlIikgewpAQCAtNTc3LDcgKzY0Miw4IEBACiAgIH0KIAogICBBSURMX0ZBVEFMX0lGKGVyciA9PSAwLCB0aGlzKTsKLSAgQUlETF9FUlJPUih0aGlzKSA8PCAiSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgIiA8PCBUb1N0cmluZyhmaW5hbF90eXBlXykgPDwgIjogIiA8PCB0eXBlX3N0cmluZzsKKyAgQUlETF9FUlJPUih0aGlzKSA8PCAiSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgIiA8PCBUb1N0cmluZyhmaW5hbF90eXBlXykgPDwgIjogIiA8PCB0eXBlX3N0cmluZworICAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgdmFsdWVfIDw8ICIpIjsKICAgcmV0dXJuICIiOwogfQogCkBAIC02MTMsNiArNjc5LDE0IEBACiAgIHJldHVybiB0cnVlOwogfQogCitib29sIEFpZGxDb25zdGFudFZhbHVlOjpFdmFsdWF0ZSgpIGNvbnN0IHsKKyAgaWYgKENoZWNrVmFsaWQoKSkgeworICAgIHJldHVybiBldmFsdWF0ZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCiBib29sIEFpZGxDb25zdGFudFZhbHVlOjpldmFsdWF0ZSgpIGNvbnN0IHsKICAgaWYgKGlzX2V2YWx1YXRlZF8pIHsKICAgICByZXR1cm4gaXNfdmFsaWRfOwpAQCAtNzI0LDcgKzc5OCw4IEBACiAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CiAgICAgZmllbGRfbmFtZV8gPSB2YWx1ZTsKICAgfSBlbHNlIHsKLSAgICByZWZfdHlwZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxUeXBlU3BlY2lmaWVyPihsb2NhdGlvbiwgdmFsdWUuc3Vic3RyKDAsIHBvcyksIGZhbHNlLCBudWxscHRyLAorICAgIHJlZl90eXBlXyA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbFR5cGVTcGVjaWZpZXI+KGxvY2F0aW9uLCB2YWx1ZS5zdWJzdHIoMCwgcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFycmF5PSovc3RkOjpudWxsb3B0LCAvKnR5cGVfcGFyYW1zPSovbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50c3t9KTsKICAgICBmaWVsZF9uYW1lXyA9IHZhbHVlLnN1YnN0cihwb3MgKyAxKTsKICAgfQpkaWZmIC0tZ2l0IGEvYWlkbF9kdW1wYXBpLmNwcCBiL2FpZGxfZHVtcGFwaS5jcHAKaW5kZXggYzEyMWY5Zi4uN2QzZjE5ZCAxMDA2NDQKLS0tIGEvYWlkbF9kdW1wYXBpLmNwcAorKysgYi9haWRsX2R1bXBhcGkuY3BwCkBAIC01Niw2ICs1Niw5IEBACiAgIGZvciAoY29uc3QgYXV0byYgY29uc3RkZWNsIDogZHQuR2V0Q29uc3RhbnREZWNsYXJhdGlvbnMoKSkgewogICAgIGNvbnN0ZGVjbC0+RGlzcGF0Y2hWaXNpdCgqdGhpcyk7CiAgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBuZXN0ZWQgOiBkdC5HZXROZXN0ZWRUeXBlcygpKSB7CisgICAgbmVzdGVkLT5EaXNwYXRjaFZpc2l0KCp0aGlzKTsKKyAgfQogfQogCiAvLyBEdW1wcyBjb21tZW50IG9ubHkgaWYgaXRzIGhhcyBtZWFuaW5nZnVsIHRhZ3MuCkBAIC0xMzksMTMgKzE0Miw2IEBACiAgIG91dCA8PCAiO1xuIjsKIH0KIAotdm9pZCBEdW1wVmlzaXRvcjo6VmlzaXQoY29uc3QgQWlkbEVudW1lcmF0b3ImIGUpIHsKLSAgb3V0IDw8IGUuR2V0TmFtZSgpIDw8ICIgPSAiOwotCi0gIGUuR2V0VmFsdWUoKS0+RGlzcGF0Y2hWaXNpdCgqdGhpcyk7Ci0gIG91dCA8PCAiLFxuIjsKLX0KLQogdm9pZCBEdW1wVmlzaXRvcjo6VmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHQpIHsKICAgb3V0IDw8IHQuVG9TdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2FpZGxfZHVtcGFwaS5oIGIvYWlkbF9kdW1wYXBpLmgKaW5kZXggNmQwMDBkZC4uZGY4Mjc4YSAxMDA2NDQKLS0tIGEvYWlkbF9kdW1wYXBpLmgKKysrIGIvYWlkbF9kdW1wYXBpLmgKQEAgLTI4LDcgKzI4LDcgQEAKICAgdm9pZCBEdW1wTWVtYmVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGR0KTsKICAgdm9pZCBEdW1wQ29tbWVudHMoY29uc3QgQWlkbENvbW1lbnRhYmxlJiBjKTsKICAgdm9pZCBEdW1wQW5ub3RhdGlvbnMoY29uc3QgQWlkbEFubm90YXRhYmxlJiBhKTsKLSAgdmlydHVhbCB2b2lkIER1bXBDb25zdGFudFZhbHVlKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsQ29uc3RhbnRWYWx1ZSYgYyk7CisgIHZvaWQgRHVtcENvbnN0YW50VmFsdWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlJiBjKTsKIAogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIHQpIG92ZXJyaWRlOwogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiB0KSBvdmVycmlkZTsKQEAgLTM4LDcgKzM4LDYgQEAKICAgdm9pZCBWaXNpdChjb25zdCBBaWRsTWV0aG9kJiBtKSBvdmVycmlkZTsKICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdikgb3ZlcnJpZGU7CiAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbENvbnN0YW50RGVjbGFyYXRpb24mIGMpIG92ZXJyaWRlOwotICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxFbnVtZXJhdG9yJiBlKSBvdmVycmlkZTsKICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdCkgb3ZlcnJpZGU7CiB9OwogCmRpZmYgLS1naXQgYS9haWRsX2xhbmd1YWdlLmNwcCBiL2FpZGxfbGFuZ3VhZ2UuY3BwCmluZGV4IDViZmY5NWUuLmU2YjRiMzIgMTAwNjQ0Ci0tLSBhL2FpZGxfbGFuZ3VhZ2UuY3BwCisrKyBiL2FpZGxfbGFuZ3VhZ2UuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzZXQ+CkBAIC0zMCwxMyArMzEsMTQgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWRvdWJsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogCisjaW5jbHVkZSAiYWlkbC5oIgogI2luY2x1ZGUgImFpZGxfbGFuZ3VhZ2VfeS5oIgogI2luY2x1ZGUgImNvbW1lbnRzLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgotCi0jaW5jbHVkZSAiYWlkbC5oIgorI2luY2x1ZGUgInBlcm1pc3Npb24uaCIKIAogI2lmZGVmIF9XSU4zMgogaW50IGlzYXR0eShpbnQgIGZkKQpAQCAtNDYsNyArNDgsOSBAQAogI2VuZGlmCiAKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OklvRGVsZWdhdGU7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpFcnJvcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OkpvaW47Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTcGxpdDsKIHVzaW5nIHN0ZDo6Y2VycjsKIHVzaW5nIHN0ZDo6cGFpcjsKQEAgLTcxLDYgKzc1LDI0IEBACiB9CiB9ICAvLyBuYW1lc3BhY2UKIAorQWlkbE5vZGU6On5BaWRsTm9kZSgpIHsKKyAgaWYgKCF2aXNpdGVkXykgeworICAgIHVudmlzaXRlZF9sb2NhdGlvbnNfLnB1c2hfYmFjayhsb2NhdGlvbl8pOworICB9Cit9CisKK3ZvaWQgQWlkbE5vZGU6OkNsZWFyVW52aXNpdGVkTm9kZXMoKSB7CisgIHVudmlzaXRlZF9sb2NhdGlvbnNfLmNsZWFyKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEFpZGxMb2NhdGlvbj4mIEFpZGxOb2RlOjpHZXRMb2NhdGlvbnNPZlVudmlzaXRlZE5vZGVzKCkgeworICByZXR1cm4gdW52aXNpdGVkX2xvY2F0aW9uc187Cit9CisKK3ZvaWQgQWlkbE5vZGU6Ok1hcmtWaXNpdGVkKCkgY29uc3QgeworICB2aXNpdGVkXyA9IHRydWU7Cit9CisKIEFpZGxOb2RlOjpBaWRsTm9kZShjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMpCiAgICAgOiBsb2NhdGlvbl8obG9jYXRpb24pLCBjb21tZW50c18oY29tbWVudHMpIHt9CiAKQEAgLTg3LDE4ICsxMDksMjUgQEAKICAgcmV0dXJuIHNzLnN0cigpOwogfQogCi1zdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga1N0cmluZ1R5cGV7QUlETF9MT0NBVElPTl9IRVJFLCAiU3RyaW5nIiwgZmFsc2UsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHN7fX07Ci1zdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga1N0cmluZ0FycmF5VHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJTdHJpbmciLCB0cnVlLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHN7fX07Ci1zdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0ludFR5cGV7QUlETF9MT0NBVElPTl9IRVJFLCAiaW50IiwgZmFsc2UsIG51bGxwdHIsIENvbW1lbnRze319Owotc3RhdGljIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIGtMb25nVHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJsb25nIiwgZmFsc2UsIG51bGxwdHIsIENvbW1lbnRze319Owotc3RhdGljIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIGtCb29sZWFuVHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJib29sZWFuIiwgZmFsc2UsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRze319Oworc3RkOjp2ZWN0b3I8QWlkbExvY2F0aW9uPiBBaWRsTm9kZTo6dW52aXNpdGVkX2xvY2F0aW9uc187CisKK3N0YXRpYyBjb25zdCBBaWRsVHlwZVNwZWNpZmllciBrU3RyaW5nVHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJTdHJpbmciLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIENvbW1lbnRze319Oworc3RhdGljIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIGtTdHJpbmdBcnJheVR5cGV7QUlETF9MT0NBVElPTl9IRVJFLCAiU3RyaW5nIiwgRHluYW1pY0FycmF5e30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBDb21tZW50c3t9fTsKK3N0YXRpYyBjb25zdCBBaWRsVHlwZVNwZWNpZmllciBrSW50VHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRze319Oworc3RhdGljIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyIGtMb25nVHlwZXtBSURMX0xPQ0FUSU9OX0hFUkUsICJsb25nIiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgQ29tbWVudHN7fX07CitzdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0Jvb2xlYW5UeXBle0FJRExfTE9DQVRJT05fSEVSRSwgImJvb2xlYW4iLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBDb21tZW50c3t9fTsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8QWlkbEFubm90YXRpb246OlNjaGVtYT4mIEFpZGxBbm5vdGF0aW9uOjpBbGxTY2hlbWFzKCkgewogICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8U2NoZW1hPiBrU2NoZW1hc3sKLSAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6TlVMTEFCTEUsICJudWxsYWJsZSIsIENPTlRFWFRfVFlQRV9TUEVDSUZJRVIsIHt9fSwKKyAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6TlVMTEFCTEUsCisgICAgICAgIm51bGxhYmxlIiwKKyAgICAgICBDT05URVhUX1RZUEVfU1BFQ0lGSUVSLAorICAgICAgIHt7ImhlYXAiLCBrQm9vbGVhblR5cGV9fX0sCiAgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OlVURjhfSU5fQ1BQLCAidXRmOEluQ3BwIiwgQ09OVEVYVF9UWVBFX1NQRUNJRklFUiwge319LAogICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpTRU5TSVRJVkVfREFUQSwgIlNlbnNpdGl2ZURhdGEiLCBDT05URVhUX1RZUEVfSU5URVJGQUNFLCB7fX0sCiAgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OlZJTlRGX1NUQUJJTElUWSwgIlZpbnRmU3RhYmlsaXR5IiwgQ09OVEVYVF9UWVBFLCB7fX0sCkBAIC0xMjgsMTIgKzE1NywyMSBAQAogICAgICAgICJKYXZhRGVyaXZlIiwKICAgICAgICBDT05URVhUX1RZUEVfU1RSVUNUVVJFRF9QQVJDRUxBQkxFIHwgQ09OVEVYVF9UWVBFX1VOSU9OLAogICAgICAgIHt7InRvU3RyaW5nIiwga0Jvb2xlYW5UeXBlfSwgeyJlcXVhbHMiLCBrQm9vbGVhblR5cGV9fX0sCisgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfREVGQVVMVCwgIkphdmFEZWZhdWx0IiwgQ09OVEVYVF9UWVBFX0lOVEVSRkFDRSwge319LAorICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFTEVHQVRPUiwgIkphdmFEZWxlZ2F0b3IiLCBDT05URVhUX1RZUEVfSU5URVJGQUNFLCB7fX0sCiAgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfT05MWV9JTU1VVEFCTEUsCiAgICAgICAgIkphdmFPbmx5SW1tdXRhYmxlIiwKICAgICAgICBDT05URVhUX1RZUEVfU1RSVUNUVVJFRF9QQVJDRUxBQkxFIHwgQ09OVEVYVF9UWVBFX1VOSU9OIHwKICAgICAgICAgICAgQ09OVEVYVF9UWVBFX1VOU1RSVUNUVVJFRF9QQVJDRUxBQkxFLAogICAgICAgIHt9fSwKLSAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6RklYRURfU0laRSwgIkZpeGVkU2l6ZSIsIENPTlRFWFRfVFlQRV9TVFJVQ1RVUkVEX1BBUkNFTEFCTEUsIHt9fSwKKyAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9TVVBQUkVTU19MSU5ULAorICAgICAgICJKYXZhU3VwcHJlc3NMaW50IiwKKyAgICAgICBDT05URVhUX0FMTCwKKyAgICAgICB7eyJ2YWx1ZSIsIGtTdHJpbmdBcnJheVR5cGUsIC8qIHJlcXVpcmVkPSAqLyB0cnVlfX19LAorICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpGSVhFRF9TSVpFLAorICAgICAgICJGaXhlZFNpemUiLAorICAgICAgIENPTlRFWFRfVFlQRV9TVFJVQ1RVUkVEX1BBUkNFTEFCTEUgfCBDT05URVhUX1RZUEVfVU5JT04sCisgICAgICAge319LAogICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpERVNDUklQVE9SLAogICAgICAgICJEZXNjcmlwdG9yIiwKICAgICAgICBDT05URVhUX1RZUEVfSU5URVJGQUNFLApAQCAtMTUyLDYgKzE5MCwyMiBAQAogICAgICAgICJTdXBwcmVzc1dhcm5pbmdzIiwKICAgICAgICBDT05URVhUX1RZUEUgfCBDT05URVhUX01FTUJFUiwKICAgICAgICB7eyJ2YWx1ZSIsIGtTdHJpbmdBcnJheVR5cGUsIC8qIHJlcXVpcmVkPSAqLyB0cnVlfX19LAorICAgICAge0FpZGxBbm5vdGF0aW9uOjpUeXBlOjpQRVJNSVNTSU9OX0VORk9SQ0UsCisgICAgICAgIkVuZm9yY2VQZXJtaXNzaW9uIiwKKyAgICAgICBDT05URVhUX1RZUEVfSU5URVJGQUNFIHwgQ09OVEVYVF9NRVRIT0QsCisgICAgICAge3sidmFsdWUiLCBrU3RyaW5nVHlwZX0sIHsiYW55T2YiLCBrU3RyaW5nQXJyYXlUeXBlfSwgeyJhbGxPZiIsIGtTdHJpbmdBcnJheVR5cGV9fX0sCisgICAgICB7QWlkbEFubm90YXRpb246OlR5cGU6OlBFUk1JU1NJT05fTUFOVUFMLAorICAgICAgICJQZXJtaXNzaW9uTWFudWFsbHlFbmZvcmNlZCIsCisgICAgICAgQ09OVEVYVF9UWVBFX0lOVEVSRkFDRSB8IENPTlRFWFRfTUVUSE9ELAorICAgICAgIHt9fSwKKyAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9OT05FLAorICAgICAgICJSZXF1aXJlc05vUGVybWlzc2lvbiIsCisgICAgICAgQ09OVEVYVF9UWVBFX0lOVEVSRkFDRSB8IENPTlRFWFRfTUVUSE9ELAorICAgICAgIHt9fSwKKyAgICAgIHtBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UFJPUEFHQVRFX0FMTE9XX0JMT0NLSU5HLAorICAgICAgICJQcm9wYWdhdGVBbGxvd0Jsb2NraW5nIiwKKyAgICAgICBDT05URVhUX01FVEhPRCwKKyAgICAgICB7fX0sCiAgIH07CiAgIHJldHVybiBrU2NoZW1hczsKIH0KQEAgLTE2NCw5ICsyMTgsOSBAQAogICBfX2J1aWx0aW5fdW5yZWFjaGFibGUoKTsKIH0KIAotQWlkbEFubm90YXRpb24qIEFpZGxBbm5vdGF0aW9uOjpQYXJzZSgKK3N0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4gQWlkbEFubm90YXRpb246OlBhcnNlKAogICAgIGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4qIHBhcmFtZXRlcl9saXN0LAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+PiBwYXJhbWV0ZXJfbGlzdCwKICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMpIHsKICAgY29uc3QgU2NoZW1hKiBzY2hlbWEgPSBudWxscHRyOwogICBmb3IgKGNvbnN0IFNjaGVtYSYgYV9zY2hlbWEgOiBBbGxTY2hlbWFzKCkpIHsKQEAgLTE4NCwxOSArMjM4LDE2IEBACiAgICAgfQogICAgIHN0cmVhbSA8PCAiLiI7CiAgICAgQUlETF9FUlJPUihsb2NhdGlvbikgPDwgc3RyZWFtLnN0cigpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmIChwYXJhbWV0ZXJfbGlzdCA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIG5ldyBBaWRsQW5ub3RhdGlvbihsb2NhdGlvbiwgKnNjaGVtYSwge30sIGNvbW1lbnRzKTsKKyAgICByZXR1cm4ge307CiAgIH0KIAotICByZXR1cm4gbmV3IEFpZGxBbm5vdGF0aW9uKGxvY2F0aW9uLCAqc2NoZW1hLCBzdGQ6Om1vdmUoKnBhcmFtZXRlcl9saXN0KSwgY29tbWVudHMpOworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPigKKyAgICAgIG5ldyBBaWRsQW5ub3RhdGlvbihsb2NhdGlvbiwgKnNjaGVtYSwgc3RkOjptb3ZlKHBhcmFtZXRlcl9saXN0KSwgY29tbWVudHMpKTsKIH0KIAotQWlkbEFubm90YXRpb246OkFpZGxBbm5vdGF0aW9uKAotICAgIGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IFNjaGVtYSYgc2NoZW1hLAotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+PiYmIHBhcmFtZXRlcnMsCi0gICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQorQWlkbEFubm90YXRpb246OkFpZGxBbm5vdGF0aW9uKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IFNjaGVtYSYgc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+PiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKICAgICA6IEFpZGxOb2RlKGxvY2F0aW9uLCBjb21tZW50cyksIHNjaGVtYV8oc2NoZW1hKSwgcGFyYW1ldGVyc18oc3RkOjptb3ZlKHBhcmFtZXRlcnMpKSB7fQogCiBzdHJ1Y3QgQ29uc3RSZWZlcmVuY2VGaW5kZXIgOiBBaWRsVmlzaXRvciB7CkBAIC0yNjEsNyArMzEyLDM0IEBACiAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgfQogICB9Ci0gIHJldHVybiBzdWNjZXNzOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gRm9yIEBFbmZvcmNlIGFubm90YXRpb25zLCB2YWxpZGF0ZXMgdGhlIGV4cHJlc3Npb24uCisgIGlmIChzY2hlbWFfLnR5cGUgPT0gQWlkbEFubm90YXRpb246OlR5cGU6OlBFUk1JU1NJT05fRU5GT1JDRSkgeworICAgIGF1dG8gZXhwciA9IEVuZm9yY2VFeHByZXNzaW9uKCk7CisgICAgaWYgKCFleHByLm9rKCkpIHsKKyAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIlVuYWJsZSB0byBwYXJzZSBARW5mb3JjZVBlcm1pc3Npb24gYW5ub3RhdGlvbjogIiA8PCBleHByLmVycm9yKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitSZXN1bHQ8dW5pcXVlX3B0cjxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPj4gQWlkbEFubm90YXRpb246OkVuZm9yY2VFeHByZXNzaW9uKCkgY29uc3QgeworICBhdXRvIHNpbmdsZSA9IFBhcmFtVmFsdWU8c3RkOjpzdHJpbmc+KCJ2YWx1ZSIpOworICBhdXRvIGFueU9mID0gUGFyYW1WYWx1ZTxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KCJhbnlPZiIpOworICBhdXRvIGFsbE9mID0gUGFyYW1WYWx1ZTxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KCJhbGxPZiIpOworICBpZiAoc2luZ2xlLmhhc192YWx1ZSgpKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8YW5kcm9pZDo6YWlkbDo6cGVybTo6RXhwcmVzc2lvbj4oc2luZ2xlLnZhbHVlKCkpOworICB9IGVsc2UgaWYgKGFueU9mLmhhc192YWx1ZSgpKSB7CisgICAgYXV0byB2ID0gYW5kcm9pZDo6YWlkbDo6cGVybTo6QW55T2Z7YW55T2YudmFsdWUoKX07CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8YW5kcm9pZDo6YWlkbDo6cGVybTo6RXhwcmVzc2lvbj4odik7CisgIH0gZWxzZSBpZiAoYWxsT2YuaGFzX3ZhbHVlKCkpIHsKKyAgICBhdXRvIHYgPSBhbmRyb2lkOjphaWRsOjpwZXJtOjpBbGxPZnthbGxPZi52YWx1ZSgpfTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPih2KTsKKyAgfQorICByZXR1cm4gRXJyb3IoKSA8PCAiTm8gcGFyYW1ldGVyIGZvciBARW5mb3JjZVBlcm1pc3Npb24iOwogfQogCiAvLyBDaGVja3MgaWYgdGhlIGFubm90YXRpb24gaXMgYXBwbGljYWJsZSB0byB0aGUgY3VycmVudCBjb250ZXh0LgpAQCAtMzI1LDE4ICs0MDMsMzEgQEAKICAgfQogfQogCi1zdGF0aWMgY29uc3QgQWlkbEFubm90YXRpb24qIEdldEFubm90YXRpb24oY29uc3QgdmVjdG9yPEFpZGxBbm5vdGF0aW9uPiYgYW5ub3RhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbEFubm90YXRpb246OlR5cGUgdHlwZSkgeworc3RhdGljIGNvbnN0IEFpZGxBbm5vdGF0aW9uKiBHZXRBbm5vdGF0aW9uKAorICAgIGNvbnN0IHZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+PiYgYW5ub3RhdGlvbnMsIEFpZGxBbm5vdGF0aW9uOjpUeXBlIHR5cGUpIHsKICAgZm9yIChjb25zdCBhdXRvJiBhIDogYW5ub3RhdGlvbnMpIHsKLSAgICBpZiAoYS5HZXRUeXBlKCkgPT0gdHlwZSkgewotICAgICAgQUlETF9GQVRBTF9JRihhLlJlcGVhdGFibGUoKSwgYSkKKyAgICBpZiAoYS0+R2V0VHlwZSgpID09IHR5cGUpIHsKKyAgICAgIEFJRExfRkFUQUxfSUYoYS0+UmVwZWF0YWJsZSgpLCBhKQogICAgICAgICAgIDw8ICJUcnlpbmcgdG8gZ2V0IGEgc2luZ2xlIGFubm90YXRpb24gd2hlbiBpdCBpcyByZXBlYXRhYmxlLiI7Ci0gICAgICByZXR1cm4gJmE7CisgICAgICByZXR1cm4gYS5nZXQoKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKK3N0YXRpYyBjb25zdCBBaWRsQW5ub3RhdGlvbiogR2V0U2NvcGVkQW5ub3RhdGlvbihjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsQW5ub3RhdGlvbjo6VHlwZSB0eXBlKSB7CisgIGNvbnN0IEFpZGxBbm5vdGF0aW9uKiBhbm5vdGF0aW9uID0gR2V0QW5ub3RhdGlvbihkZWZpbmVkX3R5cGUuR2V0QW5ub3RhdGlvbnMoKSwgdHlwZSk7CisgIGlmIChhbm5vdGF0aW9uKSB7CisgICAgcmV0dXJuIGFubm90YXRpb247CisgIH0KKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBlbmNsb3NpbmdfdHlwZSA9IGRlZmluZWRfdHlwZS5HZXRQYXJlbnRUeXBlKCk7CisgIGlmIChlbmNsb3NpbmdfdHlwZSkgeworICAgIHJldHVybiBHZXRTY29wZWRBbm5vdGF0aW9uKCplbmNsb3NpbmdfdHlwZSwgdHlwZSk7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKIEFpZGxBbm5vdGF0YWJsZTo6QWlkbEFubm90YXRhYmxlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKICAgICA6IEFpZGxDb21tZW50YWJsZShsb2NhdGlvbiwgY29tbWVudHMpIHt9CiAKQEAgLTM0NCw2ICs0MzUsMTQgQEAKICAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6TlVMTEFCTEUpOwogfQogCitib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNIZWFwTnVsbGFibGUoKSBjb25zdCB7CisgIGF1dG8gYW5ub3QgPSBHZXRBbm5vdGF0aW9uKGFubm90YXRpb25zXywgQWlkbEFubm90YXRpb246OlR5cGU6Ok5VTExBQkxFKTsKKyAgaWYgKGFubm90KSB7CisgICAgcmV0dXJuIGFubm90LT5QYXJhbVZhbHVlPGJvb2w+KCJoZWFwIikudmFsdWVfb3IoZmFsc2UpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzVXRmOEluQ3BwKCkgY29uc3QgewogICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpVVEY4X0lOX0NQUCk7CiB9CkBAIC0zNTMsNyArNDUyLDkgQEAKIH0KIAogYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzVmludGZTdGFiaWxpdHkoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRBbm5vdGF0aW9uKGFubm90YXRpb25zXywgQWlkbEFubm90YXRpb246OlR5cGU6OlZJTlRGX1NUQUJJTElUWSk7CisgIGF1dG8gZGVmaW5lZF90eXBlID0gQWlkbENhc3Q8QWlkbERlZmluZWRUeXBlPigqdGhpcyk7CisgIEFJRExfRkFUQUxfSUYoIWRlZmluZWRfdHlwZSwgKnRoaXMpIDw8ICJAVmludGZTdGFiaWxpdHkgaXMgbm90IGF0dGFjaGVkIHRvIGEgdHlwZSI7CisgIHJldHVybiBHZXRTY29wZWRBbm5vdGF0aW9uKCpkZWZpbmVkX3R5cGUsIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpWSU5URl9TVEFCSUxJVFkpOwogfQogCiBib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNKYXZhT25seUltbXV0YWJsZSgpIGNvbnN0IHsKQEAgLTM4Niw2ICs0ODcsMzIgQEAKICAgcmV0dXJuIHt9OwogfQogCisvLyBQYXJzZXMgdGhlIEBFbmZvcmNlIGFubm90YXRpb24gZXhwcmVzc2lvbi4KK3N0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPiBBaWRsQW5ub3RhdGFibGU6OkVuZm9yY2VFeHByZXNzaW9uKCkgY29uc3QgeworICBhdXRvIGFubm90ID0gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpQRVJNSVNTSU9OX0VORk9SQ0UpOworICBpZiAoYW5ub3QpIHsKKyAgICBhdXRvIHBlcm1fZXhwciA9IGFubm90LT5FbmZvcmNlRXhwcmVzc2lvbigpOworICAgIGlmICghcGVybV9leHByLm9rKCkpIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgZHVyaW5nIHZhbGlkYXRpb24uCisgICAgICBBSURMX0ZBVEFMKHRoaXMpIDw8ICJVbmFibGUgdG8gcGFyc2UgQEVuZm9yY2VQZXJtaXNzaW9uIGFubm90YXRpb246ICIgPDwgcGVybV9leHByLmVycm9yKCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1vdmUocGVybV9leHByLnZhbHVlKCkpOworICB9CisgIHJldHVybiB7fTsKK30KKworYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzUGVybWlzc2lvbk1hbnVhbCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9NQU5VQUwpOworfQorCitib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNQZXJtaXNzaW9uTm9uZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UEVSTUlTU0lPTl9OT05FKTsKK30KKworYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzUHJvcGFnYXRlQWxsb3dCbG9ja2luZygpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEFubm90YXRpb24oYW5ub3RhdGlvbnNfLCBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6UFJPUEFHQVRFX0FMTE9XX0JMT0NLSU5HKTsKK30KKwogYm9vbCBBaWRsQW5ub3RhdGFibGU6OklzU3RhYmxlQXBpUGFyY2VsYWJsZShPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCB7CiAgIHJldHVybiBsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpKQVZBICYmCiAgICAgICAgICBHZXRBbm5vdGF0aW9uKGFubm90YXRpb25zXywgQWlkbEFubm90YXRpb246OlR5cGU6OkpBVkFfU1RBQkxFX1BBUkNFTEFCTEUpOwpAQCAtNDAzLDYgKzUzMCwxNCBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQWlkbEFubm90YXRhYmxlOjpJc0phdmFEZWZhdWx0KCkgY29uc3QgeworICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFRkFVTFQpOworfQorCitib29sIEFpZGxBbm5vdGF0YWJsZTo6SXNKYXZhRGVsZWdhdG9yKCkgY29uc3QgeworICByZXR1cm4gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX0RFTEVHQVRPUik7Cit9CisKIHN0ZDo6c3RyaW5nIEFpZGxBbm5vdGF0YWJsZTo6R2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKICAgYXV0byBhbm5vdGF0aW9uID0gR2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uc18sIEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpERVNDUklQVE9SKTsKICAgaWYgKGFubm90YXRpb24gIT0gbnVsbHB0cikgewpAQCAtNDEzLDE2ICs1NDgsMTcgQEAKIAogYm9vbCBBaWRsQW5ub3RhdGFibGU6OkNoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYpIGNvbnN0IHsKICAgZm9yIChjb25zdCBhdXRvJiBhbm5vdGF0aW9uIDogR2V0QW5ub3RhdGlvbnMoKSkgewotICAgIGlmICghYW5ub3RhdGlvbi5DaGVja1ZhbGlkKCkpIHsKKyAgICBpZiAoIWFubm90YXRpb24tPkNoZWNrVmFsaWQoKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQogCiAgIHN0ZDo6bWFwPEFpZGxBbm5vdGF0aW9uOjpUeXBlLCBBaWRsTG9jYXRpb24+IGRlY2xhcmVkOwogICBmb3IgKGNvbnN0IGF1dG8mIGFubm90YXRpb24gOiBHZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgY29uc3QgYXV0byYgW2l0ZXIsIGluc2VydGVkXSA9IGRlY2xhcmVkLmVtcGxhY2UoYW5ub3RhdGlvbi5HZXRUeXBlKCksIGFubm90YXRpb24uR2V0TG9jYXRpb24oKSk7Ci0gICAgaWYgKCFpbnNlcnRlZCAmJiAhYW5ub3RhdGlvbi5SZXBlYXRhYmxlKCkpIHsKLSAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIiciIDw8IGFubm90YXRpb24uR2V0TmFtZSgpCisgICAgY29uc3QgYXV0byYgW2l0ZXIsIGluc2VydGVkXSA9CisgICAgICAgIGRlY2xhcmVkLmVtcGxhY2UoYW5ub3RhdGlvbi0+R2V0VHlwZSgpLCBhbm5vdGF0aW9uLT5HZXRMb2NhdGlvbigpKTsKKyAgICBpZiAoIWluc2VydGVkICYmICFhbm5vdGF0aW9uLT5SZXBlYXRhYmxlKCkpIHsKKyAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIiciIDw8IGFubm90YXRpb24tPkdldE5hbWUoKQogICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBpcyByZXBlYXRlZCwgYnV0IG5vdCBhbGxvd2VkLiBQcmV2aW91cyBsb2NhdGlvbjogIiA8PCBpdGVyLT5zZWNvbmQ7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNDM0LDMyICs1NzAsNzEgQEAKIHN0cmluZyBBaWRsQW5ub3RhdGFibGU6OlRvU3RyaW5nKCkgY29uc3QgewogICB2ZWN0b3I8c3RyaW5nPiByZXQ7CiAgIGZvciAoY29uc3QgYXV0byYgYSA6IGFubm90YXRpb25zXykgewotICAgIHJldC5lbXBsYWNlX2JhY2soYS5Ub1N0cmluZygpKTsKKyAgICByZXQuZW1wbGFjZV9iYWNrKGEtPlRvU3RyaW5nKCkpOwogICB9CiAgIHN0ZDo6c29ydChyZXQuYmVnaW4oKSwgcmV0LmVuZCgpKTsKICAgcmV0dXJuIEpvaW4ocmV0LCAiICIpOwogfQogCiBBaWRsVHlwZVNwZWNpZmllcjo6QWlkbFR5cGVTcGVjaWZpZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiB1bnJlc29sdmVkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPEFycmF5VHlwZT4gYXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiogdHlwZV9wYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQogICAgIDogQWlkbEFubm90YXRhYmxlKGxvY2F0aW9uLCBjb21tZW50cyksCiAgICAgICBBaWRsUGFyYW1ldGVyaXphYmxlPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+Pih0eXBlX3BhcmFtcyksCiAgICAgICB1bnJlc29sdmVkX25hbWVfKHVucmVzb2x2ZWRfbmFtZSksCi0gICAgICBpc19hcnJheV8oaXNfYXJyYXkpLAorICAgICAgYXJyYXlfKHN0ZDo6bW92ZShhcnJheSkpLAogICAgICAgc3BsaXRfbmFtZV8oU3BsaXQodW5yZXNvbHZlZF9uYW1lLCAiLiIpKSB7fQogCi1jb25zdCBBaWRsVHlwZVNwZWNpZmllciYgQWlkbFR5cGVTcGVjaWZpZXI6OkFycmF5QmFzZSgpIGNvbnN0IHsKLSAgQUlETF9GQVRBTF9JRighaXNfYXJyYXlfLCB0aGlzKTsKK3ZvaWQgQWlkbFR5cGVTcGVjaWZpZXI6OlZpZXdBc0FycmF5QmFzZShzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImKT4gZnVuYykgY29uc3QgeworICBBSURMX0ZBVEFMX0lGKCFhcnJheV8uaGFzX3ZhbHVlKCksIHRoaXMpOwogICAvLyBEZWNsYXJpbmcgYXJyYXkgb2YgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXBwZW4sIGl0IGlzIGdyYW1tYXIgZXJyb3IuCiAgIEFJRExfRkFUQUxfSUYoSXNHZW5lcmljKCksIHRoaXMpOwogCi0gIGlmICghYXJyYXlfYmFzZV8pIHsKLSAgICBhcnJheV9iYXNlXy5yZXNldChuZXcgQWlkbFR5cGVTcGVjaWZpZXIoKnRoaXMpKTsKLSAgICBhcnJheV9iYXNlXy0+aXNfYXJyYXlfID0gZmFsc2U7CisgIGJvb2wgaXNfbXV0YXRlZCA9IG11dGF0ZWRfOworICBtdXRhdGVkXyA9IHRydWU7CisgIC8vIG11dGF0ZSB0aGUgYXJyYXkgdHlwZSB0byBpdHMgYmFzZSBieSByZW1vdmluZyBhIHNpbmdsZSBkaW1lbnNpb24KKyAgLy8gZS5nLikgVFtdID0+IFQsIFRbTl1bTV0gPT4gVFtNXSAobm90ZSB0aGF0LCBNIGlzIHJlbW92ZWQpCisgIGlmIChJc0ZpeGVkU2l6ZUFycmF5KCkgJiYgc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KCphcnJheV8pLmRpbWVuc2lvbnMuc2l6ZSgpID4gMSkgeworICAgIGF1dG8mIGRpbWVuc2lvbnMgPSBzdGQ6OmdldDxGaXhlZFNpemVBcnJheT4oKmFycmF5XykuZGltZW5zaW9uczsKKyAgICBhdXRvIGRpbSA9IHN0ZDo6bW92ZShkaW1lbnNpb25zLmZyb250KCkpOworICAgIGRpbWVuc2lvbnMuZXJhc2UoZGltZW5zaW9ucy5iZWdpbigpKTsKKyAgICBmdW5jKCp0aGlzKTsKKyAgICBkaW1lbnNpb25zLmluc2VydChkaW1lbnNpb25zLmJlZ2luKCksIHN0ZDo6bW92ZShkaW0pKTsKKyAgfSBlbHNlIHsKKyAgICBBcnJheVR5cGUgYXJyYXlfdHlwZSA9IHN0ZDo6bW92ZShhcnJheV8udmFsdWUoKSk7CisgICAgYXJyYXlfID0gc3RkOjpudWxsb3B0OworICAgIGZ1bmMoKnRoaXMpOworICAgIGFycmF5XyA9IHN0ZDo6bW92ZShhcnJheV90eXBlKTsKICAgfQotICByZXR1cm4gKmFycmF5X2Jhc2VfOworICBtdXRhdGVkXyA9IGlzX211dGF0ZWQ7Cit9CisKK2Jvb2wgQWlkbFR5cGVTcGVjaWZpZXI6Ok1ha2VBcnJheShBcnJheVR5cGUgYXJyYXlfdHlwZSkgeworICAvLyBUIGJlY29tZXMgVFtdIG9yIFRbTl0KKyAgaWYgKCFJc0FycmF5KCkpIHsKKyAgICBhcnJheV8gPSBzdGQ6Om1vdmUoYXJyYXlfdHlwZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gVFtOXSBiZWNvbWVzIFRbTl1bTV0KKyAgaWYgKGF1dG8gZml4ZWRfc2l6ZV9hcnJheSA9IHN0ZDo6Z2V0X2lmPEZpeGVkU2l6ZUFycmF5PigmYXJyYXlfdHlwZSk7CisgICAgICBmaXhlZF9zaXplX2FycmF5ICE9IG51bGxwdHIgJiYgSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgLy8gY29uY2F0IGRpbWVuc2lvbnMKKyAgICBmb3IgKGF1dG8mIGRpbSA6IGZpeGVkX3NpemVfYXJyYXktPmRpbWVuc2lvbnMpIHsKKyAgICAgIHN0ZDo6Z2V0PEZpeGVkU2l6ZUFycmF5PigqYXJyYXlfKS5kaW1lbnNpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGltKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp2ZWN0b3I8aW50MzJfdD4gQWlkbFR5cGVTcGVjaWZpZXI6OkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpIGNvbnN0IHsKKyAgQUlETF9GQVRBTF9JRighSXNGaXhlZFNpemVBcnJheSgpLCAibm90IGEgZml4ZWQtc2l6ZSBhcnJheSIpOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkaW1lbnNpb25zOworICBmb3IgKGNvbnN0IGF1dG8mIGRpbSA6IHN0ZDo6Z2V0PEZpeGVkU2l6ZUFycmF5PihHZXRBcnJheSgpKS5kaW1lbnNpb25zKSB7CisgICAgZGltZW5zaW9ucy5wdXNoX2JhY2soZGltLT5FdmFsdWF0ZWRWYWx1ZTxpbnQzMl90PigpKTsKKyAgfQorICByZXR1cm4gZGltZW5zaW9uczsKIH0KIAogc3RyaW5nIEFpZGxUeXBlU3BlY2lmaWVyOjpTaWduYXR1cmUoKSBjb25zdCB7CkBAIC00NzIsNyArNjQ3LDEzIEBACiAgICAgcmV0ICs9ICI8IiArIEpvaW4oYXJnX25hbWVzLCAiLCIpICsgIj4iOwogICB9CiAgIGlmIChJc0FycmF5KCkpIHsKLSAgICByZXQgKz0gIltdIjsKKyAgICBpZiAoSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpbSA6IEdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpKSB7CisgICAgICAgIHJldCArPSAiWyIgKyBzdGQ6OnRvX3N0cmluZyhkaW0pICsgIl0iOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXQgKz0gIltdIjsKKyAgICB9CiAgIH0KICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ4Niw5ICs2NjcsMTUgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBBaWRsVHlwZVNwZWNpZmllcjo6UmVzb2x2ZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKy8vIFdoZW4gYHNjb3BlYCBpcyBzcGVjaWZpZWQsIG5hbWUgaXMgcmVzb2x2ZWQgZmlyc3QgYmFzZWQgb24gaXQuCisvLyBgc2NvcGVgIGNhbiBiZSBudWxsIGZvciBidWlsdC1pbiB0eXBlcyBhbmQgZnVsbHktcXVhbGlmaWVkIHR5cGVzLgorYm9vbCBBaWRsVHlwZVNwZWNpZmllcjo6UmVzb2x2ZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxTY29wZSogc2NvcGUpIHsKICAgQUlETF9GQVRBTF9JRihJc1Jlc29sdmVkKCksIHRoaXMpOwotICBBaWRsVHlwZW5hbWVzOjpSZXNvbHZlZFR5cGVuYW1lIHJlc3VsdCA9IHR5cGVuYW1lcy5SZXNvbHZlVHlwZW5hbWUodW5yZXNvbHZlZF9uYW1lXyk7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSB1bnJlc29sdmVkX25hbWVfOworICBpZiAoc2NvcGUpIHsKKyAgICBuYW1lID0gc2NvcGUtPlJlc29sdmVOYW1lKG5hbWUpOworICB9CisgIEFpZGxUeXBlbmFtZXM6OlJlc29sdmVkVHlwZW5hbWUgcmVzdWx0ID0gdHlwZW5hbWVzLlJlc29sdmVUeXBlbmFtZShuYW1lKTsKICAgaWYgKHJlc3VsdC5pc19yZXNvbHZlZCkgewogICAgIGZ1bGx5X3F1YWxpZmllZF9uYW1lXyA9IHJlc3VsdC5jYW5vbmljYWxfbmFtZTsKICAgICBzcGxpdF9uYW1lXyA9IFNwbGl0KGZ1bGx5X3F1YWxpZmllZF9uYW1lXywgIi4iKTsKQEAgLTUzNywyNyArNzI0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiciOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CisgICAgICBzdGF0aWMgY29uc3QgY2hhcioga0xpc3RVc2FnZSA9CisgICAgICAgICAgIkxpc3Q8VD4gc3VwcG9ydHMgaW50ZXJmYWNlL3BhcmNlbGFibGUvdW5pb24sIFN0cmluZywgSUJpbmRlciwgYW5kIFBhcmNlbEZpbGVEZXNjcmlwdG9yLiI7CiAgICAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgY29udGFpbmVkX3R5cGUgPSAqR2V0VHlwZVBhcmFtZXRlcnMoKVswXTsKICAgICAgIGlmIChjb250YWluZWRfdHlwZS5Jc0FycmF5KCkpIHsKLSAgICAgICAgQUlETF9FUlJPUih0aGlzKQotICAgICAgICAgICAgPDwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIExpc3Q8VD4gc3VwcG9ydHMgcGFyY2VsYWJsZS91bmlvbiwgU3RyaW5nLCAiCi0gICAgICAgICAgICAgICAiSUJpbmRlciwgYW5kIFBhcmNlbEZpbGVEZXNjcmlwdG9yLiI7CisgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuICIgPDwga0xpc3RVc2FnZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgICAgY29uc3Qgc3RyaW5nJiBjb250YWluZWRfdHlwZV9uYW1lID0gY29udGFpbmVkX3R5cGUuR2V0TmFtZSgpOwogICAgICAgaWYgKEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGNvbnRhaW5lZF90eXBlX25hbWUpKSB7CiAgICAgICAgIGlmIChjb250YWluZWRfdHlwZV9uYW1lICE9ICJTdHJpbmciICYmIGNvbnRhaW5lZF90eXBlX25hbWUgIT0gIklCaW5kZXIiICYmCiAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9uYW1lICE9ICJQYXJjZWxGaWxlRGVzY3JpcHRvciIpIHsKLSAgICAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJMaXN0PCIgPDwgY29udGFpbmVkX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIj4gaXMgbm90IHN1cHBvcnRlZC4gTGlzdDxUPiBzdXBwb3J0cyBwYXJjZWxhYmxlL3VuaW9uLCBTdHJpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQmluZGVyLCBhbmQgUGFyY2VsRmlsZURlc2NyaXB0b3IuIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7ICAvLyBEZWZpbmVkIHR5cGVzCi0gICAgICAgIGlmICh0eXBlbmFtZXMuR2V0SW50ZXJmYWNlKGNvbnRhaW5lZF90eXBlKSkgewotICAgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkxpc3Q8IiA8PCBjb250YWluZWRfdHlwZV9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiPiBpcyBub3Qgc3VwcG9ydGVkLiBMaXN0PFQ+IHN1cHBvcnRzIHBhcmNlbGFibGUvdW5pb24sIFN0cmluZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklCaW5kZXIsIGFuZCBQYXJjZWxGaWxlRGVzY3JpcHRvci4iOworICAgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkxpc3Q8IiA8PCBjb250YWluZWRfdHlwZV9uYW1lIDw8ICI+IGlzIG5vdCBzdXBwb3J0ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGtMaXN0VXNhZ2U7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICB9CkBAIC02MDQsMTMgKzc4Myw5IEBACiAgIH0KIAogICBpZiAoSXNBcnJheSgpKSB7Ci0gICAgY29uc3QgYXV0byBkZWZpbmVkX3R5cGUgPSB0eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUoR2V0TmFtZSgpKTsKLSAgICBpZiAoZGVmaW5lZF90eXBlICE9IG51bGxwdHIgJiYgZGVmaW5lZF90eXBlLT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkJpbmRlciB0eXBlIGNhbm5vdCBiZSBhbiBhcnJheSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChHZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7Ci0gICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJBcnJheXMgb2YgUGFyY2VsYWJsZUhvbGRlciBhcmUgbm90IHN1cHBvcnRlZC4iOworICAgIGlmIChHZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiIHx8IEdldE5hbWUoKSA9PSAiTGlzdCIgfHwgR2V0TmFtZSgpID09ICJNYXAiIHx8CisgICAgICAgIEdldE5hbWUoKSA9PSAiQ2hhclNlcXVlbmNlIikgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiQXJyYXlzIG9mICIgPDwgR2V0TmFtZSgpIDw8ICIgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KQEAgLTYyOSwyMiArODA0LDYxIEBACiAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBudWxsYWJsZS4iOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAoSXNIZWFwTnVsbGFibGUoKSkgeworICAgICAgaWYgKCFkZWZpbmVkX3R5cGUgfHwgSXNBcnJheSgpIHx8ICFkZWZpbmVkX3R5cGUtPkFzUGFyY2VsYWJsZSgpKSB7CisgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkBudWxsYWJsZShoZWFwPXRydWUpIGlzIGF2YWlsYWJsZSB0byBwYXJjZWxhYmxlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKElzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZGltIDogc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KEdldEFycmF5KCkpLmRpbWVuc2lvbnMpIHsKKyAgICAgIGlmICghZGltLT5FdmFsdWF0ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChkaW0tPkdldFR5cGUoKSA+IEFpZGxDb25zdGFudFZhbHVlOjpUeXBlOjpJTlQzMikgeworICAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJBcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXI6ICIgPDwgZGltLT5MaXRlcmFsKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGF1dG8gdmFsdWUgPSBkaW0tPkV2YWx1YXRlZFZhbHVlPGludDMyX3Q+KCk7CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIEFJRExfRVJST1IodGhpcykgPDwgIkFycmF5IHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcjogIiA8PCB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RkOjpzdHJpbmcgQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKSB7Ci0gIGlmICh0eXBlLklzQXJyYXkoKSkgewotICAgIHJldHVybiByYXdfdmFsdWU7Cit2b2lkIEFpZGxUeXBlU3BlY2lmaWVyOjpUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPiB0cmF2ZXJzZSkgY29uc3QgeworICBBaWRsQW5ub3RhdGFibGU6OlRyYXZlcnNlQ2hpbGRyZW4odHJhdmVyc2UpOworICBpZiAoSXNHZW5lcmljKCkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRwIDogR2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgdHJhdmVyc2UoKnRwKTsKKyAgICB9CiAgIH0KKyAgaWYgKElzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZGltIDogc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KEdldEFycmF5KCkpLmRpbWVuc2lvbnMpIHsKKyAgICAgIHRyYXZlcnNlKCpkaW0pOworICAgIH0KKyAgfQorfQogCitzdGQ6OnN0cmluZyBBaWRsQ29uc3RhbnRWYWx1ZURlY29yYXRvcigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKKyAgICBjb25zdCBhdXRvJiB2YWx1ZXMgPSBzdGQ6OmdldDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KHJhd192YWx1ZSk7CisgICAgcmV0dXJuICJ7IiArIEpvaW4odmFsdWVzLCAiLCAiKSArICJ9IjsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4ocmF3X3ZhbHVlKTsKICAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKICAgICBhdXRvIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKLSAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCByYXdfdmFsdWUgPDwgIlwiIjsKLSAgICByZXR1cm4gdHlwZS5HZXROYW1lKCkgKyAiLiIgKyByYXdfdmFsdWUuc3Vic3RyKHJhd192YWx1ZS5maW5kX2xhc3Rfb2YoJy4nKSArIDEpOworICAgIEFJRExfRkFUQUxfSUYoIWVudW1fdHlwZSwgdHlwZSkgPDwgIkludmFsaWQgdHlwZSBmb3IgXCIiIDw8IHZhbHVlIDw8ICJcIiI7CisgICAgcmV0dXJuIHR5cGUuR2V0TmFtZSgpICsgIi4iICsgdmFsdWUuc3Vic3RyKHZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7CiAgIH0KLSAgcmV0dXJuIHJhd192YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOwogfQogCiBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbjo6QWlkbFZhcmlhYmxlRGVjbGFyYXRpb24oY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwKQEAgLTcyMSw4ICs5MzUsOCBAQAogdm9pZCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbjo6VHJhdmVyc2VDaGlsZHJlbigKICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IHsKICAgdHJhdmVyc2UoR2V0VHlwZSgpKTsKLSAgaWYgKElzRGVmYXVsdFVzZXJTcGVjaWZpZWQoKSkgewotICAgIHRyYXZlcnNlKCpHZXREZWZhdWx0VmFsdWUoKSk7CisgIGlmIChhdXRvIGRlZmF1bHRfdmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKTsgZGVmYXVsdF92YWx1ZSkgeworICAgIHRyYXZlcnNlKCpkZWZhdWx0X3ZhbHVlKTsKICAgfQogfQogCkBAIC04MjAsNyArMTAzNCw3IEBACiB9CiAKIEFpZGxNZW1iZXI6OkFpZGxNZW1iZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQotICAgIDogQWlkbENvbW1lbnRhYmxlKGxvY2F0aW9uLCBjb21tZW50cykge30KKyAgICA6IEFpZGxBbm5vdGF0YWJsZShsb2NhdGlvbiwgY29tbWVudHMpIHt9CiAKIEFpZGxDb25zdGFudERlY2xhcmF0aW9uOjpBaWRsQ29uc3RhbnREZWNsYXJhdGlvbihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKQEAgLTg5NywyNCArMTExMSw5MSBAQAogICByZXR1cm4gcmV0OwogfQogCitib29sIEFpZGxNZXRob2Q6OkNoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCB7CisgIGlmICghR2V0VHlwZSgpLkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRPRE8oYi8xNTY4NzI1ODIpOiBTdXBwb3J0IGl0IHdoZW4gUGFyY2VsYWJsZUhvbGRlciBzdXBwb3J0cyBldmVyeSBiYWNrZW5kLgorICBpZiAoR2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBhIHJldHVybiB0eXBlIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKElzT25ld2F5KCkgJiYgR2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJvbmV3YXkgbWV0aG9kICciIDw8IEdldE5hbWUoKSA8PCAiJyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNldDxzdHJpbmc+IGFyZ3VtZW50X25hbWVzOworICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IEdldEFyZ3VtZW50cygpKSB7CisgICAgYXV0byBpdCA9IGFyZ3VtZW50X25hbWVzLmZpbmQoYXJnLT5HZXROYW1lKCkpOworICAgIGlmIChpdCAhPSBhcmd1bWVudF9uYW1lcy5lbmQoKSkgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAibWV0aG9kICciIDw8IEdldE5hbWUoKSA8PCAiJyBoYXMgZHVwbGljYXRlIGFyZ3VtZW50IG5hbWUgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnLT5HZXROYW1lKCkgPDwgIiciOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhcmd1bWVudF9uYW1lcy5pbnNlcnQoYXJnLT5HZXROYW1lKCkpOworCisgICAgaWYgKCFhcmctPkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChJc09uZXdheSgpICYmIGFyZy0+SXNPdXQoKSkgeworICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAib25ld2F5IG1ldGhvZCAnIiA8PCB0aGlzLT5HZXROYW1lKCkgPDwgIicgY2Fubm90IGhhdmUgb3V0IHBhcmFtZXRlcnMiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgdGhlIG5hbWUgZG9lc24ndCBtYXRjaCBhIGtleXdvcmQKKyAgICBpZiAoSXNKYXZhS2V5d29yZChhcmctPkdldE5hbWUoKS5jX3N0cigpKSkgeworICAgICAgQUlETF9FUlJPUihhcmcpIDw8ICJBcmd1bWVudCBuYW1lIGlzIGEgSmF2YSBvciBhaWRsIGtleXdvcmQiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlc2VydmUgYSBuYW1lc3BhY2UgZm9yIGludGVybmFsIHVzZQorICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGFyZy0+R2V0TmFtZSgpLCAiX2FpZGwiKSkgeworICAgICAgQUlETF9FUlJPUihhcmcpIDw8ICJBcmd1bWVudCBuYW1lIGNhbm5vdCBiZWdpbiB3aXRoICdfYWlkbCciOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChhcmctPkdldFR5cGUoKS5HZXROYW1lKCkgPT0gInZvaWQiKSB7CisgICAgICBBSURMX0VSUk9SKGFyZy0+R2V0VHlwZSgpKSA8PCAiJ3ZvaWQnIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgdGhlIHBhcmFtZXRlciAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnLT5HZXROYW1lKCkgPDwgIiciOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwogQWlkbERlZmluZWRUeXBlOjpBaWRsRGVmaW5lZFR5cGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+PiogbWVtYmVycykKLSAgICA6IEFpZGxBbm5vdGF0YWJsZShsb2NhdGlvbiwgY29tbWVudHMpLAotICAgICAgbmFtZV8obmFtZSksCi0gICAgICBwYWNrYWdlXyhwYWNrYWdlKSwKLSAgICAgIHNwbGl0X3BhY2thZ2VfKHBhY2thZ2UuZW1wdHkoKSA/IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpiYXNlOjpTcGxpdChwYWNrYWdlLCAiLiIpKSB7CisgICAgOiBBaWRsTWVtYmVyKGxvY2F0aW9uLCBjb21tZW50cyksIEFpZGxTY29wZSh0aGlzKSwgbmFtZV8obmFtZSksIHBhY2thZ2VfKHBhY2thZ2UpIHsKKyAgLy8gYWRqdXN0IG5hbWUvcGFja2FnZSB3aGVuIG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIChmb3IgcHJlcHJvY2Vzc2VkIGZpbGVzKQorICBpZiAocGFja2FnZV8uZW1wdHkoKSAmJiBuYW1lXy5maW5kKCcuJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpYyBpcyBhYnNvbHV0ZWx5IHdyb25nLiAgR2l2ZW4gYSBwYXJjZWxhYmxlCisgICAgLy8gb3JnLnNvbWUuRm9vLkJhciwgdGhlIGNsYXNzIG5hbWUgaXMgRm9vLkJhciwgYnV0IHRoaXMgY29kZSB3aWxsIGNsYWltIHRoYXQKKyAgICAvLyB0aGUgY2xhc3MgaXMganVzdCBCYXIuICBIb3dldmVyLCB0aGlzIHdhcyB0aGUgd2F5IGl0IHdhcyBkb25lIGluIHRoZSBwYXN0LgorICAgIC8vCisgICAgLy8gU2VlIGIvMTc0MTU2OTIKKyAgICBhdXRvIHBvcyA9IG5hbWUucmZpbmQoJy4nKTsKKyAgICAvLyBuYW1lIGlzIHRoZSBsYXN0IHBhcnQuCisgICAgbmFtZV8gPSBuYW1lLnN1YnN0cihwb3MgKyAxKTsKKyAgICAvLyBwYWNrYWdlIGlzIHRoZSBpbml0aWFsIHBhcnRzIChleGNlcHQgdGhlIGxhc3QpLgorICAgIHBhY2thZ2VfID0gbmFtZS5zdWJzdHIoMCwgcG9zKTsKKyAgfQogICBpZiAobWVtYmVycykgewogICAgIGZvciAoYXV0byYgbSA6ICptZW1iZXJzKSB7Ci0gICAgICBpZiAoYXV0byBjb25zdGFudCA9IG0tPkFzQ29uc3RhbnREZWNsYXJhdGlvbigpOyBjb25zdGFudCkgeworICAgICAgaWYgKGF1dG8gY29uc3RhbnQgPSBBaWRsQ2FzdDxBaWRsQ29uc3RhbnREZWNsYXJhdGlvbj4oKm0pOyBjb25zdGFudCkgewogICAgICAgICBjb25zdGFudHNfLmVtcGxhY2VfYmFjayhjb25zdGFudCk7Ci0gICAgICB9IGVsc2UgaWYgKGF1dG8gdmFyaWFibGUgPSBtLT5Bc1ZhcmlhYmxlRGVjbGFyYXRpb24oKTsgdmFyaWFibGUpIHsKKyAgICAgIH0gZWxzZSBpZiAoYXV0byB2YXJpYWJsZSA9IEFpZGxDYXN0PEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uPigqbSk7IHZhcmlhYmxlKSB7CiAgICAgICAgIHZhcmlhYmxlc18uZW1wbGFjZV9iYWNrKHZhcmlhYmxlKTsKLSAgICAgIH0gZWxzZSBpZiAoYXV0byBtZXRob2QgPSBtLT5Bc01ldGhvZCgpOyBtZXRob2QpIHsKKyAgICAgIH0gZWxzZSBpZiAoYXV0byBtZXRob2QgPSBBaWRsQ2FzdDxBaWRsTWV0aG9kPigqbSk7IG1ldGhvZCkgewogICAgICAgICBtZXRob2RzXy5lbXBsYWNlX2JhY2sobWV0aG9kKTsKKyAgICAgIH0gZWxzZSBpZiAoYXV0byB0eXBlID0gQWlkbENhc3Q8QWlkbERlZmluZWRUeXBlPigqbSk7IHR5cGUpIHsKKyAgICAgICAgdHlwZS0+U2V0RW5jbG9zaW5nU2NvcGUodGhpcyk7CisgICAgICAgIHR5cGVzXy5lbXBsYWNlX2JhY2sodHlwZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBBSURMX0ZBVEFMKCptKTsKKyAgICAgICAgQUlETF9GQVRBTCgqbSkgPDwgIlVua25vd24gbWVtYmVyIHR5cGUuIjsKICAgICAgIH0KICAgICAgIG1lbWJlcnNfLnB1c2hfYmFjayhtLnJlbGVhc2UoKSk7CiAgICAgfQpAQCAtOTMzLDYgKzEyMTQsOSBAQAogfQogCiBzdGQ6OnN0cmluZyBBaWRsRGVmaW5lZFR5cGU6OkdldENhbm9uaWNhbE5hbWUoKSBjb25zdCB7CisgIGlmIChhdXRvIHBhcmVudCA9IEdldFBhcmVudFR5cGUoKTsgcGFyZW50KSB7CisgICAgcmV0dXJuIHBhcmVudC0+R2V0Q2Fub25pY2FsTmFtZSgpICsgIi4iICsgR2V0TmFtZSgpOworICB9CiAgIGlmIChwYWNrYWdlXy5lbXB0eSgpKSB7CiAgICAgcmV0dXJuIEdldE5hbWUoKTsKICAgfQpAQCAtOTQyLDYgKzEyMjYsNDQgQEAKIGJvb2wgQWlkbERlZmluZWRUeXBlOjpDaGVja1ZhbGlkV2l0aE1lbWJlcnMoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCB7CiAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAKKyAgZm9yIChjb25zdCBhdXRvJiB0IDogR2V0TmVzdGVkVHlwZXMoKSkgeworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIHQtPkNoZWNrVmFsaWQodHlwZW5hbWVzKTsKKyAgfQorCisgIGlmIChhdXRvIHBhcmFtZXRlcml6YWJsZSA9IEFzUGFyYW1ldGVyaXphYmxlKCk7CisgICAgICBwYXJhbWV0ZXJpemFibGUgJiYgcGFyYW1ldGVyaXphYmxlLT5Jc0dlbmVyaWMoKSAmJiAhR2V0TmVzdGVkVHlwZXMoKS5lbXB0eSgpKSB7CisgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiR2VuZXJpYyB0eXBlcyBjYW4ndCBoYXZlIG5lc3RlZCB0eXBlcy4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBuZXN0ZWRfdHlwZV9uYW1lczsKKyAgZm9yIChjb25zdCBhdXRvJiB0IDogR2V0TmVzdGVkVHlwZXMoKSkgeworICAgIGJvb2wgZHVwbGljYXRlZCA9ICFuZXN0ZWRfdHlwZV9uYW1lcy5lbXBsYWNlKHQtPkdldE5hbWUoKSkuc2Vjb25kOworICAgIGlmIChkdXBsaWNhdGVkKSB7CisgICAgICBBSURMX0VSUk9SKHQpIDw8ICJSZWRlZmluaXRpb24gb2YgJyIgPDwgdC0+R2V0TmFtZSgpIDw8ICInLiI7CisgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfQorICAgIC8vIG5lc3RlZCB0eXBlIGNhbid0IGhhdmUgYSBwYXJlbnQgbmFtZQorICAgIGlmICh0LT5HZXROYW1lKCkgPT0gR2V0TmFtZSgpKSB7CisgICAgICBBSURMX0VSUk9SKHQpIDw8ICJOZXN0ZWQgdHlwZSAnIiA8PCBHZXROYW1lKCkgPDwgIicgaGFzIHRoZSBzYW1lIG5hbWUgYXMgaXRzIHBhcmVudC4iOworICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0KKyAgICAvLyBIYXZpbmcgdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzIGFzIG5lc3RlZCB0eXBlcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgYmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVkCisgICAgLy8gc29tZXdoZXJlIGVsc2UgaW4gbmF0aXZlIGxhbmd1YWdlcyAoZS5nLiBDKyssIEphdmEuLi4pLgorICAgIGlmIChBaWRsQ2FzdDxBaWRsUGFyY2VsYWJsZT4oKnQpKSB7CisgICAgICBBSURMX0VSUk9SKHQpIDw8ICInIiA8PCB0LT5HZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgaXMgbmVzdGVkLiBVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZXMgc2hvdWxkIGJlIGF0IHRoZSByb290IHNjb3BlLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKCFUb3BvbG9naWNhbFZpc2l0KEdldE5lc3RlZFR5cGVzKCksIFtdKGF1dG8mKSB7fSkpIHsKKyAgICBBSURMX0VSUk9SKHRoaXMpIDw8IEdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBoYXMgbmVzdGVkIHR5cGVzIHdpdGggY3ljbGljIHJlZmVyZW5jZXMuIEMrKyBhbmQgTkRLIGJhY2tlbmRzIGRvbid0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IGN5Y2xpYyByZWZlcmVuY2VzLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgZm9yIChjb25zdCBhdXRvJiB2IDogR2V0RmllbGRzKCkpIHsKICAgICBjb25zdCBib29sIGZpZWxkX3ZhbGlkID0gdi0+Q2hlY2tWYWxpZCh0eXBlbmFtZXMpOwogICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIGZpZWxkX3ZhbGlkOwpAQCAtOTk1LDYgKzEzMTcsNzkgQEAKICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKK2NvbnN0IEFpZGxEZWZpbmVkVHlwZSogQWlkbERlZmluZWRUeXBlOjpHZXRQYXJlbnRUeXBlKCkgY29uc3QgeworICBBSURMX0ZBVEFMX0lGKEdldEVuY2xvc2luZ1Njb3BlKCkgPT0gbnVsbHB0ciwgdGhpcykgPDwgIlNjb3BlIGlzIG5vdCBzZXQuIjsKKyAgcmV0dXJuIEFpZGxDYXN0PEFpZGxEZWZpbmVkVHlwZT4oR2V0RW5jbG9zaW5nU2NvcGUoKS0+R2V0Tm9kZSgpKTsKK30KKworY29uc3QgQWlkbERlZmluZWRUeXBlKiBBaWRsRGVmaW5lZFR5cGU6OkdldFJvb3RUeXBlKCkgY29uc3QgeworICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHJvb3QgPSB0aGlzOworICBmb3IgKGF1dG8gcGFyZW50ID0gcm9vdC0+R2V0UGFyZW50VHlwZSgpOyBwYXJlbnQ7IHBhcmVudCA9IHBhcmVudC0+R2V0UGFyZW50VHlwZSgpKSB7CisgICAgcm9vdCA9IHBhcmVudDsKKyAgfQorICByZXR1cm4gcm9vdDsKK30KKworLy8gUmVzb2x2ZSBgbmFtZWAgaW4gdGhlIGN1cnJlbnQgc2NvcGUuIElmIG5vdCBmb3VuZCwgZGVsZWdhdGUgdG8gdGhlIHBhcmVudAorc3RkOjpzdHJpbmcgQWlkbERlZmluZWRUeXBlOjpSZXNvbHZlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgeworICAvLyBGb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZywgdDEncyB0eXBlIEJheiBtZWFucyB4LkZvby5CYXIuQmF6CisgIC8vIHdoaWxlIHQyJ3MgdHlwZSBpcyB5LkJhei4KKyAgLy8gcGFja2FnZSB4OworICAvLyBpbXBvcnQgeS5CYXo7CisgIC8vIHBhcmNlbGFibGUgRm9vIHsKKyAgLy8gICBwYXJjZWxhYmxlIEJhciB7CisgIC8vICAgICBlbnVtIEJheiB7IC4uLiB9CisgIC8vICAgICBCYXogdDE7IC8vIC0+IHNob3VsZCBiZSB4LkZvby5CYXIuQmF6CisgIC8vICAgfQorICAvLyAgIEJheiB0MjsgLy8gLT4gc2hvdWxkIGJlIHkuQmF6CisgIC8vICAgQmFyLkJheiB0MzsgLy8gLT4gc2hvdWxkIGJlIHguRm9vLkJhci5CYXoKKyAgLy8gfQorICBBSURMX0ZBVEFMX0lGKCFHZXRFbmNsb3NpbmdTY29wZSgpLCB0aGlzKQorICAgICAgPDwgIlR5cGUgc2hvdWxkIGhhdmUgYW4gZW5jbG9zaW5nIHNjb3BlLihlLmcuIEFpZGxEb2N1bWVudCkiOworICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUobmFtZSkpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIGNvbnN0IGF1dG8gZmlyc3RfZG90ID0gbmFtZS5maW5kX2ZpcnN0X29mKCcuJyk7CisgIC8vIEZvciAiT3V0ZXIuSW5uZXIiLCB3ZSBsb29rIHVwICJPdXRlciIgaW4gdGhlIGltcG9ydCBsaXN0LgorICBjb25zdCBzdGQ6OnN0cmluZyBjbGFzc19uYW1lID0KKyAgICAgIChmaXJzdF9kb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gbmFtZSA6IG5hbWUuc3Vic3RyKDAsIGZpcnN0X2RvdCk7CisgIC8vIEtlZXAgIi5Jbm5lciIsIHRvIG1ha2UgYSBmdWxseS1xdWFsaWZpZWQgbmFtZQorICBjb25zdCBzdGQ6OnN0cmluZyBuZXN0ZWRfdHlwZSA9IChmaXJzdF9kb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gIiIgOiBuYW1lLnN1YnN0cihmaXJzdF9kb3QpOworCisgIC8vIGNoZWNrIGlmIGl0IGlzIGEgbmVzdGVkIHR5cGUKKyAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogR2V0TmVzdGVkVHlwZXMoKSkgeworICAgIGlmICh0eXBlLT5HZXROYW1lKCkgPT0gY2xhc3NfbmFtZSkgeworICAgICAgcmV0dXJuIHR5cGUtPkdldENhbm9uaWNhbE5hbWUoKSArIG5lc3RlZF90eXBlOworICAgIH0KKyAgfQorCisgIHJldHVybiBHZXRFbmNsb3NpbmdTY29wZSgpLT5SZXNvbHZlTmFtZShuYW1lKTsKK30KKwordGVtcGxhdGUgPD4KK2NvbnN0IEFpZGxEZWZpbmVkVHlwZSogQWlkbENhc3Q8QWlkbERlZmluZWRUeXBlPihjb25zdCBBaWRsTm9kZSYgbm9kZSkgeworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZSA9IG51bGxwdHI7CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsSW50ZXJmYWNlJiB0KSBvdmVycmlkZSB7IGRlZmluZWRfdHlwZSA9ICZ0OyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiB0KSBvdmVycmlkZSB7IGRlZmluZWRfdHlwZSA9ICZ0OyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHQpIG92ZXJyaWRlIHsgZGVmaW5lZF90eXBlID0gJnQ7IH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxVbmlvbkRlY2wmIHQpIG92ZXJyaWRlIHsgZGVmaW5lZF90eXBlID0gJnQ7IH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7IGRlZmluZWRfdHlwZSA9ICZ0OyB9CisgIH0gdjsKKyAgbm9kZS5EaXNwYXRjaFZpc2l0KHYpOworICByZXR1cm4gdi5kZWZpbmVkX3R5cGU7Cit9CisKK2NvbnN0IEFpZGxEb2N1bWVudCYgQWlkbERlZmluZWRUeXBlOjpHZXREb2N1bWVudCgpIGNvbnN0IHsKKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiByb290ID0gR2V0Um9vdFR5cGUoKTsKKyAgYXV0byBzY29wZSA9IHJvb3QtPkdldEVuY2xvc2luZ1Njb3BlKCk7CisgIEFJRExfRkFUQUxfSUYoIXNjb3BlLCB0aGlzKSA8PCAibm8gc2NvcGUgZGVmaW5lZC4iOworICBhdXRvIGRvYyA9IEFpZGxDYXN0PEFpZGxEb2N1bWVudD4oc2NvcGUtPkdldE5vZGUoKSk7CisgIEFJRExfRkFUQUxfSUYoIWRvYywgdGhpcykgPDwgInJvb3Qgc2NvcGUgaXMgbm90IGEgZG9jdW1lbnQuIjsKKyAgcmV0dXJuICpkb2M7Cit9CisKIEFpZGxQYXJjZWxhYmxlOjpBaWRsUGFyY2VsYWJsZShjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjcHBfaGVhZGVyLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHR5cGVfcGFyYW1zLApAQCAtMTAwNywxMyArMTQwMiw2IEBACiAgICAgY3BwX2hlYWRlcl8gPSBjcHBfaGVhZGVyXy5zdWJzdHIoMSwgY3BwX2hlYWRlcl8ubGVuZ3RoKCkgLSAyKTsKICAgfQogfQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1BaWRsUGFyYW1ldGVyaXphYmxlPFQ+OjpBaWRsUGFyYW1ldGVyaXphYmxlKGNvbnN0IEFpZGxQYXJhbWV0ZXJpemFibGUmIG90aGVyKSB7Ci0gIC8vIENvcHlpbmcgaXMgbm90IHN1cHBvcnRlZCBpZiBpdCBoYXMgdHlwZSBwYXJhbWV0ZXJzLgotICAvLyBJdCBkb2Vzbid0IG1ha2UgYSBwcm9ibGVtIGJlY2F1c2Ugb25seSBBcnJheUJhc2UoKSBtYWtlcyBhIGNvcHksCi0gIC8vIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgaWYgYSB0eXBlIGlzIG5vdCBnZW5lcmljLgotICBBSURMX0ZBVEFMX0lGKG90aGVyLklzR2VuZXJpYygpLCBBSURMX0xPQ0FUSU9OX0hFUkUpOwotfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIGJvb2wgQWlkbFBhcmFtZXRlcml6YWJsZTxUPjo6Q2hlY2tWYWxpZCgpIGNvbnN0IHsKQEAgLTEwNDEsNyArMTQyOSwxOCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHJldHVybiB0cnVlOworICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICBpZiAoSXNGaXhlZFNpemUoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgdiA6IEdldEZpZWxkcygpKSB7CisgICAgICBpZiAoIXR5cGVuYW1lcy5DYW5CZUZpeGVkU2l6ZSh2LT5HZXRUeXBlKCkpKSB7CisgICAgICAgIEFJRExfRVJST1IodikgPDwgIlRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJyIgPDwgdGhpcy0+R2V0TmFtZSgpIDw8ICInIGhhcyBhICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAibm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIiA8PCB2LT5HZXROYW1lKCkgPDwgIi4iOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKApAQCAtMTA1NywxNiArMTQ1Niw2IEBACiAKICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKIAotICBpZiAoSXNGaXhlZFNpemUoKSkgewotICAgIGZvciAoY29uc3QgYXV0byYgdiA6IEdldEZpZWxkcygpKSB7Ci0gICAgICBpZiAoIXR5cGVuYW1lcy5DYW5CZUZpeGVkU2l6ZSh2LT5HZXRUeXBlKCkpKSB7Ci0gICAgICAgIEFJRExfRVJST1IodikgPDwgIlRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJyIgPDwgdGhpcy0+R2V0TmFtZSgpIDw8ICInIGhhcyBhICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCAibm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIiA8PCB2LT5HZXROYW1lKCkgPDwgIi4iOwotICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KICAgaWYgKElzSmF2YU9ubHlJbW11dGFibGUoKSkgewogICAgIC8vIEltbXV0YWJsZSBwYXJjZWxhYmxlcyBwcm92aWRlIGdldHRlcnMKICAgICBpZiAoIUNoZWNrVmFsaWRGb3JHZXR0ZXJOYW1lcygpKSB7CkBAIC0xMDc4LDczICsxNDY3LDEyIEBACiB9CiAKIC8vIFRPRE86IHdlIHNob3VsZCB0cmVhdCBldmVyeSBiYWNrZW5kIGFsbCB0aGUgc2FtZSBpbiBmdXR1cmUuCi1ib29sIEFpZGxUeXBlU3BlY2lmaWVyOjpMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCB7Ci0gIGlmIChJc0dlbmVyaWMoKSkgewotICAgIGNvbnN0IGF1dG8mIHR5cGVzID0gR2V0VHlwZVBhcmFtZXRlcnMoKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IHR5cGVzKSB7Ci0gICAgICBpZiAoIWFyZy0+TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQodHlwZW5hbWVzLCBsYW5nKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKChsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpOREsgfHwgbGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCkgJiYgSXNBcnJheSgpICYmCi0gICAgICBHZXROYW1lKCkgPT0gIklCaW5kZXIiKSB7Ci0gICAgQUlETF9FUlJPUih0aGlzKSA8PCAiVGhlICIgPDwgdG9fc3RyaW5nKGxhbmcpIDw8ICIgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IGFycmF5IG9mIElCaW5kZXIiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAobGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCAmJiBHZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7Ci0gICAgLy8gVE9ETyhiLzE0NjYxMTg1NSk6IFJlbW92ZSBpdCB3aGVuIFJ1c3QgYmFja2VuZCBzdXBwb3J0cyBQYXJjZWxhYmxlSG9sZGVyCi0gICAgQUlETF9FUlJPUih0aGlzKSA8PCAiVGhlIFJ1c3QgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IFBhcmNlbGFibGVIb2xkZXIgeWV0LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICgobGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6TkRLIHx8IGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpICYmIElzQXJyYXkoKSAmJgotICAgICAgSXNOdWxsYWJsZSgpKSB7Ci0gICAgaWYgKEdldE5hbWUoKSA9PSAiUGFyY2VsRmlsZURlc2NyaXB0b3IiKSB7Ci0gICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJUaGUgIiA8PCB0b19zdHJpbmcobGFuZykKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgbnVsbGFibGUgYXJyYXkgb2YgUGFyY2VsRmlsZURlc2NyaXB0b3IiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZW5hbWVzLlRyeUdldERlZmluZWRUeXBlKEdldE5hbWUoKSk7Ci0gICAgaWYgKGRlZmluZWRfdHlwZSAhPSBudWxscHRyICYmIGRlZmluZWRfdHlwZS0+QXNQYXJjZWxhYmxlKCkgIT0gbnVsbHB0cikgewotICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCAiVGhlICIgPDwgdG9fc3RyaW5nKGxhbmcpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IG51bGxhYmxlIGFycmF5IG9mIHBhcmNlbGFibGUiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQorYm9vbCBBaWRsVHlwZVNwZWNpZmllcjo6TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3QgewogICBpZiAodGhpcy0+R2V0TmFtZSgpID09ICJGaWxlRGVzY3JpcHRvciIgJiYKICAgICAgIChsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpOREsgfHwgbGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCkpIHsKICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJGaWxlRGVzY3JpcHRvciBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlICIgPDwgdG9fc3RyaW5nKGxhbmcpIDw8ICIgYmFja2VuZC4iOwogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAodGhpcy0+SXNHZW5lcmljKCkpIHsKLSAgICBpZiAodGhpcy0+R2V0TmFtZSgpID09ICJMaXN0IikgewotICAgICAgaWYgKGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESykgewotICAgICAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgY29udGFpbmVkX3R5cGUgPSAqR2V0VHlwZVBhcmFtZXRlcnMoKVswXTsKLSAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250YWluZWRfdHlwZV9uYW1lID0gY29udGFpbmVkX3R5cGUuR2V0TmFtZSgpOwotICAgICAgICBpZiAodHlwZW5hbWVzLkdldEludGVyZmFjZShjb250YWluZWRfdHlwZSkpIHsKLSAgICAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJMaXN0PCIgPDwgY29udGFpbmVkX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIj4gaXMgbm90IHN1cHBvcnRlZC4gTGlzdCBpbiBOREsgZG9lc24ndCBzdXBwb3J0IGludGVyZmFjZS4iOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGFpbmVkX3R5cGVfbmFtZSA9PSAiSUJpbmRlciIpIHsKLSAgICAgICAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJMaXN0PCIgPDwgY29udGFpbmVkX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIj4gaXMgbm90IHN1cHBvcnRlZC4gTGlzdCBpbiBOREsgZG9lc24ndCBzdXBwb3J0IElCaW5kZXIuIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAodGhpcy0+SXNBcnJheSgpKSB7Ci0gICAgaWYgKHRoaXMtPkdldE5hbWUoKSA9PSAiTGlzdCIgfHwgdGhpcy0+R2V0TmFtZSgpID09ICJNYXAiIHx8Ci0gICAgICAgIHRoaXMtPkdldE5hbWUoKSA9PSAiQ2hhclNlcXVlbmNlIikgewotICAgICAgQUlETF9FUlJPUih0aGlzKSA8PCB0aGlzLT5HZXROYW1lKCkgPDwgIltdIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KIAogICBpZiAobGFuZyAhPSBPcHRpb25zOjpMYW5ndWFnZTo6SkFWQSkgewogICAgIGlmICh0aGlzLT5HZXROYW1lKCkgPT0gIkxpc3QiICYmICF0aGlzLT5Jc0dlbmVyaWMoKSkgewpAQCAtMTE2MSwzMyArMTQ4OSwxNyBAQAogfQogCiAvLyBUT0RPOiB3ZSBzaG91bGQgdHJlYXQgZXZlcnkgYmFja2VuZCBhbGwgdGhlIHNhbWUgaW4gZnV0dXJlLgotYm9vbCBBaWRsUGFyY2VsYWJsZTo6TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgLyp0eXBlbmFtZXMqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IHsKLSAgaWYgKGxhbmcgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCB8fCBsYW5nID09IE9wdGlvbnM6Okxhbmd1YWdlOjpOREspIHsKLSAgICBjb25zdCBBaWRsUGFyY2VsYWJsZSogdW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUgPSB0aGlzLT5Bc1Vuc3RydWN0dXJlZFBhcmNlbGFibGUoKTsKLSAgICBpZiAodW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgICAgaWYgKHVuc3RydWN0dXJlZF9wYXJjZWxhYmxlLT5HZXRDcHBIZWFkZXIoKS5lbXB0eSgpKSB7Ci0gICAgICAgIEFJRExfRVJST1IodW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGUpCi0gICAgICAgICAgICA8PCAiVW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGUgbXVzdCBoYXZlIEMrKyBoZWFkZXIgZGVmaW5lZC4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Citib29sIEFpZGxEZWZpbmVkVHlwZTo6TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3QgeworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBWaXNpdG9yKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIDogbGFuZyhsYW5nKSB7fQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIG92ZXJyaWRlIHsKKyAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIHR5cGUuTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQobGFuZyk7CiAgICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUT0RPOiB3ZSBzaG91bGQgdHJlYXQgZXZlcnkgYmFja2VuZCBhbGwgdGhlIHNhbWUgaW4gZnV0dXJlLgotYm9vbCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCB7Ci0gIGlmICghQWlkbFBhcmNlbGFibGU6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKHR5cGVuYW1lcywgbGFuZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiB2IDogdGhpcy0+R2V0RmllbGRzKCkpIHsKLSAgICBpZiAoIXYtPkdldFR5cGUoKS5MYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZCh0eXBlbmFtZXMsIGxhbmcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOworICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmc7CisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgfSB2KGxhbmcpOworICBWaXNpdFRvcERvd24odiwgKnRoaXMpOworICByZXR1cm4gdi5zdWNjZXNzOwogfQogCiBBaWRsRW51bWVyYXRvcjo6QWlkbEVudW1lcmF0b3IoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCkBAIC0xMjUyLDE2ICsxNTY0LDIwIEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGF1dG8gdHlwZSA9IGFubm90LT5QYXJhbVZhbHVlPHN0ZDo6c3RyaW5nPigidHlwZSIpLnZhbHVlKCk7Ci0gICAgYmFja2luZ190eXBlXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QWlkbFR5cGVTcGVjaWZpZXI+KGFubm90LT5HZXRMb2NhdGlvbigpLCB0eXBlLCBmYWxzZSwgbnVsbHB0ciwgQ29tbWVudHN7fSk7CisgICAgYmFja2luZ190eXBlXyA9IHR5cGVuYW1lcy5NYWtlUmVzb2x2ZWRUeXBlKGFubm90LT5HZXRMb2NhdGlvbigpLCB0eXBlLCBmYWxzZSk7CiAgIH0gZWxzZSB7CiAgICAgLy8gRGVmYXVsdCB0byBieXRlIHR5cGUgZm9yIGVudW1zLgotICAgIGJhY2tpbmdfdHlwZV8gPQotICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxUeXBlU3BlY2lmaWVyPihBSURMX0xPQ0FUSU9OX0hFUkUsICJieXRlIiwgZmFsc2UsIG51bGxwdHIsIENvbW1lbnRze30pOworICAgIGJhY2tpbmdfdHlwZV8gPSB0eXBlbmFtZXMuTWFrZVJlc29sdmVkVHlwZShHZXRMb2NhdGlvbigpLCAiYnl0ZSIsIGZhbHNlKTsKICAgfQotICAvLyBBdXRvZmlsbCgpIGlzIGNhbGxlZCBhZnRlciB0eXBlIHJlc29sdXRpb24sIHdlIHJlc29sdmUgdGhlIGJhY2tpbmcgdHlwZSBtYW51YWxseS4KLSAgaWYgKCFiYWNraW5nX3R5cGVfLT5SZXNvbHZlKHR5cGVuYW1lcykpIHsKLSAgICBBSURMX0VSUk9SKHRoaXMpIDw8ICJJbnZhbGlkIGJhY2tpbmcgdHlwZTogIiA8PCBiYWNraW5nX3R5cGVfLT5HZXROYW1lKCk7CisKKyAgLy8gd2Ugb25seSBzdXBwb3J0L3Rlc3QgYSBmZXcgYmFja2luZyB0eXBlcywgc28gbWFrZSBzdXJlIHRoaXMgaXMgYSBzdXBwb3J0ZWQKKyAgLy8gb25lIChvdGhlcndpc2UgYm9vbGVhbiBtaWdodCB3b3JrLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQvdGVzdGVkIGluIGFsbAorICAvLyBiYWNrZW5kcykKKyAgc3RhdGljIHN0ZDo6c2V0PHN0cmluZz4ga0JhY2tpbmdUeXBlcyA9IHsiYnl0ZSIsICJpbnQiLCAibG9uZyJ9OworICBpZiAoa0JhY2tpbmdUeXBlcy5maW5kKGJhY2tpbmdfdHlwZV8tPkdldE5hbWUoKSkgPT0ga0JhY2tpbmdUeXBlcy5lbmQoKSkgeworICAgIEFJRExfRVJST1IodGhpcykgPDwgIkludmFsaWQgYmFja2luZyB0eXBlOiAiIDw8IGJhY2tpbmdfdHlwZV8tPkdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIi4gQmFja2luZyB0eXBlIG11c3QgYmUgb25lIG9mOiAiIDw8IEpvaW4oa0JhY2tpbmdUeXBlcywgIiwgIik7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMTM0NSwzNiArMTY2MSw2IEBACiAgIHJldHVybiBzdWNjZXNzOwogfQogCi0vLyBUT0RPOiB3ZSBzaG91bGQgdHJlYXQgZXZlcnkgYmFja2VuZCBhbGwgdGhlIHNhbWUgaW4gZnV0dXJlLgotYm9vbCBBaWRsVW5pb25EZWNsOjpMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IHsKLSAgaWYgKCFBaWRsUGFyY2VsYWJsZTo6TGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQodHlwZW5hbWVzLCBsYW5nKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmb3IgKGNvbnN0IGF1dG8mIHYgOiB0aGlzLT5HZXRGaWVsZHMoKSkgewotICAgIGlmICghdi0+R2V0VHlwZSgpLkxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKHR5cGVuYW1lcywgbGFuZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRPRE86IHdlIHNob3VsZCB0cmVhdCBldmVyeSBiYWNrZW5kIGFsbCB0aGUgc2FtZSBpbiBmdXR1cmUuCi1ib29sIEFpZGxJbnRlcmZhY2U6Okxhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3QgewotICBmb3IgKGNvbnN0IGF1dG8mIG0gOiB0aGlzLT5HZXRNZXRob2RzKCkpIHsKLSAgICBpZiAoIW0tPkdldFR5cGUoKS5MYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZCh0eXBlbmFtZXMsIGxhbmcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogbS0+R2V0QXJndW1lbnRzKCkpIHsKLSAgICAgIGlmICghYXJnLT5HZXRUeXBlKCkuTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQodHlwZW5hbWVzLCBsYW5nKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCiBBaWRsSW50ZXJmYWNlOjpBaWRsSW50ZXJmYWNlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMsIGJvb2wgb25ld2F5LCBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+PiogbWVtYmVycykKQEAgLTEzOTEsNTIgKzE2NzcsMTAgQEAKICAgLy8gSGFzIHRvIGJlIGEgcG9pbnRlciBkdWUgdG8gZGVsZXRpbmcgY29weSBjb25zdHJ1Y3Rvci4gTm8gaWRlYSB3aHkuCiAgIG1hcDxzdHJpbmcsIGNvbnN0IEFpZGxNZXRob2QqPiBtZXRob2RfbmFtZXM7CiAgIGZvciAoY29uc3QgYXV0byYgbSA6IEdldE1ldGhvZHMoKSkgewotICAgIGlmICghbS0+R2V0VHlwZSgpLkNoZWNrVmFsaWQodHlwZW5hbWVzKSkgeworICAgIGlmICghbS0+Q2hlY2tWYWxpZCh0eXBlbmFtZXMpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gVE9ETyhiLzE1Njg3MjU4Mik6IFN1cHBvcnQgaXQgd2hlbiBQYXJjZWxhYmxlSG9sZGVyIHN1cHBvcnRzIGV2ZXJ5IGJhY2tlbmQuCi0gICAgaWYgKG0tPkdldFR5cGUoKS5HZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7Ci0gICAgICBBSURMX0VSUk9SKG0pIDw8ICJQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBhIHJldHVybiB0eXBlIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG0tPklzT25ld2F5KCkgJiYgbS0+R2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKLSAgICAgIEFJRExfRVJST1IobSkgPDwgIm9uZXdheSBtZXRob2QgJyIgPDwgbS0+R2V0TmFtZSgpIDw8ICInIGNhbm5vdCByZXR1cm4gYSB2YWx1ZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2V0PHN0cmluZz4gYXJndW1lbnRfbmFtZXM7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiBtLT5HZXRBcmd1bWVudHMoKSkgewotICAgICAgYXV0byBpdCA9IGFyZ3VtZW50X25hbWVzLmZpbmQoYXJnLT5HZXROYW1lKCkpOwotICAgICAgaWYgKGl0ICE9IGFyZ3VtZW50X25hbWVzLmVuZCgpKSB7Ci0gICAgICAgIEFJRExfRVJST1IobSkgPDwgIm1ldGhvZCAnIiA8PCBtLT5HZXROYW1lKCkgPDwgIicgaGFzIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lICciCi0gICAgICAgICAgICAgICAgICAgICAgPDwgYXJnLT5HZXROYW1lKCkgPDwgIiciOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBhcmd1bWVudF9uYW1lcy5pbnNlcnQoYXJnLT5HZXROYW1lKCkpOwotCi0gICAgICBpZiAoIWFyZy0+Q2hlY2tWYWxpZCh0eXBlbmFtZXMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKG0tPklzT25ld2F5KCkgJiYgYXJnLT5Jc091dCgpKSB7Ci0gICAgICAgIEFJRExfRVJST1IobSkgPDwgIm9uZXdheSBtZXRob2QgJyIgPDwgbS0+R2V0TmFtZSgpIDw8ICInIGNhbm5vdCBoYXZlIG91dCBwYXJhbWV0ZXJzIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvLyBjaGVjayB0aGF0IHRoZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggYSBrZXl3b3JkCi0gICAgICBpZiAoSXNKYXZhS2V5d29yZChhcmctPkdldE5hbWUoKS5jX3N0cigpKSkgewotICAgICAgICBBSURMX0VSUk9SKGFyZykgPDwgIkFyZ3VtZW50IG5hbWUgaXMgYSBKYXZhIG9yIGFpZGwga2V5d29yZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy8gUmVzZXJ2ZSBhIG5hbWVzcGFjZSBmb3IgaW50ZXJuYWwgdXNlCi0gICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChhcmctPkdldE5hbWUoKSwgIl9haWRsIikpIHsKLSAgICAgICAgQUlETF9FUlJPUihhcmcpIDw8ICJBcmd1bWVudCBuYW1lIGNhbm5vdCBiZWdpbiB3aXRoICdfYWlkbCciOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCiAgICAgYXV0byBpdCA9IG1ldGhvZF9uYW1lcy5maW5kKG0tPkdldE5hbWUoKSk7CiAgICAgLy8gcHJldmVudCBkdXBsaWNhdGUgbWV0aG9kcwogICAgIGlmIChpdCA9PSBtZXRob2RfbmFtZXMuZW5kKCkpIHsKQEAgLTE0NTQsNiArMTY5OCwxMCBAQAogICAgICAgQUlETF9FUlJPUihtKSA8PCAiIG1ldGhvZCAiIDw8IG0tPlNpZ25hdHVyZSgpIDw8ICIgaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4iOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIGlmICghQ2hlY2tWYWxpZFBlcm1pc3Npb25Bbm5vdGF0aW9ucygqbS5nZXQoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgIH0KIAogICBib29sIHN1Y2Nlc3MgPSB0cnVlOwpAQCAtMTQ2OSw2ICsxNzE3LDMxIEBACiAgIHJldHVybiBzdWNjZXNzOwogfQogCitib29sIEFpZGxJbnRlcmZhY2U6OkNoZWNrVmFsaWRQZXJtaXNzaW9uQW5ub3RhdGlvbnMoY29uc3QgQWlkbE1ldGhvZCYgbSkgY29uc3QgeworICBpZiAoSXNQZXJtaXNzaW9uTm9uZSgpIHx8IElzUGVybWlzc2lvbk1hbnVhbCgpKSB7CisgICAgaWYgKG0uR2V0VHlwZSgpLklzUGVybWlzc2lvbk5vbmUoKSB8fCBtLkdldFR5cGUoKS5Jc1Blcm1pc3Npb25NYW51YWwoKSB8fAorICAgICAgICBtLkdldFR5cGUoKS5FbmZvcmNlRXhwcmVzc2lvbigpKSB7CisgICAgICBzdGQ6OnN0cmluZyBpbnRlcmZhY2VfYW5ub3RhdGlvbiA9IElzUGVybWlzc2lvbk5vbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAicmVxdWlyaW5nIG5vIHBlcm1pc3Npb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtYW51YWxseSBpbXBsZW1lbnRpbmcgcGVybWlzc2lvbiBjaGVja3MiOworICAgICAgQUlETF9FUlJPUihtKSA8PCAiVGhlIGludGVyZmFjZSAiIDw8IEdldE5hbWUoKSA8PCAiIGlzIGFubm90YXRlZCBhcyAiIDw8IGludGVyZmFjZV9hbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIDw8ICIgYnV0IHRoZSBtZXRob2QgIiA8PCBtLkdldE5hbWUoKSA8PCAiIGlzIGFsc28gYW5ub3RhdGVkLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiQ29uc2lkZXIgZGlzdHJpYnV0aW5nIHRoZSBhbm5vdGF0aW9uIHRvIGVhY2ggbWV0aG9kLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgaWYgKEVuZm9yY2VFeHByZXNzaW9uKCkpIHsKKyAgICBpZiAobS5HZXRUeXBlKCkuSXNQZXJtaXNzaW9uTm9uZSgpIHx8IG0uR2V0VHlwZSgpLklzUGVybWlzc2lvbk1hbnVhbCgpKSB7CisgICAgICBBSURMX0VSUk9SKG0pIDw8ICJUaGUgaW50ZXJmYWNlICIgPDwgR2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgZW5mb3JjZXMgcGVybWlzc2lvbnMgdXNpbmcgYW5ub3RhdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHRoZSBtZXRob2QgIgorICAgICAgICAgICAgICAgICAgICA8PCBtLkdldE5hbWUoKSA8PCAiIGlzIGFsc28gYW5ub3RhdGVkLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiQ29uc2lkZXIgZGlzdHJpYnV0aW5nIHRoZSBhbm5vdGF0aW9uIHRvIGVhY2ggbWV0aG9kLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCiBzdGQ6OnN0cmluZyBBaWRsSW50ZXJmYWNlOjpHZXREZXNjcmlwdG9yKCkgY29uc3QgewogICBzdGQ6OnN0cmluZyBhbm5vdGF0ZWREZXNjcmlwdG9yID0gQWlkbEFubm90YXRhYmxlOjpHZXREZXNjcmlwdG9yKCk7CiAgIGlmIChhbm5vdGF0ZWREZXNjcmlwdG9yICE9ICIiKSB7CkBAIC0xNDc3LDM1ICsxNzUwLDQ5IEBACiAgIHJldHVybiBHZXRDYW5vbmljYWxOYW1lKCk7CiB9CiAKLUFpZGxJbXBvcnQ6OkFpZGxJbXBvcnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5lZWRlZF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKQotICAgIDogQWlkbE5vZGUobG9jYXRpb24sIGNvbW1lbnRzKSwgbmVlZGVkX2NsYXNzXyhuZWVkZWRfY2xhc3MpIHt9CitBaWRsRG9jdW1lbnQ6OkFpZGxEb2N1bWVudChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdHJpbmc+IGltcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4gZGVmaW5lZF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJlcHJvY2Vzc2VkKQorICAgIDogQWlkbENvbW1lbnRhYmxlKGxvY2F0aW9uLCBjb21tZW50cyksCisgICAgICBBaWRsU2NvcGUodGhpcyksCisgICAgICBpbXBvcnRzXyhzdGQ6Om1vdmUoaW1wb3J0cykpLAorICAgICAgZGVmaW5lZF90eXBlc18oc3RkOjptb3ZlKGRlZmluZWRfdHlwZXMpKSwKKyAgICAgIGlzX3ByZXByb2Nlc3NlZF8oaXNfcHJlcHJvY2Vzc2VkKSB7CisgIGZvciAoY29uc3QgYXV0byYgdCA6IGRlZmluZWRfdHlwZXNfKSB7CisgICAgdC0+U2V0RW5jbG9zaW5nU2NvcGUodGhpcyk7CisgIH0KK30KIAotLy8gUmVzb2x2ZXMgdW5yZXNvbHZlZCB0eXBlIG5hbWUgdG8gZnVsbHkgcXVhbGlmaWVkIHR5cGVuYW1lIHRvIGltcG9ydAotLy8gY2FzZSAjMTogU2ltcGxlTmFtZSAtLT4gaW1wb3J0IHAuU2ltcGxlTmFtZQotLy8gY2FzZSAjMjogT3V0ZXIuSW5uZXIgLS0+IGltcG9ydCBwLk91dGVyCi0vLyBjYXNlICMzOiBwLlNpbXBsZU5hbWUgLS0+IChhcyBpcykKLXN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEFpZGxEb2N1bWVudDo6UmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHVucmVzb2x2ZWRfbmFtZSkgY29uc3QgewotICBzdGQ6OnN0cmluZyBjYW5vbmljYWxfbmFtZTsKLSAgY29uc3QgYXV0byBmaXJzdF9kb3QgPSB1bnJlc29sdmVkX25hbWUuZmluZF9maXJzdF9vZignLicpOworLy8gUmVzb2x2ZXMgdHlwZSBuYW1lIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LgorLy8gLSBidWlsdC1pbiB0eXBlcworLy8gLSBpbXBvcnRlZCB0eXBlcworLy8gLSB0b3AtbGV2ZWwgdHlwZQorc3RkOjpzdHJpbmcgQWlkbERvY3VtZW50OjpSZXNvbHZlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgeworICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUobmFtZSkpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIGNvbnN0IGF1dG8gZmlyc3RfZG90ID0gbmFtZS5maW5kX2ZpcnN0X29mKCcuJyk7CisgIC8vIEZvciAiT3V0ZXIuSW5uZXIiLCB3ZSBsb29rIHVwICJPdXRlciIgaW4gdGhlIGltcG9ydCBsaXN0LgogICBjb25zdCBzdGQ6OnN0cmluZyBjbGFzc19uYW1lID0KLSAgICAgIChmaXJzdF9kb3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gdW5yZXNvbHZlZF9uYW1lIDogdW5yZXNvbHZlZF9uYW1lLnN1YnN0cigwLCBmaXJzdF9kb3QpOworICAgICAgKGZpcnN0X2RvdCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgPyBuYW1lIDogbmFtZS5zdWJzdHIoMCwgZmlyc3RfZG90KTsKKyAgLy8gS2VlcCAiLklubmVyIiwgdG8gbWFrZSBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5lc3RlZF90eXBlID0gKGZpcnN0X2RvdCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgPyAiIiA6IG5hbWUuc3Vic3RyKGZpcnN0X2RvdCk7CisKICAgZm9yIChjb25zdCBhdXRvJiBpbXBvcnQgOiBJbXBvcnRzKCkpIHsKLSAgICBjb25zdCBhdXRvJiBmcV9uYW1lID0gaW1wb3J0LT5HZXROZWVkZWRDbGFzcygpOwotICAgIGNvbnN0IGF1dG8gbGFzdF9kb3QgPSBmcV9uYW1lLmZpbmRfbGFzdF9vZignLicpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGltcG9ydGVkX3R5cGVfbmFtZSA9Ci0gICAgICAgIChsYXN0X2RvdCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgPyBmcV9uYW1lIDogZnFfbmFtZS5zdWJzdHIobGFzdF9kb3QgKyAxKTsKLSAgICBpZiAoaW1wb3J0ZWRfdHlwZV9uYW1lID09IGNsYXNzX25hbWUpIHsKLSAgICAgIGlmIChjYW5vbmljYWxfbmFtZSAhPSAiIiAmJiBjYW5vbmljYWxfbmFtZSAhPSBmcV9uYW1lKSB7Ci0gICAgICAgIEFJRExfRVJST1IoaW1wb3J0KSA8PCAiQW1iaWd1b3VzIHR5cGU6ICIgPDwgY2Fub25pY2FsX25hbWUgPDwgIiB2cy4gIiA8PCBmcV9uYW1lOwotICAgICAgICByZXR1cm4ge307Ci0gICAgICB9Ci0gICAgICBjYW5vbmljYWxfbmFtZSA9IGZxX25hbWU7CisgICAgaWYgKFNpbXBsZU5hbWUoaW1wb3J0KSA9PSBjbGFzc19uYW1lKSB7CisgICAgICByZXR1cm4gaW1wb3J0ICsgbmVzdGVkX3R5cGU7CiAgICAgfQogICB9Ci0gIC8vIGlmIG5vdCBmb3VuZCwgdXNlIHVucmVzb2x2ZWRfbmFtZSBhcyBpdCBpcwotICBpZiAoY2Fub25pY2FsX25hbWUgPT0gIiIpIHsKLSAgICByZXR1cm4gdW5yZXNvbHZlZF9uYW1lOworCisgIC8vIGNoZWNrIGlmIGl0IGlzIGEgdG9wLWxldmVsIHR5cGUuCisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IERlZmluZWRUeXBlcygpKSB7CisgICAgaWYgKHR5cGUtPkdldE5hbWUoKSA9PSBjbGFzc19uYW1lKSB7CisgICAgICByZXR1cm4gdHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpICsgbmVzdGVkX3R5cGU7CisgICAgfQogICB9Ci0gIHJldHVybiBjYW5vbmljYWxfbmFtZTsKKworICAvLyBuYW1lIGl0c2VsZiBtaWdodCBiZSBmdWxseS1xdWFsaWZpZWQgbmFtZS4KKyAgcmV0dXJuIG5hbWU7CiB9CmRpZmYgLS1naXQgYS9haWRsX2xhbmd1YWdlLmggYi9haWRsX2xhbmd1YWdlLmgKaW5kZXggOTMxYzYwNi4uYzczNjE4ZiAxMDA2NDQKLS0tIGEvYWlkbF9sYW5ndWFnZS5oCisrKyBiL2FpZGxfbGFuZ3VhZ2UuaApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxyZWdleD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2YXJpYW50PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogCiAjaW5jbHVkZSAiYWlkbF90eXBlbmFtZXMuaCIKQEAgLTMyLDExICszNCwxMyBAQAogI2luY2x1ZGUgImxvY2F0aW9uLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJwZXJtaXNzaW9uLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OkFpZGxUeXBlbmFtZXM7CiB1c2luZyBhbmRyb2lkOjphaWRsOjpDb2RlV3JpdGVyOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6Q29tbWVudHM7CiB1c2luZyBhbmRyb2lkOjphaWRsOjpPcHRpb25zOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVzdWx0OwogdXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CkBAIC03OCw4ICs4Miw2IEBACiBib29sIFBhcnNlRmxvYXRpbmcoc3RkOjpzdHJpbmdfdmlldyBzdiwgZmxvYXQqIHBhcnNlZCk7CiAKIGNsYXNzIEFpZGxEb2N1bWVudDsKLWNsYXNzIEFpZGxQYWNrYWdlOwotY2xhc3MgQWlkbEltcG9ydDsKIGNsYXNzIEFpZGxJbnRlcmZhY2U7CiBjbGFzcyBBaWRsUGFyY2VsYWJsZTsKIGNsYXNzIEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZTsKQEAgLTExNyw4ICsxMTksMjMgQEAKICAgdmlydHVhbCB2b2lkIFZpc2l0KGNvbnN0IEFpZGxVbmFyeUNvbnN0RXhwcmVzc2lvbiYpIHt9CiAgIHZpcnR1YWwgdm9pZCBWaXNpdChjb25zdCBBaWRsQmluYXJ5Q29uc3RFeHByZXNzaW9uJikge30KICAgdmlydHVhbCB2b2lkIFZpc2l0KGNvbnN0IEFpZGxBbm5vdGF0aW9uJikge30KLSAgdmlydHVhbCB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbXBvcnQmKSB7fQotICB2aXJ0dWFsIHZvaWQgVmlzaXQoY29uc3QgQWlkbFBhY2thZ2UmKSB7fQorfTsKKworY2xhc3MgQWlkbFNjb3BlIHsKKyBwdWJsaWM6CisgIEFpZGxTY29wZShjb25zdCBBaWRsTm9kZSogc2VsZikgOiBzZWxmXyhzZWxmKSB7fQorICB2aXJ0dWFsIH5BaWRsU2NvcGUoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgUmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0ID0gMDsKKyAgdm9pZCBTZXRFbmNsb3NpbmdTY29wZShjb25zdCBBaWRsU2NvcGUqIGVuY2xvc2luZykgeworICAgIEFJRExfRkFUQUxfSUYoZW5jbG9zaW5nXywgQUlETF9MT0NBVElPTl9IRVJFKSA8PCAiU2V0RW5jbG9zaW5nU2NvcGUgY2FuIGJlIHNldCBvbmx5IG9uY2UuIjsKKyAgICBlbmNsb3NpbmdfID0gZW5jbG9zaW5nOworICB9CisgIGNvbnN0IEFpZGxTY29wZSogR2V0RW5jbG9zaW5nU2NvcGUoKSBjb25zdCB7IHJldHVybiBlbmNsb3NpbmdfOyB9CisgIGNvbnN0IEFpZGxOb2RlJiBHZXROb2RlKCkgY29uc3QgeyByZXR1cm4gKnNlbGZfOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBBaWRsTm9kZSogc2VsZl87CisgIGNvbnN0IEFpZGxTY29wZSogZW5jbG9zaW5nXyA9IG51bGxwdHI7CiB9OwogCiAvLyBBbnl0aGluZyB0aGF0IGlzIGxvY2F0YWJsZSBpbiBhIC5haWRsIGZpbGUuCkBAIC0xMjYsOSArMTQzLDEwIEBACiAgcHVibGljOgogICBBaWRsTm9kZShjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMgPSB7fSk7CiAKLSAgQWlkbE5vZGUoY29uc3QgQWlkbE5vZGUmKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkFpZGxOb2RlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5BaWRsTm9kZSgpOwogCisgIEFpZGxOb2RlKEFpZGxOb2RlJikgPSBkZWxldGU7CisgIEFpZGxOb2RlJiBvcGVyYXRvcj0oQWlkbE5vZGUmKSA9IGRlbGV0ZTsKICAgQWlkbE5vZGUoQWlkbE5vZGUmJikgPSBkZWxldGU7CiAgIEFpZGxOb2RlJiBvcGVyYXRvcj0oQWlkbE5vZGUmJikgPSBkZWxldGU7CiAKQEAgLTE0NCwxMSArMTYyLDE5IEBACiAgIGNvbnN0IENvbW1lbnRzJiBHZXRDb21tZW50cygpIGNvbnN0IHsgcmV0dXJuIGNvbW1lbnRzXzsgfQogICB2b2lkIFNldENvbW1lbnRzKGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykgeyBjb21tZW50c18gPSBjb21tZW50czsgfQogCisgIHN0YXRpYyB2b2lkIENsZWFyVW52aXNpdGVkTm9kZXMoKTsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEFpZGxMb2NhdGlvbj4mIEdldExvY2F0aW9uc09mVW52aXNpdGVkTm9kZXMoKTsKKyAgdm9pZCBNYXJrVmlzaXRlZCgpIGNvbnN0OworCiAgcHJpdmF0ZToKICAgc3RkOjpzdHJpbmcgUHJpbnRMaW5lKCkgY29uc3Q7CiAgIHN0ZDo6c3RyaW5nIFByaW50TG9jYXRpb24oKSBjb25zdDsKICAgY29uc3QgQWlkbExvY2F0aW9uIGxvY2F0aW9uXzsKICAgQ29tbWVudHMgY29tbWVudHNfOworCisgIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBhYm9ydCBpZiB0eXBlcyBhcmUgbm90IHZpc2l0ZWQKKyAgbXV0YWJsZSBib29sIHZpc2l0ZWRfID0gZmFsc2U7CisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxBaWRsTG9jYXRpb24+IHVudmlzaXRlZF9sb2NhdGlvbnNfOwogfTsKIAogLy8gdW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4gZm9yIHR5cGUgYXJ1Z21lbnQsCkBAIC0xNzAsOSArMTk2LDYgQEAKIAogICB2aXJ0dWFsIGNvbnN0IEFpZGxOb2RlJiBBc0FpZGxOb2RlKCkgY29uc3QgPSAwOwogCi0gcHJvdGVjdGVkOgotICBBaWRsUGFyYW1ldGVyaXphYmxlKGNvbnN0IEFpZGxQYXJhbWV0ZXJpemFibGUmKTsKLQogIHByaXZhdGU6CiAgIHVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8VD4+IHR5cGVfcGFyYW1zXzsKICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgdW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4+Ojp2YWx1ZSB8fApAQCAtMTkzLDggKzIxNiw5IEBACiAKIC8vIFRyYW5zZm9ybXMgYSB2YWx1ZSBzdHJpbmcgaW50byBhIGxhbmd1YWdlIHNwZWNpZmljIGZvcm0uIFJhdyB2YWx1ZSBhcyBwcm9kdWNlZCBieQogLy8gQWlkbENvbnN0YW50VmFsdWUuCi11c2luZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yID0KLSAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c3RyaW5nKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKT47Cit1c2luZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yID0gc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSk+OwogCiBjbGFzcyBBaWRsQW5ub3RhdGlvbiA6IHB1YmxpYyBBaWRsTm9kZSB7CiAgcHVibGljOgpAQCAtMjA5LDExICsyMzMsMTggQEAKICAgICBTRU5TSVRJVkVfREFUQSwKICAgICBKQVZBX1BBU1NUSFJPVUdILAogICAgIEpBVkFfREVSSVZFLAorICAgIEpBVkFfREVGQVVMVCwKKyAgICBKQVZBX0RFTEVHQVRPUiwKICAgICBKQVZBX09OTFlfSU1NVVRBQkxFLAorICAgIEpBVkFfU1VQUFJFU1NfTElOVCwKICAgICBGSVhFRF9TSVpFLAogICAgIERFU0NSSVBUT1IsCiAgICAgUlVTVF9ERVJJVkUsCiAgICAgU1VQUFJFU1NfV0FSTklOR1MsCisgICAgUEVSTUlTU0lPTl9FTkZPUkNFLAorICAgIFBFUk1JU1NJT05fTk9ORSwKKyAgICBQRVJNSVNTSU9OX01BTlVBTCwKKyAgICBQUk9QQUdBVEVfQUxMT1dfQkxPQ0tJTkcsCiAgIH07CiAKICAgdXNpbmcgVGFyZ2V0Q29udGV4dCA9IHVpbnQxNl90OwpAQCAtMjM1LDEyICsyNjYsMTEgQEAKIAogICBzdGF0aWMgc3RkOjpzdHJpbmcgVHlwZVRvU3RyaW5nKFR5cGUgdHlwZSk7CiAKLSAgc3RhdGljIEFpZGxBbm5vdGF0aW9uKiBQYXJzZSgKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4gUGFyc2UoCiAgICAgICBjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4qIHBhcmFtZXRlcl9saXN0LAorICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4+IHBhcmFtZXRlcl9saXN0LAogICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKTsKIAotICBBaWRsQW5ub3RhdGlvbihjb25zdCBBaWRsQW5ub3RhdGlvbiYpID0gZGVmYXVsdDsKICAgQWlkbEFubm90YXRpb24oQWlkbEFubm90YXRpb24mJikgPSBkZWZhdWx0OwogICB2aXJ0dWFsIH5BaWRsQW5ub3RhdGlvbigpID0gZGVmYXVsdDsKICAgYm9vbCBDaGVja1ZhbGlkKCkgY29uc3Q7CkBAIC0yNjIsNiArMjkyLDggQEAKICAgdm9pZCBUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPiB0cmF2ZXJzZSkgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgRGlzcGF0Y2hWaXNpdChBaWRsVmlzaXRvciYgdikgY29uc3Qgb3ZlcnJpZGUgeyB2LlZpc2l0KCp0aGlzKTsgfQogCisgIFJlc3VsdDx1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OnBlcm06OkV4cHJlc3Npb24+PiBFbmZvcmNlRXhwcmVzc2lvbigpIGNvbnN0OworCiAgcHJpdmF0ZToKICAgc3RydWN0IFBhcmFtVHlwZSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZTsKQEAgLTI4OSw3ICszMjEsNyBAQAogICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8U2NoZW1hPiYgQWxsU2NoZW1hcygpOwogCiAgIEFpZGxBbm5vdGF0aW9uKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IFNjaGVtYSYgc2NoZW1hLAotICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4mJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4gcGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzKTsKIAogICBjb25zdCBTY2hlbWEmIHNjaGVtYV87CkBAIC0zMDcsMTYgKzMzOSwxNSBAQAogIHB1YmxpYzoKICAgQWlkbEFubm90YXRhYmxlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cyk7CiAKLSAgQWlkbEFubm90YXRhYmxlKGNvbnN0IEFpZGxBbm5vdGF0YWJsZSYpID0gZGVmYXVsdDsKLSAgQWlkbEFubm90YXRhYmxlKEFpZGxBbm5vdGF0YWJsZSYmKSA9IGRlZmF1bHQ7CiAgIHZpcnR1YWwgfkFpZGxBbm5vdGF0YWJsZSgpID0gZGVmYXVsdDsKIAotICB2b2lkIEFubm90YXRlKHZlY3RvcjxBaWRsQW5ub3RhdGlvbj4mJiBhbm5vdGF0aW9ucykgeworICB2b2lkIEFubm90YXRlKHZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+PiYmIGFubm90YXRpb25zKSB7CiAgICAgZm9yIChhdXRvJiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKICAgICAgIGFubm90YXRpb25zXy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGFubm90YXRpb24pKTsKICAgICB9CiAgIH0KICAgYm9vbCBJc051bGxhYmxlKCkgY29uc3Q7CisgIGJvb2wgSXNIZWFwTnVsbGFibGUoKSBjb25zdDsKICAgYm9vbCBJc1V0ZjhJbkNwcCgpIGNvbnN0OwogICBib29sIElzU2Vuc2l0aXZlRGF0YSgpIGNvbnN0OwogICBib29sIElzVmludGZTdGFiaWxpdHkoKSBjb25zdDsKQEAgLTMyNSw0MSArMzU2LDYxIEBACiAgIGJvb2wgSXNTdGFibGVBcGlQYXJjZWxhYmxlKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OwogICBib29sIElzSGlkZSgpIGNvbnN0OwogICBib29sIEphdmFEZXJpdmUoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgY29uc3Q7CisgIGJvb2wgSXNKYXZhRGVmYXVsdCgpIGNvbnN0OworICBib29sIElzSmF2YURlbGVnYXRvcigpIGNvbnN0OwogICBzdGQ6OnN0cmluZyBHZXREZXNjcmlwdG9yKCkgY29uc3Q7CiAKICAgY29uc3QgQWlkbEFubm90YXRpb24qIFVuc3VwcG9ydGVkQXBwVXNhZ2UoKSBjb25zdDsKICAgY29uc3QgQWlkbEFubm90YXRpb24qIFJ1c3REZXJpdmUoKSBjb25zdDsKICAgY29uc3QgQWlkbEFubm90YXRpb24qIEJhY2tpbmdUeXBlKCkgY29uc3Q7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdXBwcmVzc1dhcm5pbmdzKCkgY29uc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphaWRsOjpwZXJtOjpFeHByZXNzaW9uPiBFbmZvcmNlRXhwcmVzc2lvbigpIGNvbnN0OworICBib29sIElzUGVybWlzc2lvbk1hbnVhbCgpIGNvbnN0OworICBib29sIElzUGVybWlzc2lvbk5vbmUoKSBjb25zdDsKKyAgYm9vbCBJc1Byb3BhZ2F0ZUFsbG93QmxvY2tpbmcoKSBjb25zdDsKIAogICAvLyBUb1N0cmluZyBpcyBmb3IgZHVtcGluZyBBSURMLgogICAvLyBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbm5vdGF0aW9ucy4KICAgLy8gZS5nKSAiQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSkgQFJ1c3REZXJpdmUoQ2xvbmU9dHJ1ZSwgQ29weT10cnVlKSIKICAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKIAotICBjb25zdCB2ZWN0b3I8QWlkbEFubm90YXRpb24+JiBHZXRBbm5vdGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGFubm90YXRpb25zXzsgfQorICBjb25zdCB2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4mIEdldEFubm90YXRpb25zKCkgY29uc3QgeyByZXR1cm4gYW5ub3RhdGlvbnNfOyB9CiAgIGJvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJikgY29uc3Q7CiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGFubm90IDogR2V0QW5ub3RhdGlvbnMoKSkgewotICAgICAgdHJhdmVyc2UoYW5ub3QpOworICAgICAgdHJhdmVyc2UoKmFubm90KTsKICAgICB9CiAgIH0KIAogIHByaXZhdGU6Ci0gIHZlY3RvcjxBaWRsQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNfOworICB2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnNfOwogfTsKIAorLy8gUmVwcmVzZW50cyBgW11gCitzdHJ1Y3QgRHluYW1pY0FycmF5IHt9OworLy8gUmVwcmVzZW50cyBgW05dW01dLi5gCitzdHJ1Y3QgRml4ZWRTaXplQXJyYXkgeworICBGaXhlZFNpemVBcnJheShzdGQ6OnVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+IGRpbSkgeyBkaW1lbnNpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGltKSk7IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4gZGltZW5zaW9uczsKK307CisvLyBSZXByZXNlbnRzIGBbXWAgb3IgYFtOXWAgcGFydCBvZiB0eXBlIHNwZWNpZmllcgordXNpbmcgQXJyYXlUeXBlID0gc3RkOjp2YXJpYW50PER5bmFtaWNBcnJheSwgRml4ZWRTaXplQXJyYXk+OworCiAvLyBBaWRsVHlwZVNwZWNpZmllciByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGVpdGhlciBhIGJ1aWx0LWluIHR5cGUsCiAvLyBhIGRlZmluZWQgdHlwZSwgb3IgYSB2YXJpYW50IChlLmcuLCBhcnJheSBvZiBnZW5lcmljKSBvZiBhIHR5cGUuCiBjbGFzcyBBaWRsVHlwZVNwZWNpZmllciBmaW5hbCA6IHB1YmxpYyBBaWRsQW5ub3RhdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBBaWRsUGFyYW1ldGVyaXphYmxlPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiB7CiAgcHVibGljOgotICBBaWRsVHlwZVNwZWNpZmllcihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBzdHJpbmcmIHVucmVzb2x2ZWRfbmFtZSwgYm9vbCBpc19hcnJheSwKKyAgQWlkbFR5cGVTcGVjaWZpZXIoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiB1bnJlc29sdmVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8QXJyYXlUeXBlPiBhcnJheSwKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiogdHlwZV9wYXJhbXMsIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cyk7CiAgIHZpcnR1YWwgfkFpZGxUeXBlU3BlY2lmaWVyKCkgPSBkZWZhdWx0OwogCi0gIC8vIENvcHkgb2YgdGhpcyB0eXBlIHdoaWNoIGlzIG5vdCBhbiBhcnJheS4KLSAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIEFycmF5QmFzZSgpIGNvbnN0OworICAvLyBWaWV3IG9mIHRoaXMgdHlwZSB3aGljaCBoYXMgb25lLWxlc3MgZGltZW5zaW9uKHMpLgorICAvLyBlLmcuKSBUW10gPT4gVCwgVFtOXVtNXSA9PiBUW01dCisgIHZvaWQgVmlld0FzQXJyYXlCYXNlKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYpPiBmdW5jKSBjb25zdDsKKyAgLy8gVmlld0FzQXJyYXlCYXNlIHBhc3NlcyAibXV0YXRlZCIgdHlwZSB0byBpdHMgY2FsbGJhY2suCisgIGJvb2wgSXNNdXRhdGVkKCkgY29uc3QgeyByZXR1cm4gbXV0YXRlZF87IH0KIAogICAvLyBSZXR1cm5zIHRoZSBmdWxsLXF1YWxpZmllZCBuYW1lIG9mIHRoZSBiYXNlIHR5cGUuCiAgIC8vIGludCAtPiBpbnQKQEAgLTM5Miw0OCArNDQzLDU0IEBACiAKICAgYm9vbCBJc1Jlc29sdmVkKCkgY29uc3QgeyByZXR1cm4gZnVsbHlfcXVhbGlmaWVkX25hbWVfICE9ICIiOyB9CiAKLSAgYm9vbCBJc0FycmF5KCkgY29uc3QgeyByZXR1cm4gaXNfYXJyYXlfOyB9Ci0KLSAgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkgYm9vbCBTZXRBcnJheSgpIHsKLSAgICBpZiAoaXNfYXJyYXlfKSByZXR1cm4gZmFsc2U7Ci0gICAgaXNfYXJyYXlfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgYm9vbCBJc0FycmF5KCkgY29uc3QgeyByZXR1cm4gYXJyYXlfLmhhc192YWx1ZSgpOyB9CisgIGJvb2wgSXNEeW5hbWljQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGFycmF5Xy5oYXNfdmFsdWUoKSAmJiBzdGQ6OmdldF9pZjxEeW5hbWljQXJyYXk+KCYqYXJyYXlfKSAhPSBudWxscHRyOwogICB9CisgIGJvb2wgSXNGaXhlZFNpemVBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJyYXlfLmhhc192YWx1ZSgpICYmIHN0ZDo6Z2V0X2lmPEZpeGVkU2l6ZUFycmF5PigmKmFycmF5XykgIT0gbnVsbHB0cjsKKyAgfQorICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBHZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSBjb25zdDsKKworICBjb25zdCBBcnJheVR5cGUmIEdldEFycmF5KCkgY29uc3QgeworICAgIEFJRExfRkFUQUxfSUYoIWFycmF5Xy5oYXNfdmFsdWUoKSwgdGhpcykgPDwgIkdldEFycmF5KCkgZm9yIG5vbi1hcnJheSB0eXBlIjsKKyAgICByZXR1cm4gYXJyYXlfLnZhbHVlKCk7CisgIH0KKworICAvLyBBY2NlcHQgdHJhbnNpdGlvbnMgZnJvbQorICAvLyAgICBUICAgIHRvIFRbXQorICAvLyBvciBUICAgIHRvIFRbTl0KKyAgLy8gb3IgVFtOXSB0byBUW05dW01dCisgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpIGJvb2wgTWFrZUFycmF5KEFycmF5VHlwZSBhcnJheV90eXBlKTsKIAogICAvLyBSZXNvbHZlIHRoZSBiYXNlIHR5cGUgbmFtZSB0byBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lLiBSZXR1cm4gZmFsc2UgaWYgdGhlCiAgIC8vIHJlc29sdXRpb24gZmFpbHMuCi0gIGJvb2wgUmVzb2x2ZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworICBib29sIFJlc29sdmUoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsU2NvcGUqIHNjb3BlKTsKIAogICBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdDsKLSAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OworICBib29sIExhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OwogICBjb25zdCBBaWRsTm9kZSYgQXNBaWRsTm9kZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICp0aGlzOyB9CiAKICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBHZXREZWZpbmVkVHlwZSgpIGNvbnN0OwotICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRyYXZlcnNlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgQWlkbEFubm90YXRhYmxlOjpUcmF2ZXJzZUNoaWxkcmVuKHRyYXZlcnNlKTsKLSAgICBpZiAoSXNHZW5lcmljKCkpIHsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgdHAgOiBHZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICAgIHRyYXZlcnNlKCp0cCk7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIAogIHByaXZhdGU6Ci0gIEFpZGxUeXBlU3BlY2lmaWVyKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJikgPSBkZWZhdWx0OwotCiAgIGNvbnN0IHN0cmluZyB1bnJlc29sdmVkX25hbWVfOwogICBzdHJpbmcgZnVsbHlfcXVhbGlmaWVkX25hbWVfOwotICBib29sIGlzX2FycmF5XzsKKyAgbXV0YWJsZSBzdGQ6Om9wdGlvbmFsPEFycmF5VHlwZT4gYXJyYXlfOworICBtdXRhYmxlIGJvb2wgbXV0YXRlZF8gPSBmYWxzZTsgIC8vIFZpZXdBc0FycmF5QmFzZSgpIHNldHMgdGhpcyBhcyB0cnVlIHRvIGRpc3Rpbmd1aXNoIG11dGF0ZWQgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgdHlwZQogICB2ZWN0b3I8c3RyaW5nPiBzcGxpdF9uYW1lXzsKICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkX3R5cGVfID0gbnVsbHB0cjsgIC8vIHNldCB3aGVuIFJlc29sdmUoKSBmb3IgZGVmaW5lZCB0eXBlcwotICBtdXRhYmxlIHNoYXJlZF9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+IGFycmF5X2Jhc2VfOwogfTsKIAogLy8gUmV0dXJucyB0aGUgdW5pdmVyc2FsIHZhbHVlIHVuYWx0ZXJlZC4KLXN0ZDo6c3RyaW5nIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAotY2xhc3MgQWlkbE1lbWJlciA6IHB1YmxpYyBBaWRsQ29tbWVudGFibGUgeworY2xhc3MgQWlkbE1lbWJlciA6IHB1YmxpYyBBaWRsQW5ub3RhdGFibGUgewogIHB1YmxpYzoKICAgQWlkbE1lbWJlcihjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMpOwogICB2aXJ0dWFsIH5BaWRsTWVtYmVyKCkgPSBkZWZhdWx0OwpAQCAtNDQzLDIyICs1MDAsNiBAQAogICBBaWRsTWVtYmVyKEFpZGxNZW1iZXImJikgPSBkZWxldGU7CiAgIEFpZGxNZW1iZXImIG9wZXJhdG9yPShjb25zdCBBaWRsTWVtYmVyJikgPSBkZWxldGU7CiAgIEFpZGxNZW1iZXImIG9wZXJhdG9yPShBaWRsTWVtYmVyJiYpID0gZGVsZXRlOwotCi0gIHZpcnR1YWwgY29uc3QgQWlkbE1ldGhvZCogQXNNZXRob2QoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9Ci0gIHZpcnR1YWwgY29uc3QgQWlkbENvbnN0YW50RGVjbGFyYXRpb24qIEFzQ29uc3RhbnREZWNsYXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KLSAgdmlydHVhbCBjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiogQXNWYXJpYWJsZURlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQotCi0gIEFpZGxNZXRob2QqIEFzTWV0aG9kKCkgewotICAgIHJldHVybiBjb25zdF9jYXN0PEFpZGxNZXRob2QqPihjb25zdF9jYXN0PGNvbnN0IEFpZGxNZW1iZXIqPih0aGlzKS0+QXNNZXRob2QoKSk7Ci0gIH0KLSAgQWlkbENvbnN0YW50RGVjbGFyYXRpb24qIEFzQ29uc3RhbnREZWNsYXJhdGlvbigpIHsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxBaWRsQ29uc3RhbnREZWNsYXJhdGlvbio+KAotICAgICAgICBjb25zdF9jYXN0PGNvbnN0IEFpZGxNZW1iZXIqPih0aGlzKS0+QXNDb25zdGFudERlY2xhcmF0aW9uKCkpOwotICB9Ci0gIEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uKiBBc1ZhcmlhYmxlRGVjbGFyYXRpb24oKSB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QWlkbFZhcmlhYmxlRGVjbGFyYXRpb24qPigKLSAgICAgICAgY29uc3RfY2FzdDxjb25zdCBBaWRsTWVtYmVyKj4odGhpcyktPkFzVmFyaWFibGVEZWNsYXJhdGlvbigpKTsKLSAgfQogfTsKIAogLy8gVE9ETzogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBtZXRob2QgYXJndW1lbnRzIGFuZCBhbHNvIHBhcmNlbGFibGUgZmllbGRzLApAQCAtNDc4LDggKzUxOSw2IEBACiAgIEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiBvcGVyYXRvcj0oY29uc3QgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mKSA9IGRlbGV0ZTsKICAgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mIG9wZXJhdG9yPShBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYmKSA9IGRlbGV0ZTsKIAotICBjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiogQXNWYXJpYWJsZURlY2xhcmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQotCiAgIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQogICBzdGQ6OnN0cmluZyBHZXRDYXBpdGFsaXplZE5hbWUoKSBjb25zdDsKICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiAqdHlwZV87IH0KQEAgLTU0Niw5ICs1ODUsNiBAQAogICAvLyBlLmcpICJpbiBAdXRmOEluQ3BwIFN0cmluZ1tdIG5hbWVzIgogICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwogCi0gIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICB0cmF2ZXJzZShHZXRUeXBlKCkpOwotICB9CiAgIHZvaWQgRGlzcGF0Y2hWaXNpdChBaWRsVmlzaXRvciYgdikgY29uc3Qgb3ZlcnJpZGUgeyB2LlZpc2l0KCp0aGlzKTsgfQogCiAgcHJpdmF0ZToKQEAgLTY0NSw2ICs2ODEsNyBAQAogICBUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBmaW5hbF90eXBlXzsgfQogICBjb25zdCBzdGQ6OnN0cmluZyYgTGl0ZXJhbCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQogCisgIGJvb2wgRXZhbHVhdGUoKSBjb25zdDsKICAgdmlydHVhbCBib29sIENoZWNrVmFsaWQoKSBjb25zdDsKIAogICAvLyBSYXcgdmFsdWUgb2YgdHlwZSAoY3VycmVudGx5IHZhbGlkIGluIEMrKyBhbmQgSmF2YSkuIEVtcHR5IHN0cmluZyBvbiBlcnJvci4KQEAgLTcwMCw4ICs3MzcsMTAgQEAKICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpZWxkTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpZWxkX25hbWVfOyB9CiAKICAgYm9vbCBDaGVja1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAvLyByZXNvbHZlZF8gaXMgbm90IG15IGNoaWxkLgorICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRyYXZlcnNlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKHJlZl90eXBlXykgeworICAgICAgdHJhdmVyc2UoKnJlZl90eXBlXyk7CisgICAgfQogICB9CiAgIHZvaWQgRGlzcGF0Y2hWaXNpdChBaWRsVmlzaXRvciYgdikgY29uc3Qgb3ZlcnJpZGUgeyB2LlZpc2l0KCp0aGlzKTsgfQogICBjb25zdCBBaWRsQ29uc3RhbnRWYWx1ZSogUmVzb2x2ZShjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHNjb3BlKSBjb25zdDsKQEAgLTc5OCw4ICs4MzcsNiBAQAogICAgIHJldHVybiB2YWx1ZV8tPlZhbHVlU3RyaW5nKEdldFR5cGUoKSwgZGVjb3JhdG9yKTsKICAgfQogCi0gIGNvbnN0IEFpZGxDb25zdGFudERlY2xhcmF0aW9uKiBBc0NvbnN0YW50RGVjbGFyYXRpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9Ci0KICAgdm9pZCBUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPiB0cmF2ZXJzZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHRyYXZlcnNlKEdldFR5cGUoKSk7CiAgICAgdHJhdmVyc2UoR2V0VmFsdWUoKSk7CkBAIC04MjcsNyArODY0LDcgQEAKICAgQWlkbE1ldGhvZCYgb3BlcmF0b3I9KGNvbnN0IEFpZGxNZXRob2QmKSA9IGRlbGV0ZTsKICAgQWlkbE1ldGhvZCYgb3BlcmF0b3I9KEFpZGxNZXRob2QmJikgPSBkZWxldGU7CiAKLSAgY29uc3QgQWlkbE1ldGhvZCogQXNNZXRob2QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisgIGJvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJikgY29uc3Q7CiAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKnR5cGVfOyB9CiAgIEFpZGxUeXBlU3BlY2lmaWVyKiBHZXRNdXRhYmxlVHlwZSgpIHsgcmV0dXJuIHR5cGVfLmdldCgpOyB9CiAKQEAgLTg4OCw3ICs5MjUsNyBAQAogCiAvLyBBaWRsRGVmaW5lZFR5cGUgcmVwcmVzZW50cyBlaXRoZXIgYW4gaW50ZXJmYWNlLCBwYXJjZWxhYmxlLCBvciBlbnVtIHRoYXQgaXMKIC8vIGRlZmluZWQgaW4gdGhlIHNvdXJjZSBmaWxlLgotY2xhc3MgQWlkbERlZmluZWRUeXBlIDogcHVibGljIEFpZGxBbm5vdGF0YWJsZSB7CitjbGFzcyBBaWRsRGVmaW5lZFR5cGUgOiBwdWJsaWMgQWlkbE1lbWJlciwgcHVibGljIEFpZGxTY29wZSB7CiAgcHVibGljOgogICBBaWRsRGVmaW5lZFR5cGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cywKICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1lbWJlcj4+KiBtZW1iZXJzKTsKQEAgLTkwMiwxMSArOTM5LDE3IEBACiAKICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldE5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfTsKIAorICBzdGQ6OnN0cmluZyBSZXNvbHZlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Qgb3ZlcnJpZGU7CisKICAgLyogZG90IGpvaW5lZCBwYWNrYWdlLCBleGFtcGxlOiAiYW5kcm9pZC5wYWNrYWdlLmZvbyIgKi8KICAgc3RkOjpzdHJpbmcgR2V0UGFja2FnZSgpIGNvbnN0IHsgcmV0dXJuIHBhY2thZ2VfOyB9CiAgIC8qIGRvdCBqb2luZWQgcGFja2FnZSBhbmQgbmFtZSwgZXhhbXBsZTogImFuZHJvaWQucGFja2FnZS5mb28uSUJhciIgKi8KICAgc3RkOjpzdHJpbmcgR2V0Q2Fub25pY2FsTmFtZSgpIGNvbnN0OwotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIEdldFNwbGl0UGFja2FnZSgpIGNvbnN0IHsgcmV0dXJuIHNwbGl0X3BhY2thZ2VfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRTcGxpdFBhY2thZ2UoKSBjb25zdCB7CisgICAgaWYgKHBhY2thZ2VfLmVtcHR5KCkpIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3BsaXQocGFja2FnZV8sICIuIik7CisgIH0KKyAgY29uc3QgQWlkbERvY3VtZW50JiBHZXREb2N1bWVudCgpIGNvbnN0OwogCiAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UHJlcHJvY2Vzc0RlY2xhcmF0aW9uTmFtZSgpIGNvbnN0ID0gMDsKIApAQCAtOTE3LDggKzk2MCw3IEBACiAgIHZpcnR1YWwgY29uc3QgQWlkbEludGVyZmFjZSogQXNJbnRlcmZhY2UoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CiAgIHZpcnR1YWwgY29uc3QgQWlkbFBhcmFtZXRlcml6YWJsZTxzdGQ6OnN0cmluZz4qIEFzUGFyYW1ldGVyaXphYmxlKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQogICB2aXJ0dWFsIGJvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3QgPSAwOworICBib29sIExhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0OwogICBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIEFzU3RydWN0dXJlZFBhcmNlbGFibGUoKSB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKj4oCiAgICAgICAgIGNvbnN0X2Nhc3Q8Y29uc3QgQWlkbERlZmluZWRUeXBlKj4odGhpcyktPkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKSk7CkBAIC05NTIsNyArOTk0LDkgQEAKICAgICByZXR1cm4gY29uc3RfY2FzdDxBaWRsUGFyY2VsYWJsZSo+KAogICAgICAgICBjb25zdF9jYXN0PGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+KHRoaXMpLT5Bc1Vuc3RydWN0dXJlZFBhcmNlbGFibGUoKSk7CiAgIH0KLQorICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIEdldFBhcmVudFR5cGUoKSBjb25zdDsKKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBHZXRSb290VHlwZSgpIGNvbnN0OworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4mIEdldE5lc3RlZFR5cGVzKCkgY29uc3QgeyByZXR1cm4gdHlwZXNfOyB9CiAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsVmFyaWFibGVEZWNsYXJhdGlvbj4+JiBHZXRGaWVsZHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIHZhcmlhYmxlc187CiAgIH0KQEAgLTk2MCw3ICsxMDA0LDEwIEBACiAgICAgcmV0dXJuIGNvbnN0YW50c187CiAgIH0KICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+PiYgR2V0TWV0aG9kcygpIGNvbnN0IHsgcmV0dXJuIG1ldGhvZHNfOyB9Ci0gIHZvaWQgQWRkTWV0aG9kKHN0ZDo6dW5pcXVlX3B0cjxBaWRsTWV0aG9kPiBtZXRob2QpIHsgbWV0aG9kc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShtZXRob2QpKTsgfQorICB2b2lkIEFkZE1ldGhvZChzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1ldGhvZD4gbWV0aG9kKSB7CisgICAgbWVtYmVyc18ucHVzaF9iYWNrKG1ldGhvZC5nZXQoKSk7CisgICAgbWV0aG9kc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShtZXRob2QpKTsKKyAgfQogICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBBaWRsTWVtYmVyKj4mIEdldE1lbWJlcnMoKSBjb25zdCB7IHJldHVybiBtZW1iZXJzXzsgfQogICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRyYXZlcnNlKSBjb25zdCBvdmVycmlkZSB7CiAgICAgQWlkbEFubm90YXRhYmxlOjpUcmF2ZXJzZUNoaWxkcmVuKHRyYXZlcnNlKTsKQEAgLTk3NywxMSArMTAyNCwxMSBAQAogICBib29sIENoZWNrVmFsaWRXaXRoTWVtYmVycyhjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIGNvbnN0OwogCiAgIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlXzsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0X3BhY2thZ2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uPj4gdmFyaWFibGVzXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxDb25zdGFudERlY2xhcmF0aW9uPj4gY29uc3RhbnRzXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZXRob2Q+PiBtZXRob2RzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IHR5cGVzXzsKICAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbE1lbWJlcio+IG1lbWJlcnNfOyAgLy8ga2VlcCBtZW1iZXJzIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UuCiB9OwogCkBAIC0xMDAyLDggKzEwNDksNiBAQAogICBzdGQ6OnN0cmluZyBHZXRDcHBIZWFkZXIoKSBjb25zdCB7IHJldHVybiBjcHBfaGVhZGVyXzsgfQogCiAgIGJvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIExhbmd1YWdlU3BlY2lmaWNDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSBjb25zdCBvdmVycmlkZTsKICAgY29uc3QgQWlkbFBhcmNlbGFibGUqIEFzUGFyY2VsYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KICAgY29uc3QgQWlkbFBhcmFtZXRlcml6YWJsZTxzdGQ6OnN0cmluZz4qIEFzUGFyYW1ldGVyaXphYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogICBjb25zdCBBaWRsTm9kZSYgQXNBaWRsTm9kZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICp0aGlzOyB9CkBAIC0xMDMzLDkgKzEwNzgsNiBAQAogICBzdGQ6OnN0cmluZyBHZXRQcmVwcm9jZXNzRGVjbGFyYXRpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInN0cnVjdHVyZWRfcGFyY2VsYWJsZSI7IH0KIAogICBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2UgbGFuZykgY29uc3Qgb3ZlcnJpZGU7Ci0KICAgdm9pZCBEaXNwYXRjaFZpc2l0KEFpZGxWaXNpdG9yJiB2KSBjb25zdCBvdmVycmlkZSB7IHYuVmlzaXQoKnRoaXMpOyB9CiB9OwogCkBAIC0xMDkxLDE2ICsxMTMzLDE1IEBACiAgICAgcmV0dXJuIGVudW1lcmF0b3JzXzsKICAgfQogICBib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBMYW5ndWFnZVNwZWNpZmljQ2hlY2tWYWxpZChjb25zdCBBaWRsVHlwZW5hbWVzJiAvKnR5cGVuYW1lcyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KICAgc3RkOjpzdHJpbmcgR2V0UHJlcHJvY2Vzc0RlY2xhcmF0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJlbnVtIjsgfQogCiAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIEFzRW51bURlY2xhcmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBBaWRsRGVmaW5lZFR5cGU6OlRyYXZlcnNlQ2hpbGRyZW4odHJhdmVyc2UpOworICAgIGlmIChiYWNraW5nX3R5cGVfKSB7CisgICAgICB0cmF2ZXJzZSgqYmFja2luZ190eXBlXyk7CisgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgYyA6IEdldEVudW1lcmF0b3JzKCkpIHsKICAgICAgIHRyYXZlcnNlKCpjKTsKICAgICB9CkBAIC0xMTMwLDggKzExNzEsNiBAQAogCiAgIGNvbnN0IEFpZGxOb2RlJiBBc0FpZGxOb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gKnRoaXM7IH0KICAgYm9vbCBDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnN0cmluZyBHZXRQcmVwcm9jZXNzRGVjbGFyYXRpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInVuaW9uIjsgfQogCiAgIGNvbnN0IEFpZGxVbmlvbkRlY2wqIEFzVW5pb25EZWNsYXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KQEAgLTExNDEsNyArMTE4MCw3IEBACiBjbGFzcyBBaWRsSW50ZXJmYWNlIGZpbmFsIDogcHVibGljIEFpZGxEZWZpbmVkVHlwZSB7CiAgcHVibGljOgogICBBaWRsSW50ZXJmYWNlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCi0gICAgICAgICAgICAgICAgYm9vbCBvbmV3YXlfLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwKKyAgICAgICAgICAgICAgICBib29sIG9uZXdheSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+PiogbWVtYmVycyk7CiAgIHZpcnR1YWwgfkFpZGxJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAKQEAgLTExNTUsNTEgKzExOTQsMjEgQEAKICAgc3RkOjpzdHJpbmcgR2V0UHJlcHJvY2Vzc0RlY2xhcmF0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJpbnRlcmZhY2UiOyB9CiAKICAgYm9vbCBDaGVja1ZhbGlkKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgTGFuZ3VhZ2VTcGVjaWZpY0NoZWNrVmFsaWQoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnM6Okxhbmd1YWdlIGxhbmcpIGNvbnN0IG92ZXJyaWRlOwotCisgIGJvb2wgQ2hlY2tWYWxpZFBlcm1pc3Npb25Bbm5vdGF0aW9ucyhjb25zdCBBaWRsTWV0aG9kJiBtKSBjb25zdDsKICAgc3RkOjpzdHJpbmcgR2V0RGVzY3JpcHRvcigpIGNvbnN0OwogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIH07CiAKLWNsYXNzIEFpZGxQYWNrYWdlIDogcHVibGljIEFpZGxOb2RlIHsKLSBwdWJsaWM6Ci0gIEFpZGxQYWNrYWdlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sIGNvbnN0IENvbW1lbnRzJiBjb21tZW50cykKLSAgICAgIDogQWlkbE5vZGUobG9jYXRpb24sIGNvbW1lbnRzKSB7fQotICB2aXJ0dWFsIH5BaWRsUGFja2FnZSgpID0gZGVmYXVsdDsKLSAgdm9pZCBUcmF2ZXJzZUNoaWxkcmVuKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBBaWRsTm9kZSYpPikgY29uc3Qge30KLSAgdm9pZCBEaXNwYXRjaFZpc2l0KEFpZGxWaXNpdG9yJiB2KSBjb25zdCB7IHYuVmlzaXQoKnRoaXMpOyB9Ci19OwotCi1jbGFzcyBBaWRsSW1wb3J0IDogcHVibGljIEFpZGxOb2RlIHsKLSBwdWJsaWM6Ci0gIEFpZGxJbXBvcnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIG5lZWRlZF9jbGFzcywKLSAgICAgICAgICAgICBjb25zdCBDb21tZW50cyYgY29tbWVudHMpOwotICB2aXJ0dWFsIH5BaWRsSW1wb3J0KCkgPSBkZWZhdWx0OwotCi0gIC8vIG5vbi1jb3B5YWJsZSwgbm9uLW1vdmFibGUKLSAgQWlkbEltcG9ydChjb25zdCBBaWRsSW1wb3J0JikgPSBkZWxldGU7Ci0gIEFpZGxJbXBvcnQoQWlkbEltcG9ydCYmKSA9IGRlbGV0ZTsKLSAgQWlkbEltcG9ydCYgb3BlcmF0b3I9KGNvbnN0IEFpZGxJbXBvcnQmKSA9IGRlbGV0ZTsKLSAgQWlkbEltcG9ydCYgb3BlcmF0b3I9KEFpZGxJbXBvcnQmJikgPSBkZWxldGU7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldE5lZWRlZENsYXNzKCkgY29uc3QgeyByZXR1cm4gbmVlZGVkX2NsYXNzXzsgfQotICB2b2lkIFRyYXZlcnNlQ2hpbGRyZW4oc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+KSBjb25zdCB7fQotICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IHsgdi5WaXNpdCgqdGhpcyk7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5lZWRlZF9jbGFzc187Ci19OworaW5saW5lIHN0ZDo6c3RyaW5nIFNpbXBsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHF1YWxpZmllZF9uYW1lKSB7CisgIHJldHVybiBxdWFsaWZpZWRfbmFtZS5zdWJzdHIocXVhbGlmaWVkX25hbWUucmZpbmQoJy4nKSArIDEpOworfQogCiAvLyBBaWRsRG9jdW1lbnQgbW9kZWxzIGFuIEFJREwgZmlsZQotY2xhc3MgQWlkbERvY3VtZW50IDogcHVibGljIEFpZGxDb21tZW50YWJsZSB7CitjbGFzcyBBaWRsRG9jdW1lbnQgOiBwdWJsaWMgQWlkbENvbW1lbnRhYmxlLCBwdWJsaWMgQWlkbFNjb3BlIHsKICBwdWJsaWM6CiAgIEFpZGxEb2N1bWVudChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEltcG9ydD4+IGltcG9ydHMsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4gZGVmaW5lZF90eXBlcykKLSAgICAgIDogQWlkbENvbW1lbnRhYmxlKGxvY2F0aW9uLCBjb21tZW50cyksCi0gICAgICAgIGltcG9ydHNfKHN0ZDo6bW92ZShpbXBvcnRzKSksCi0gICAgICAgIGRlZmluZWRfdHlwZXNfKHN0ZDo6bW92ZShkZWZpbmVkX3R5cGVzKSkge30KKyAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRzLAorICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXMsIGJvb2wgaXNfcHJlcHJvY2Vzc2VkKTsKICAgfkFpZGxEb2N1bWVudCgpID0gZGVmYXVsdDsKIAogICAvLyBub24tY29weWFibGUsIG5vbi1tb3ZhYmxlCkBAIC0xMjA4LDE2ICsxMjE3LDE0IEBACiAgIEFpZGxEb2N1bWVudCYgb3BlcmF0b3I9KGNvbnN0IEFpZGxEb2N1bWVudCYpID0gZGVsZXRlOwogICBBaWRsRG9jdW1lbnQmIG9wZXJhdG9yPShBaWRsRG9jdW1lbnQmJikgPSBkZWxldGU7CiAKLSAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gUmVzb2x2ZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHVucmVzb2x2ZWRfdHlwZSkgY29uc3Q7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsSW1wb3J0Pj4mIEltcG9ydHMoKSBjb25zdCB7IHJldHVybiBpbXBvcnRzXzsgfQorICBzdGQ6OnN0cmluZyBSZXNvbHZlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgSW1wb3J0cygpIGNvbnN0IHsgcmV0dXJuIGltcG9ydHNfOyB9CiAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsRGVmaW5lZFR5cGU+PiYgRGVmaW5lZFR5cGVzKCkgY29uc3QgewogICAgIHJldHVybiBkZWZpbmVkX3R5cGVzXzsKICAgfQorICBib29sIElzUHJlcHJvY2Vzc2VkKCkgY29uc3QgeyByZXR1cm4gaXNfcHJlcHJvY2Vzc2VkXzsgfQogCiAgIHZvaWQgVHJhdmVyc2VDaGlsZHJlbihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdHJhdmVyc2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBJbXBvcnRzKCkpIHsKLSAgICAgIHRyYXZlcnNlKCppKTsKLSAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiB0IDogRGVmaW5lZFR5cGVzKCkpIHsKICAgICAgIHRyYXZlcnNlKCp0KTsKICAgICB9CkBAIC0xMjI1LDggKzEyMzIsOSBAQAogICB2b2lkIERpc3BhdGNoVmlzaXQoQWlkbFZpc2l0b3ImIHYpIGNvbnN0IG92ZXJyaWRlIHsgdi5WaXNpdCgqdGhpcyk7IH0KIAogIHByaXZhdGU6Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsSW1wb3J0Pj4gaW1wb3J0c187CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRzXzsKICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXNfOworICBib29sIGlzX3ByZXByb2Nlc3NlZF87CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTEyMzgsMTUgKzEyNDYsMTE0IEBACiAgIHJldHVybiBpdC0+c2Vjb25kLT5FdmFsdWF0ZWRWYWx1ZTxUPigpOwogfQogCi0vLyBVdGlsaXR5IHRvIG1ha2UgYSB2aXNpdG9yIHRvIHZpc2l0IEFTVCB0cmVlIGluIHRvcC1kb3duIG9yZGVyCisvLyBVdGlsaXRpZXMgdG8gbWFrZSBhIHZpc2l0b3IgdG8gdmlzaXQgQVNUIHRyZWUgaW4gdG9wLWRvd24gb3JkZXIKIC8vIEdpdmVuOiAgICAgICBmb28KIC8vICAgICAgICAgICAgICAvIFwKIC8vICAgICAgICAgICAgYmFyIGJhegogLy8gVmlzaXRUb3BEb3duKHYsIGZvbykgbWFrZXMgdiB2aXNpdCBmb28gLT4gYmFyIC0+IGJhei4KLWlubGluZSB2b2lkIFZpc2l0VG9wRG93bihBaWRsVmlzaXRvciYgdiwgY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKK2lubGluZSB2b2lkIFZpc2l0VG9wRG93bihzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdiwgY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IHRvcF9kb3duID0gWyZdKGNvbnN0IEFpZGxOb2RlJiBuKSB7Ci0gICAgbi5EaXNwYXRjaFZpc2l0KHYpOworICAgIHYobik7CiAgICAgbi5UcmF2ZXJzZUNoaWxkcmVuKHRvcF9kb3duKTsKICAgfTsKICAgdG9wX2Rvd24obm9kZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQoraW5saW5lIHZvaWQgVmlzaXRUb3BEb3duKEFpZGxWaXNpdG9yJiB2LCBjb25zdCBBaWRsTm9kZSYgbm9kZSkgeworICBWaXNpdFRvcERvd24oWyZdKGNvbnN0IEFpZGxOb2RlJiBuKSB7IG4uRGlzcGF0Y2hWaXNpdCh2KTsgfSwgbm9kZSk7Cit9CisKKy8vIFV0aWxpdHkgdG8gbWFrZSBhIHZpc2l0b3IgdG8gdmlzaXQgQVNUIHRyZWUgaW4gYm90dG9tLXVwIG9yZGVyCisvLyBHaXZlbjogICAgICAgZm9vCisvLyAgICAgICAgICAgICAgLyBcCisvLyAgICAgICAgICAgIGJhciBiYXoKKy8vIFZpc2l0Qm90dG9tVXAodiwgZm9vKSBtYWtlcyB2IHZpc2l0IGJhciAtPiBiYXogLT4gZm9vLgoraW5saW5lIHZvaWQgVmlzaXRCb3R0b21VcChBaWRsVmlzaXRvciYgdiwgY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxOb2RlJik+IGJvdHRvbV91cCA9IFsmXShjb25zdCBBaWRsTm9kZSYgbikgeworICAgIG4uVHJhdmVyc2VDaGlsZHJlbihib3R0b21fdXApOworICAgIG4uRGlzcGF0Y2hWaXNpdCh2KTsKKyAgfTsKKyAgYm90dG9tX3VwKG5vZGUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQqIEFpZGxDYXN0KGNvbnN0IEFpZGxOb2RlJiBub2RlKSB7CisgIHN0cnVjdCBDYXN0VmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBjb25zdCBUKiBjYXN0ID0gbnVsbHB0cjsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IFQmIHQpIG92ZXJyaWRlIHsgY2FzdCA9ICZ0OyB9CisgIH0gdmlzaXRvcjsKKyAgbm9kZS5EaXNwYXRjaFZpc2l0KHZpc2l0b3IpOworICByZXR1cm4gdmlzaXRvci5jYXN0OworfQorCit0ZW1wbGF0ZSA8PgorY29uc3QgQWlkbERlZmluZWRUeXBlKiBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KGNvbnN0IEFpZGxOb2RlJiBub2RlKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBBaWRsQ2FzdChBaWRsTm9kZSYgbm9kZSkgeworICByZXR1cm4gY29uc3RfY2FzdDxUKj4oQWlkbENhc3Q8VD4oY29uc3RfY2FzdDxjb25zdCBBaWRsTm9kZSY+KG5vZGUpKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBaWRsTm9kZVR5cGU+Cit2ZWN0b3I8Y29uc3QgQWlkbE5vZGVUeXBlKj4gQ29sbGVjdChjb25zdCBBaWRsTm9kZSYgcm9vdCkgeworICB2ZWN0b3I8Y29uc3QgQWlkbE5vZGVUeXBlKj4gcmVzdWx0OworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdG9wX2Rvd24gPSBbJl0oY29uc3QgQWlkbE5vZGUmIG4pIHsKKyAgICBpZiAoYXV0byBjYXN0ID0gQWlkbENhc3Q8QWlkbE5vZGVUeXBlPihuKTsgY2FzdCkgeworICAgICAgcmVzdWx0LnB1c2hfYmFjayhjYXN0KTsKKyAgICB9CisgICAgbi5UcmF2ZXJzZUNoaWxkcmVuKHRvcF9kb3duKTsKKyAgfTsKKyAgdG9wX2Rvd24ocm9vdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWaXNpdEZuPgorYm9vbCBUb3BvbG9naWNhbFZpc2l0KGNvbnN0IHZlY3Rvcjx1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+JiBuZXN0ZWRfdHlwZXMsIFZpc2l0Rm4gdmlzaXQpIHsKKyAgLy8gMS4gTWFwcyBkZWVwbHkgbmVzdGVkIHR5cGVzIHRvIG9uZSBvZiBuZXN0ZWRfdHlwZXMKKyAgbWFwPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSosIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IHJvb3RzOworICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IG5lc3RlZF90eXBlcykgeworICAgIGZvciAoY29uc3QgYXV0byYgdCA6IENvbGxlY3Q8QWlkbERlZmluZWRUeXBlPigqbmVzdGVkKSkgeworICAgICAgcm9vdHNbdF0gPSBuZXN0ZWQuZ2V0KCk7CisgICAgfQorICB9CisgIC8vIDIuIENvbGxlY3Qgc2libGluZyB0eXBlcyByZWZlcmVuY2VkIHdpdGhpbiBlYWNoIG5lc3RlZCB0eXBlLgorICBtYXA8Y29uc3QgQWlkbERlZmluZWRUeXBlKiwgdmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+PiByZXF1aXJlZF90eXBlczsKKyAgZm9yIChjb25zdCBhdXRvJiBuZXN0ZWQgOiBuZXN0ZWRfdHlwZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHQgOiBDb2xsZWN0PEFpZGxUeXBlU3BlY2lmaWVyPigqbmVzdGVkKSkgeworICAgICAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdC0+R2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7CisgICAgICAgIGF1dG8gc2libGluZyA9IHJvb3RzW2RlZmluZWRfdHlwZV07CisgICAgICAgIGlmIChzaWJsaW5nICYmIHNpYmxpbmcgIT0gbmVzdGVkLmdldCgpKSB7CisgICAgICAgICAgcmVxdWlyZWRfdHlwZXNbbmVzdGVkLmdldCgpXS5wdXNoX2JhY2soc2libGluZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisgIC8vIDMuIFJ1biBERlMKKyAgZW51bSB7IE5PVF9TVEFSVEVEID0gMCwgU1RBUlRFRCA9IDEsIEZJTklTSEVEID0gMiB9OworICBtYXA8Y29uc3QgQWlkbERlZmluZWRUeXBlKiwgaW50PiB2aXNpdGVkOworICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgQWlkbERlZmluZWRUeXBlJik+IGRmcyA9IFsmXShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIHsKKyAgICBpZiAodmlzaXRlZFsmdHlwZV0gPT0gRklOSVNIRUQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAodmlzaXRlZFsmdHlwZV0gPT0gU1RBUlRFRCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICB2aXNpdGVkWyZ0eXBlXSA9IFNUQVJURUQ7CisgICAgICAvLyBWaXNpdCBldmVyeSByZXF1aXJlZCBkZXAgZmlyc3QKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZGVwX3R5cGUgOiByZXF1aXJlZF90eXBlc1smdHlwZV0pIHsKKyAgICAgICAgaWYgKCFkZnMoKmRlcF90eXBlKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmlzaXRlZFsmdHlwZV0gPSBGSU5JU0hFRDsKKyAgICAgIHZpc2l0KHR5cGUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9OworCisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IG5lc3RlZF90eXBlcykgeworICAgIGlmICghZGZzKCp0eXBlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYWlkbF9sYW5ndWFnZV9sLmxsIGIvYWlkbF9sYW5ndWFnZV9sLmxsCmluZGV4IDJiNjNiODIuLjMzMDU0YTMgMTAwNjQ0Ci0tLSBhL2FpZGxfbGFuZ3VhZ2VfbC5sbAorKysgYi9haWRsX2xhbmd1YWdlX2wubGwKQEAgLTM2LDggKzM2LDggQEAKIAogaWRlbnRpZmllciAgW19hLXpBLVpdW19hLXpBLVowLTldKgogd2hpdGVzcGFjZSAgKFsgXHRccl0rKQotaW50dmFsdWUgICAgWzAtOV0rW2xMXT8KLWhleHZhbHVlICAgIDBbeHxYXVswLTlhLWZBLUZdK1tsTF0/CitpbnR2YWx1ZSAgICBbMC05XStbbExdPyh1OCk/CitoZXh2YWx1ZSAgICAwW3h8WF1bMC05YS1mQS1GXStbbExdPyh1OCk/CiBmbG9hdHZhbHVlICBbMC05XSpcLj9bMC05XSsoW2VFXVstK10/WzAtOV0rKT9mPwogCiAlJQpAQCAtNTgsNyArNTgsNyBAQAogPExPTkdfQ09NTUVOVD5cbisgICAgIHsgZXh0cmFfdGV4dCArPSB5eXRleHQ7IHl5bGxvYy0+bGluZXMoeXlsZW5nKTsgfQogPExPTkdfQ09NTUVOVD5bXipcbl0rIHsgZXh0cmFfdGV4dCArPSB5eXRleHQ7IH0KIAotXCJbXlwiXSpcIiAgICAgICAgICAgIHsgeXlsdmFsLT50b2tlbiA9IG5ldyBBaWRsVG9rZW4oeXl0ZXh0LCBjb21tZW50cyk7CitcIihbXlwiXXxcXC4pKlwiICAgICAgeyB5eWx2YWwtPnRva2VuID0gbmV3IEFpZGxUb2tlbih5eXRleHQsIGNvbW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5eTo6cGFyc2VyOjp0b2tlbjo6Q19TVFI7IH0KIAogXC9cLy4qICAgICAgICAgICAgICAgIHsgZXh0cmFfdGV4dCArPSB5eXRleHQ7IGV4dHJhX3RleHQgKz0gIlxuIjsKZGlmZiAtLWdpdCBhL2FpZGxfbGFuZ3VhZ2VfeS55eSBiL2FpZGxfbGFuZ3VhZ2VfeS55eQppbmRleCAwNzliZGE2Li4xMWFiMjllIDEwMDY0NAotLS0gYS9haWRsX2xhbmd1YWdlX3kueXkKKysrIGIvYWlkbF9sYW5ndWFnZV95Lnl5CkBAIC03MSwxMCArNzEsMTEgQEAKICAgICBBaWRsVG9rZW4qIHRva2VuOwogICAgIGNoYXIgY2hhcmFjdGVyOwogICAgIHN0ZDo6c3RyaW5nICpzdHI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxUb2tlbj4+ICp0b2tlbl9saXN0OwogICAgIEFpZGxBbm5vdGF0aW9uKiBhbm5vdGF0aW9uOwogICAgIEFpZGxBbm5vdGF0aW9uUGFyYW1ldGVyKiBwYXJhbTsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4qIHBhcmFtX2xpc3Q7Ci0gICAgc3RkOjp2ZWN0b3I8QWlkbEFubm90YXRpb24+KiBhbm5vdGF0aW9uX2xpc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPj4qIGFubm90YXRpb25fbGlzdDsKICAgICBBaWRsVHlwZVNwZWNpZmllciogdHlwZTsKICAgICBBaWRsQXJndW1lbnQqIGFyZzsKICAgICBBaWRsQXJndW1lbnQ6OkRpcmVjdGlvbiBkaXJlY3Rpb247CkBAIC05MCw5ICs5MSw2IEBACiAgICAgQWlkbERlZmluZWRUeXBlKiBkZWNsYXJhdGlvbjsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PiogdHlwZV9hcmdzOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogdHlwZV9wYXJhbXM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxJbXBvcnQ+PiogaW1wb3J0czsKLSAgICBBaWRsSW1wb3J0KiBpbXBvcnQ7Ci0gICAgQWlkbFBhY2thZ2UqIHBhY2thZ2U7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+KiBkZWNsYXJhdGlvbnM7CiB9CiAKQEAgLTE3NSwyMyArMTczLDI1IEBACiAldHlwZTxjb25zdF9leHByPiBjb25zdF9leHByCiAldHlwZTxjb25zdGFudF92YWx1ZV9saXN0PiBjb25zdGFudF92YWx1ZV9saXN0CiAldHlwZTxjb25zdGFudF92YWx1ZV9saXN0PiBjb25zdGFudF92YWx1ZV9ub25fZW1wdHlfbGlzdAotJXR5cGU8aW1wb3J0cz4gaW1wb3J0cwotJXR5cGU8aW1wb3J0PiBpbXBvcnQKLSV0eXBlPHBhY2thZ2U+IHBhY2thZ2UKKyV0eXBlPHRva2VuX2xpc3Q+IGltcG9ydHMKICV0eXBlPGRlY2xhcmF0aW9ucz4gZGVjbHMKLSV0eXBlPHRva2VuPiBpZGVudGlmaWVyIGVycm9yIHF1YWxpZmllZF9uYW1lCisldHlwZTx0b2tlbj4gaW1wb3J0IGlkZW50aWZpZXIgZXJyb3IgcXVhbGlmaWVkX25hbWUgb3B0aW9uYWxfcGFja2FnZQogCiAlJQogCiBkb2N1bWVudAotIDogcGFja2FnZSBpbXBvcnRzIGRlY2xzIHsKKyA6IG9wdGlvbmFsX3BhY2thZ2UgaW1wb3J0cyBkZWNscyB7CiAgICAgQ29tbWVudHMgY29tbWVudHM7CiAgICAgaWYgKCQxKSB7CiAgICAgICBjb21tZW50cyA9ICQxLT5HZXRDb21tZW50cygpOwogICAgIH0gZWxzZSBpZiAoISQyLT5lbXB0eSgpKSB7CiAgICAgICBjb21tZW50cyA9ICQyLT5mcm9udCgpLT5HZXRDb21tZW50cygpOwogICAgIH0KLSAgICBwcy0+U2V0RG9jdW1lbnQoc3RkOjptYWtlX3VuaXF1ZTxBaWRsRG9jdW1lbnQ+KGxvYyhAMSksIGNvbW1lbnRzLCBzdGQ6Om1vdmUoKiQyKSwgc3RkOjptb3ZlKCokMykpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW1wb3J0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGltcG9ydCA6ICokMikgeworICAgICAgaW1wb3J0cy5wdXNoX2JhY2soaW1wb3J0LT5HZXRUZXh0KCkpOworICAgIH0KKyAgICBwcy0+TWFrZURvY3VtZW50KGxvYyhAMSksIGNvbW1lbnRzLCBzdGQ6Om1vdmUoaW1wb3J0cyksIHN0ZDo6bW92ZSgqJDMpKTsKICAgICBkZWxldGUgJDE7CiAgICAgZGVsZXRlICQyOwogICAgIGRlbGV0ZSAkMzsKQEAgLTIwOCwzNiArMjA4LDI5IEBACiAgfCBDUFBfSEVBREVSCiAgOwogCi1wYWNrYWdlCitvcHRpb25hbF9wYWNrYWdlCiAgOiB7CiAgICAgJCQgPSBudWxscHRyOwogIH0KICB8IFBBQ0tBR0UgcXVhbGlmaWVkX25hbWUgJzsnIHsKLSAgICAkJCA9IG5ldyBBaWRsUGFja2FnZShsb2MoQDEsIEAzKSwgJDEtPkdldENvbW1lbnRzKCkpOwogICAgIHBzLT5TZXRQYWNrYWdlKCQyLT5HZXRUZXh0KCkpOwotICAgIGRlbGV0ZSAkMTsKKyAgICAkJCA9ICQxOyAvLyBmb3IgY29tbWVudHMKICAgICBkZWxldGUgJDI7CiAgIH0KICA7CiAKIGltcG9ydHMKLSA6IHsgJCQgPSBuZXcgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxJbXBvcnQ+PigpOyB9CisgOiB7ICQkID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsVG9rZW4+PigpOyB9CiAgfCBpbXBvcnRzIGltcG9ydAogICB7CiAgICAgJCQgPSAkMTsKLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKCQkLT5iZWdpbigpLCAkJC0+ZW5kKCksIFsmXShjb25zdCBhdXRvJiBpKSB7Ci0gICAgICByZXR1cm4gJDItPkdldE5lZWRlZENsYXNzKCkgPT0gaS0+R2V0TmVlZGVkQ2xhc3MoKTsKLSAgICB9KTsKLSAgICBpZiAoaXQgPT0gJCQtPmVuZCgpKSB7Ci0gICAgICAkJC0+ZW1wbGFjZV9iYWNrKCQyKTsKLSAgICB9IGVsc2UgewotICAgICAgZGVsZXRlICQyOwotICAgIH0KKyAgICAkJC0+ZW1wbGFjZV9iYWNrKCQyKTsKICAgfQogCiBpbXBvcnQKICA6IElNUE9SVCBxdWFsaWZpZWRfbmFtZSAnOycgewotICAgICQkID0gbmV3IEFpZGxJbXBvcnQobG9jKEAyKSwgJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCkpOworICAgIC8vIGNhcnJ5IHRoZSBjb21tZW50cyBiZWZvcmUgImltcG9ydCIgdG9rZW4KKyAgICAkJCA9IG5ldyBBaWRsVG9rZW4oJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCkpOwogICAgIGRlbGV0ZSAkMTsKICAgICBkZWxldGUgJDI7CiAgIH07CkBAIC0yNzQsNyArMjY3LDcgQEAKIAogICAgIGlmICgkMS0+c2l6ZSgpID4gMCAmJiAkJCAhPSBudWxscHRyKSB7CiAgICAgICAvLyBjb3B5IGNvbW1lbnRzIGZyb20gYW5ub3RhdGlvbiB0byBkZWNsCi0gICAgICAkJC0+U2V0Q29tbWVudHMoJDEtPmJlZ2luKCktPkdldENvbW1lbnRzKCkpOworICAgICAgJCQtPlNldENvbW1lbnRzKCQxLT5iZWdpbigpLT5nZXQoKS0+R2V0Q29tbWVudHMoKSk7CiAgICAgICAkJC0+QW5ub3RhdGUoc3RkOjptb3ZlKCokMSkpOwogICAgIH0KIApAQCAtMzA5LDE2ICszMDIsMTkgQEAKIAogcGFyY2VsYWJsZV9kZWNsCiAgOiBQQVJDRUxBQkxFIHF1YWxpZmllZF9uYW1lIG9wdGlvbmFsX3R5cGVfcGFyYW1zICc7JyB7CisgICAgLy8gTm8gY2hlY2sgZm9yIHR5cGUgbmFtZSBoZXJlLiBXZSBhbGxvdyBuZXN0ZWQgdHlwZXMgZm9yIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlcy4KICAgICAkJCA9IG5ldyBBaWRsUGFyY2VsYWJsZShsb2MoQDIpLCAkMi0+R2V0VGV4dCgpLCBwcy0+UGFja2FnZSgpLCAkMS0+R2V0Q29tbWVudHMoKSwgIiIsICQzKTsKICAgICBkZWxldGUgJDE7CiAgICAgZGVsZXRlICQyOwogIH0KICB8IFBBUkNFTEFCTEUgcXVhbGlmaWVkX25hbWUgb3B0aW9uYWxfdHlwZV9wYXJhbXMgJ3snIHBhcmNlbGFibGVfbWVtYmVycyAnfScgeworICAgIHBzLT5DaGVja1ZhbGlkVHlwZU5hbWUoKiQyLCBsb2MoQDIpKTsKICAgICAkJCA9IG5ldyBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUobG9jKEAyKSwgJDItPkdldFRleHQoKSwgcHMtPlBhY2thZ2UoKSwgJDEtPkdldENvbW1lbnRzKCksICQzLCAkNSk7CiAgICAgZGVsZXRlICQxOwogICAgIGRlbGV0ZSAkMjsKICB9CiAgfCBQQVJDRUxBQkxFIHF1YWxpZmllZF9uYW1lIENQUF9IRUFERVIgQ19TVFIgJzsnIHsKKyAgICAvLyBObyBjaGVjayBmb3IgdHlwZSBuYW1lIGhlcmUuIFdlIGFsbG93IG5lc3RlZCB0eXBlcyBmb3IgdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzLgogICAgICQkID0gbmV3IEFpZGxQYXJjZWxhYmxlKGxvYyhAMiksICQyLT5HZXRUZXh0KCksIHBzLT5QYWNrYWdlKCksICQxLT5HZXRDb21tZW50cygpLCAkNC0+R2V0VGV4dCgpKTsKICAgICBkZWxldGUgJDE7CiAgICAgZGVsZXRlICQyOwpAQCAtMzQzLDYgKzMzOSwxMCBAQAogICAgICQxLT5lbXBsYWNlX2JhY2soJDIpOwogICAgICQkID0gJDE7CiAgIH0KKyB8IHBhcmNlbGFibGVfbWVtYmVycyBkZWNsIHsKKyAgICBpZiAoJDIpICQxLT5lbXBsYWNlX2JhY2soJDIpOyAgLy8gZGVjbCBtYXkgYmUgbnVsbHB0ciBvbiBlcnJvcgorICAgICQkID0gJDE7CisgIH0KICB8IHBhcmNlbGFibGVfbWVtYmVycyBlcnJvciAnOycgewogICAgIHBzLT5BZGRFcnJvcigpOwogICAgICQkID0gJDE7CkBAIC0zNjEsMTMgKzM2MSwyMSBAQAogIDsKIAogaW50ZXJmYWNlX2RlY2wKLSA6IElOVEVSRkFDRSBpZGVudGlmaWVyICd7JyBpbnRlcmZhY2VfbWVtYmVycyAnfScgeworIDogSU5URVJGQUNFIHF1YWxpZmllZF9uYW1lICc7JyB7CisgICAgcHMtPkNoZWNrVmFsaWRUeXBlTmFtZSgqJDIsIGxvYyhAMikpOworICAgICQkID0gbmV3IEFpZGxJbnRlcmZhY2UobG9jKEAxKSwgJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCksIGZhbHNlLCBwcy0+UGFja2FnZSgpLCBudWxscHRyKTsKKyAgICBkZWxldGUgJDE7CisgICAgZGVsZXRlICQyOworICB9CisgfCBJTlRFUkZBQ0UgcXVhbGlmaWVkX25hbWUgJ3snIGludGVyZmFjZV9tZW1iZXJzICd9JyB7CisgICAgcHMtPkNoZWNrVmFsaWRUeXBlTmFtZSgqJDIsIGxvYyhAMikpOwogICAgICQkID0gbmV3IEFpZGxJbnRlcmZhY2UobG9jKEAxKSwgJDItPkdldFRleHQoKSwgJDEtPkdldENvbW1lbnRzKCksIGZhbHNlLCBwcy0+UGFja2FnZSgpLCAkNCk7CiAgICAgZGVsZXRlICQxOwogICAgIGRlbGV0ZSAkMjsKICAgfQotIHwgT05FV0FZIElOVEVSRkFDRSBpZGVudGlmaWVyICd7JyBpbnRlcmZhY2VfbWVtYmVycyAnfScgewotICAgICQkID0gbmV3IEFpZGxJbnRlcmZhY2UobG9jKEAyKSwgJDMtPkdldFRleHQoKSwgICQxLT5HZXRDb21tZW50cygpLCB0cnVlLCBwcy0+UGFja2FnZSgpLCAkNSk7CisgfCBPTkVXQVkgSU5URVJGQUNFIHF1YWxpZmllZF9uYW1lICd7JyBpbnRlcmZhY2VfbWVtYmVycyAnfScgeworICAgIHBzLT5DaGVja1ZhbGlkVHlwZU5hbWUoKiQzLCBsb2MoQDMpKTsKKyAgICAkJCA9IG5ldyBBaWRsSW50ZXJmYWNlKGxvYyhAMiksICQzLT5HZXRUZXh0KCksICQxLT5HZXRDb21tZW50cygpLCB0cnVlLCBwcy0+UGFja2FnZSgpLCAkNSk7CiAgICAgZGVsZXRlICQxOwogICAgIGRlbGV0ZSAkMjsKICAgICBkZWxldGUgJDM7CkBAIC0zODYsNiArMzk0LDExIEBACiAgIHsgJDEtPnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QWlkbE1lbWJlcj4oJDIpKTsgJCQgPSAkMTsgfQogIHwgaW50ZXJmYWNlX21lbWJlcnMgY29uc3RhbnRfZGVjbAogICB7ICQxLT5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEFpZGxNZW1iZXI+KCQyKSk7ICQkID0gJDE7IH0KKyB8IGludGVyZmFjZV9tZW1iZXJzIGRlY2wKKyAgeworICAgIGlmICgkMikgJDEtPmVtcGxhY2VfYmFjaygkMik7ICAvLyBkZWNsIG1heSBiZSBudWxscHRyIG9uIGVycm9yCisgICAgJCQgPSAkMTsKKyAgfQogIHwgaW50ZXJmYWNlX21lbWJlcnMgZXJyb3IgJzsnIHsKICAgICBwcy0+QWRkRXJyb3IoKTsKICAgICAkJCA9ICQxOwpAQCAtNTM4LDcgKzU1MSw3IEBACiBjb25zdGFudF9kZWNsCiAgOiBhbm5vdGF0aW9uX2xpc3QgQ09OU1QgdHlwZSBpZGVudGlmaWVyICc9JyBjb25zdF9leHByICc7JyB7CiAgICAgaWYgKCQxLT5zaXplKCkgPiAwKSB7Ci0gICAgICAkMy0+U2V0Q29tbWVudHMoJDEtPmJlZ2luKCktPkdldENvbW1lbnRzKCkpOworICAgICAgJDMtPlNldENvbW1lbnRzKCQxLT5iZWdpbigpLT5nZXQoKS0+R2V0Q29tbWVudHMoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICQzLT5TZXRDb21tZW50cygkMi0+R2V0Q29tbWVudHMoKSk7CiAgICAgfQpAQCAtNTc5LDcgKzU5Miw4IEBACiAgOwogCiBlbnVtX2RlY2wKLSA6IEVOVU0gaWRlbnRpZmllciBlbnVtX2RlY2xfYm9keSB7CisgOiBFTlVNIHF1YWxpZmllZF9uYW1lIGVudW1fZGVjbF9ib2R5IHsKKyAgICBwcy0+Q2hlY2tWYWxpZFR5cGVOYW1lKCokMiwgbG9jKEAyKSk7CiAgICAgJCQgPSBuZXcgQWlkbEVudW1EZWNsYXJhdGlvbihsb2MoQDIpLCAkMi0+R2V0VGV4dCgpLCAkMywgcHMtPlBhY2thZ2UoKSwgJDEtPkdldENvbW1lbnRzKCkpOwogICAgIGRlbGV0ZSAkMTsKICAgICBkZWxldGUgJDI7CkBAIC01ODksNiArNjAzLDcgQEAKIAogdW5pb25fZGVjbAogIDogVU5JT04gcXVhbGlmaWVkX25hbWUgb3B0aW9uYWxfdHlwZV9wYXJhbXMgJ3snIHBhcmNlbGFibGVfbWVtYmVycyAnfScgeworICAgIHBzLT5DaGVja1ZhbGlkVHlwZU5hbWUoKiQyLCBsb2MoQDIpKTsKICAgICAkJCA9IG5ldyBBaWRsVW5pb25EZWNsKGxvYyhAMiksICQyLT5HZXRUZXh0KCksIHBzLT5QYWNrYWdlKCksICQxLT5HZXRDb21tZW50cygpLCAkMywgJDUpOwogICAgIGRlbGV0ZSAkMTsKICAgICBkZWxldGUgJDI7CkBAIC02MDEsNyArNjE2LDcgQEAKICAgICBkZWxldGUgJDI7CiAgIH0KICB8IGFubm90YXRpb25fbGlzdCBPTkVXQVkgdHlwZSBpZGVudGlmaWVyICcoJyBhcmdfbGlzdCAnKScgJzsnIHsKLSAgICBjb25zdCBhdXRvJiBjb21tZW50cyA9ICgkMS0+c2l6ZSgpID4gMCkgPyAkMS0+YmVnaW4oKS0+R2V0Q29tbWVudHMoKSA6ICQyLT5HZXRDb21tZW50cygpOworICAgIGNvbnN0IGF1dG8mIGNvbW1lbnRzID0gKCQxLT5zaXplKCkgPiAwKSA/ICQxLT5iZWdpbigpLT5nZXQoKS0+R2V0Q29tbWVudHMoKSA6ICQyLT5HZXRDb21tZW50cygpOwogICAgICQkID0gbmV3IEFpZGxNZXRob2QobG9jKEA0KSwgdHJ1ZSwgJDMsICQ0LT5HZXRUZXh0KCksICQ2LCBjb21tZW50cyk7CiAgICAgJDMtPkFubm90YXRlKHN0ZDo6bW92ZSgqJDEpKTsKICAgICBkZWxldGUgJDE7CkBAIC02MTksNyArNjM0LDcgQEAKICAgICBkZWxldGUgJDc7CiAgIH0KICB8IGFubm90YXRpb25fbGlzdCBPTkVXQVkgdHlwZSBpZGVudGlmaWVyICcoJyBhcmdfbGlzdCAnKScgJz0nIElOVFZBTFVFICc7JyB7Ci0gICAgY29uc3QgYXV0byYgY29tbWVudHMgPSAoJDEtPnNpemUoKSA+IDApID8gJDEtPmJlZ2luKCktPkdldENvbW1lbnRzKCkgOiAkMi0+R2V0Q29tbWVudHMoKTsKKyAgICBjb25zdCBhdXRvJiBjb21tZW50cyA9ICgkMS0+c2l6ZSgpID4gMCkgPyAkMS0+YmVnaW4oKS0+Z2V0KCktPkdldENvbW1lbnRzKCkgOiAkMi0+R2V0Q29tbWVudHMoKTsKICAgICBpbnQzMl90IHNlcmlhbCA9IDA7CiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCgkOS0+R2V0VGV4dCgpLCAmc2VyaWFsKSkgewogICAgICAgICBBSURMX0VSUk9SKGxvYyhAOSkpIDw8ICJDb3VsZCBub3QgcGFyc2UgaW50IHZhbHVlOiAiIDw8ICQ5LT5HZXRUZXh0KCk7CkBAIC02NjEsMTAgKzY3Niw5IEBACiAKIG5vbl9hcnJheV90eXBlCiAgOiBhbm5vdGF0aW9uX2xpc3QgcXVhbGlmaWVkX25hbWUgewotICAgICQkID0gbmV3IEFpZGxUeXBlU3BlY2lmaWVyKGxvYyhAMiksICQyLT5HZXRUZXh0KCksIGZhbHNlLCBudWxscHRyLCAkMi0+R2V0Q29tbWVudHMoKSk7Ci0gICAgcHMtPkRlZmVyUmVzb2x1dGlvbigkJCk7CisgICAgJCQgPSBuZXcgQWlkbFR5cGVTcGVjaWZpZXIobG9jKEAyKSwgJDItPkdldFRleHQoKSwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwgJDItPkdldENvbW1lbnRzKCkpOwogICAgIGlmICghJDEtPmVtcHR5KCkpIHsKLSAgICAgICQkLT5TZXRDb21tZW50cygkMS0+YmVnaW4oKS0+R2V0Q29tbWVudHMoKSk7CisgICAgICAkJC0+U2V0Q29tbWVudHMoJDEtPmJlZ2luKCktPmdldCgpLT5HZXRDb21tZW50cygpKTsKICAgICAgICQkLT5Bbm5vdGF0ZShzdGQ6Om1vdmUoKiQxKSk7CiAgICAgfQogICAgIGRlbGV0ZSAkMTsKQEAgLTY5NSw4ICs3MDksMjAgQEAKICAgICAgIEFJRExfRVJST1IobG9jKEAyKSkgPDwgIkFubm90YXRpb25zIGZvciBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQuIjsKICAgICAgIHBzLT5BZGRFcnJvcigpOwogICAgIH0KLSAgICBpZiAoISQxLT5TZXRBcnJheSgpKSB7Ci0gICAgICBBSURMX0VSUk9SKGxvYyhAMSkpIDw8ICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIjsKKyAgICBpZiAoISQxLT5NYWtlQXJyYXkoRHluYW1pY0FycmF5e30pKSB7CisgICAgICBBSURMX0VSUk9SKGxvYyhAMSkpIDw8ICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiI7CisgICAgICBwcy0+QWRkRXJyb3IoKTsKKyAgICB9CisgICAgJCQgPSAkMTsKKyAgICBkZWxldGUgJDI7CisgIH0KKyB8IHR5cGUgYW5ub3RhdGlvbl9saXN0ICdbJyBjb25zdF9leHByICddJyB7CisgICAgaWYgKCEkMi0+ZW1wdHkoKSkgeworICAgICAgQUlETF9FUlJPUihsb2MoQDIpKSA8PCAiQW5ub3RhdGlvbnMgZm9yIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZC4iOworICAgICAgcHMtPkFkZEVycm9yKCk7CisgICAgfQorICAgIGlmICghJDEtPk1ha2VBcnJheShGaXhlZFNpemVBcnJheXtzdGQ6OnVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+KCQ0KX0pKSB7CisgICAgICBBSURMX0VSUk9SKGxvYyhAMSkpIDw8ICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiI7CiAgICAgICBwcy0+QWRkRXJyb3IoKTsKICAgICB9CiAgICAgJCQgPSAkMTsKQEAgLTcyMCwxMiArNzQ2LDExIEBACiAKIGFubm90YXRpb25fbGlzdAogIDoKLSAgeyAkJCA9IG5ldyBzdGQ6OnZlY3RvcjxBaWRsQW5ub3RhdGlvbj4oKTsgfQorICB7ICQkID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4+KCk7IH0KICB8IGFubm90YXRpb25fbGlzdCBhbm5vdGF0aW9uCiAgIHsKICAgICBpZiAoJDIgIT0gbnVsbHB0cikgewotICAgICAgJDEtPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoKiQyKSk7Ci0gICAgICBkZWxldGUgJDI7CisgICAgICAkMS0+ZW1wbGFjZV9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxBaWRsQW5ub3RhdGlvbj4oJDIpKTsKICAgICB9CiAgICAgJCQgPSAkMTsKICAgfTsKQEAgLTc2MiwxNCArNzg3LDI1IEBACiAKIGFubm90YXRpb24KICA6IEFOTk9UQVRJT04gewotICAgICQkID0gQWlkbEFubm90YXRpb246OlBhcnNlKGxvYyhAMSksICQxLT5HZXRUZXh0KCksIG51bGxwdHIsICQxLT5HZXRDb21tZW50cygpKTsKKyAgICAvLyByZWxlYXNlKCkgcmV0dXJucyBudWxscHRyIGlmIHVuaXF1ZV9wdHIgaXMgZW1wdHkuCisgICAgJCQgPSBBaWRsQW5ub3RhdGlvbjo6UGFyc2UobG9jKEAxKSwgJDEtPkdldFRleHQoKSwge30sICQxLT5HZXRDb21tZW50cygpKS5yZWxlYXNlKCk7CisgICAgaWYgKCEkJCkgeworICAgICAgcHMtPkFkZEVycm9yKCk7CisgICAgfQorICAgIGRlbGV0ZSAkMTsKKyAgfQorIHwgQU5OT1RBVElPTiAnKCcgY29uc3RfZXhwciAnKScgeworICAgIGF1dG8gdmFsdWUgPSBzdGQ6OnNoYXJlZF9wdHI8QWlkbENvbnN0YW50VmFsdWU+KCQzKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEFpZGxDb25zdGFudFZhbHVlPj4gcGFyYW1ldGVyX2xpc3Qge3sidmFsdWUiICwgdmFsdWV9fTsKKyAgICAkJCA9IEFpZGxBbm5vdGF0aW9uOjpQYXJzZShsb2MoQDEsIEA0KSwgJDEtPkdldFRleHQoKSwgc3RkOjptb3ZlKHBhcmFtZXRlcl9saXN0KSwgJDEtPkdldENvbW1lbnRzKCkpLnJlbGVhc2UoKTsKICAgICBpZiAoISQkKSB7CiAgICAgICBwcy0+QWRkRXJyb3IoKTsKICAgICB9CiAgICAgZGVsZXRlICQxOwogICB9CiAgfCBBTk5PVEFUSU9OICcoJyBwYXJhbWV0ZXJfbGlzdCAnKScgewotICAgICQkID0gQWlkbEFubm90YXRpb246OlBhcnNlKGxvYyhAMSwgQDQpLCAkMS0+R2V0VGV4dCgpLCAkMywgJDEtPkdldENvbW1lbnRzKCkpOworICAgIC8vIHJlbGVhc2UoKSByZXR1cm5zIG51bGxwdHIgaWYgdW5pcXVlX3B0ciBpcyBlbXB0eS4KKyAgICAkJCA9IEFpZGxBbm5vdGF0aW9uOjpQYXJzZShsb2MoQDEsIEA0KSwgJDEtPkdldFRleHQoKSwgc3RkOjptb3ZlKCokMyksICQxLT5HZXRDb21tZW50cygpKS5yZWxlYXNlKCk7CiAgICAgaWYgKCEkJCkgewogICAgICAgcHMtPkFkZEVycm9yKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYWlkbF90b19jcHAuY3BwIGIvYWlkbF90b19jcHAuY3BwCmluZGV4IDQwNTUyYzguLjk4N2FiYTUgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fY3BwLmNwcAorKysgYi9haWRsX3RvX2NwcC5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKIG5hbWVzcGFjZSBjcHAgewogCiBuYW1lc3BhY2UgeworCiBzdGQ6OnN0cmluZyBSYXdQYXJjZWxNZXRob2QoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWRNZXRob2QpIHsKICAgc3RhdGljIG1hcDxzdHJpbmcsIHN0cmluZz4ga0J1aWx0aW4gPSB7CkBAIC03MCw2ICs3MSwxMCBAQAogICBjb25zdCBib29sIGlzVmVjdG9yID0gdHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKTsKICAgY29uc3QgYm9vbCB1dGY4ID0gdHlwZS5Jc1V0ZjhJbkNwcCgpOwogCisgIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIHJldHVybiAiRml4ZWRBcnJheSI7CisgIH0KKwogICBpZiAoYXV0byBlbnVtX2RlY2wgPSB0eXBlbmFtZXMuR2V0RW51bURlY2xhcmF0aW9uKHR5cGUpOyBlbnVtX2RlY2wgIT0gbnVsbHB0cikgewogICAgIGlmIChpc1ZlY3RvcikgewogICAgICAgcmV0dXJuICJFbnVtVmVjdG9yIjsKQEAgLTE0Nyw2ICsxNTIsOSBAQAogCiAgIGlmIChyYXdfdHlwZS5Jc051bGxhYmxlKCkgJiYgIUFpZGxUeXBlbmFtZXM6OklzUHJpbWl0aXZlVHlwZW5hbWUodHlwZS5HZXROYW1lKCkpICYmCiAgICAgICB0eXBlLkdldE5hbWUoKSAhPSAiSUJpbmRlciIgJiYgdHlwZW5hbWVzLkdldEVudW1EZWNsYXJhdGlvbih0eXBlKSA9PSBudWxscHRyKSB7CisgICAgaWYgKHJhd190eXBlLklzSGVhcE51bGxhYmxlKCkpIHsKKyAgICAgIHJldHVybiAiOjpzdGQ6OnVuaXF1ZV9wdHI8IiArIHR5cGVfc3RyICsgIj4iOworICAgIH0KICAgICByZXR1cm4gIjo6c3RkOjpvcHRpb25hbDwiICsgdHlwZV9zdHIgKyAiPiI7CiAgIH0KICAgcmV0dXJuIHR5cGVfc3RyOwpAQCAtMTg2LDUyICsxOTQsNTAgQEAKICAgaWYgKGRlZmluZWRUeXBlICE9IG51bGxwdHIgJiYgZGVmaW5lZFR5cGUtPkFzSW50ZXJmYWNlKCkgIT0gbnVsbHB0cikgewogICAgIHJldHVybiAiOjphbmRyb2lkOjpzcDwiICsgR2V0UmF3Q3BwTmFtZSh0eXBlKSArICI+IjsKICAgfQotCi0gIHJldHVybiBXcmFwSWZOdWxsYWJsZShHZXRSYXdDcHBOYW1lKHR5cGUpLCByYXdfdHlwZSwgdHlwZW5hbWVzKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSkgewotICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKLSAgICByZXR1cm4gcmF3X3ZhbHVlOwotICB9Ci0KLSAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJsb25nIikgewotICAgIHJldHVybiByYXdfdmFsdWUgKyAiTCI7Ci0gIH0KLQotICBpZiAodHlwZS5HZXROYW1lKCkgPT0gIlN0cmluZyIgJiYgIXR5cGUuSXNVdGY4SW5DcHAoKSkgewotICAgIHJldHVybiAiOjphbmRyb2lkOjpTdHJpbmcxNigiICsgcmF3X3ZhbHVlICsgIikiOwotICB9Ci0KLSAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKLSAgICBhdXRvIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKLSAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCByYXdfdmFsdWUgPDwgIlwiIjsKLSAgICByZXR1cm4gR2V0UmF3Q3BwTmFtZSh0eXBlKSArICI6OiIgKyByYXdfdmFsdWUuc3Vic3RyKHJhd192YWx1ZS5maW5kX2xhc3Rfb2YoJy4nKSArIDEpOwotICB9Ci0KLSAgcmV0dXJuIHJhd192YWx1ZTsKLX07Ci0KLXN0ZDo6c3RyaW5nIEdldFRyYW5zYWN0aW9uSWRGb3IoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCkgewotICByZXR1cm4gQ2xhc3NOYW1lKGlmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpICsgIjo6VFJBTlNBQ1RJT05fIiArIG1ldGhvZC5HZXROYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIENwcE5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIGlmICh0eXBlLklzQXJyYXkoKSB8fCB0eXBlbmFtZXMuSXNMaXN0KHR5cGUpKSB7Ci0gICAgc3RkOjpzdHJpbmcgY3BwX25hbWUgPSBHZXRDcHBOYW1lKHR5cGUsIHR5cGVuYW1lcyk7Ci0gICAgaWYgKHR5cGUuSXNOdWxsYWJsZSgpKSB7Ci0gICAgICByZXR1cm4gIjo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPCIgKyBjcHBfbmFtZSArICI+PiI7Ci0gICAgfQotICAgIHJldHVybiAiOjpzdGQ6OnZlY3RvcjwiICsgY3BwX25hbWUgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHlwZS5Jc0dlbmVyaWMoKSkgeworICBhdXRvIGNwcF9uYW1lID0gR2V0UmF3Q3BwTmFtZSh0eXBlKTsKKyAgaWYgKHR5cGUuSXNHZW5lcmljKCkpIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbXM7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKICAgICAgIHR5cGVfcGFyYW1zLnB1c2hfYmFjayhDcHBOYW1lT2YoKnBhcmFtZXRlciwgdHlwZW5hbWVzKSk7CiAgICAgfQotICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVzPCVzPiIsIEdldENwcE5hbWUodHlwZSwgdHlwZW5hbWVzKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Sm9pbih0eXBlX3BhcmFtcywgIiwgIikuY19zdHIoKSk7CisgICAgY3BwX25hbWUgKz0gIjwiICsgYmFzZTo6Sm9pbih0eXBlX3BhcmFtcywgIiwgIikgKyAiPiI7CiAgIH0KLSAgcmV0dXJuIEdldENwcE5hbWUodHlwZSwgdHlwZW5hbWVzKTsKKyAgcmV0dXJuIFdyYXBJZk51bGxhYmxlKGNwcF9uYW1lLCByYXdfdHlwZSwgdHlwZW5hbWVzKTsKK30KK30gIC8vIG5hbWVzcGFjZQorc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICByZXR1cm4gQ3BwQ29uc3RhbnRWYWx1ZURlY29yYXRvcih0eXBlLCByYXdfdmFsdWUsIC8qaXNfbmRrPSovZmFsc2UpOworfTsKKworc3RkOjpzdHJpbmcgR2V0VHJhbnNhY3Rpb25JZEZvcihjb25zdCBzdGQ6OnN0cmluZyYgY2xhenosIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCkgeworICByZXR1cm4gY2xhenogKyAiOjpUUkFOU0FDVElPTl8iICsgbWV0aG9kLkdldE5hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgQ3BwTmFtZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgLy8gZ2V0IGJhc2UgdHlwZSdzIGNwcF9uYW1lIHdpdGggbnVsbGFibGUgcHJvY2Vzc2VkLgorICBzdGQ6OnN0cmluZyBjcHBfbmFtZSA9IEdldENwcE5hbWUodHlwZSwgdHlwZW5hbWVzKTsKKworICBpZiAodHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKSkgeworICAgIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgICAgYXV0byBkaW1lbnNpb25zID0gdHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKTsKKyAgICAgIGZvciAoYXV0byBpdCA9IHJiZWdpbihkaW1lbnNpb25zKSwgZW5kID0gcmVuZChkaW1lbnNpb25zKTsgaXQgIT0gZW5kOyBpdCsrKSB7CisgICAgICAgIGNwcF9uYW1lID0gInN0ZDo6YXJyYXk8IiArIGNwcF9uYW1lICsgIiwgIiArIHN0ZDo6dG9fc3RyaW5nKCppdCkgKyAiPiI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNwcF9uYW1lID0gIjo6c3RkOjp2ZWN0b3I8IiArIGNwcF9uYW1lICsgIj4iOworICAgIH0KKworICAgIC8vIHdyYXAgbnVsbGFibGUgYWdhaW4gYmVjYXVzZSBAbnVsbGFibGUgYXBwbGllcyB0byBCT1RIIGFycmF5IHR5cGUob3V0ZXJtb3N0IHR5cGUpIEFORCBiYXNlCisgICAgLy8gdHlwZShpbm5lcm1vc3QgdHlwZSkKKyAgICBpZiAodHlwZS5Jc0hlYXBOdWxsYWJsZSgpKSB7CisgICAgICBjcHBfbmFtZSA9ICI6OnN0ZDo6dW5pcXVlX3B0cjwiICsgY3BwX25hbWUgKyAiPiI7CisgICAgfSBlbHNlIGlmICh0eXBlLklzTnVsbGFibGUoKSkgeworICAgICAgY3BwX25hbWUgPSAiOjpzdGQ6Om9wdGlvbmFsPCIgKyBjcHBfbmFtZSArICI+IjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNwcF9uYW1lOwogfQogCiBib29sIElzTm9uQ29weWFibGVUeXBlKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKQEAgLTI3NCw0MCArMjgwLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBDcHBOYW1lT2YoZW51bV9kZWNsLT5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9uYW1lLmNfc3RyKCkpOwogICB9Ci0KLSAgaWYgKHR5cGVuYW1lcy5HZXRJbnRlcmZhY2UodHlwZSkgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZXRSYXdDcHBOYW1lKHR5cGUpICsgIjo6YXNCaW5kZXIoIiArIHZhcmlhYmxlX25hbWUgKyAiKSI7Ci0gIH0KLQogICByZXR1cm4gdmFyaWFibGVfbmFtZTsKIH0KIAorLy8gQWRkIGluY2x1ZGVzIGZvciBhIHR5cGUgcmVmLiBOb3RlIHRoYXQgdGhpcyBpcyBub24tcmVjdXJzaXZlLgogdm9pZCBBZGRIZWFkZXJzKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCiAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBoZWFkZXJzKSB7Ci0gIEFJRExfRkFUQUxfSUYodHlwZW5hbWVzLklzTGlzdCh0eXBlKSAmJiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpICE9IDEsIHR5cGUpOwotICBib29sIGlzVmVjdG9yID0gdHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKTsKLSAgYm9vbCBpc051bGxhYmxlID0gdHlwZS5Jc051bGxhYmxlKCk7Ci0gIGJvb2wgdXRmOCA9IHR5cGUuSXNVdGY4SW5DcHAoKTsKLQotICBpZiAoaXNWZWN0b3IpIHsKLSAgICBoZWFkZXJzLT5pbnNlcnQoInZlY3RvciIpOwotICB9Ci0gIGlmICh0eXBlLklzR2VuZXJpYygpKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKLSAgICAgIEFkZEhlYWRlcnMoKnBhcmFtZXRlciwgdHlwZW5hbWVzLCBoZWFkZXJzKTsKKyAgaWYgKHR5cGUuSXNBcnJheSgpKSB7CisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICBoZWFkZXJzLT5pbnNlcnQoImFycmF5Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGhlYWRlcnMtPmluc2VydCgidmVjdG9yIik7CiAgICAgfQogICB9Ci0gIGlmIChpc051bGxhYmxlKSB7CisgIGlmICh0eXBlLklzTnVsbGFibGUoKSkgewogICAgIGlmICh0eXBlLkdldE5hbWUoKSAhPSAiSUJpbmRlciIpIHsKICAgICAgIGhlYWRlcnMtPmluc2VydCgib3B0aW9uYWwiKTsKICAgICB9CiAgIH0KICAgaWYgKHR5cGVuYW1lcy5Jc0xpc3QodHlwZSkpIHsKLSAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8gZm9yIExpc3QuCisgICAgaGVhZGVycy0+aW5zZXJ0KCJ2ZWN0b3IiKTsKICAgICByZXR1cm47CiAgIH0KICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJTdHJpbmciKSB7Ci0gICAgaGVhZGVycy0+aW5zZXJ0KHV0ZjggPyAic3RyaW5nIiA6ICJ1dGlscy9TdHJpbmcxNi5oIik7CisgICAgaWYgKHR5cGUuSXNVdGY4SW5DcHAoKSkgeworICAgICAgaGVhZGVycy0+aW5zZXJ0KCJzdHJpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgaGVhZGVycy0+aW5zZXJ0KCJ1dGlscy9TdHJpbmcxNi5oIik7CisgICAgfQogICAgIHJldHVybjsKICAgfQogICBpZiAodHlwZS5HZXROYW1lKCkgPT0gIklCaW5kZXIiKSB7CkBAIC0zMzcsMjYgKzMzNywyMSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGF1dG8gZGVmaW5lZFR5cGUgPSB0eXBlbmFtZXMuVHJ5R2V0RGVmaW5lZFR5cGUodHlwZS5HZXROYW1lKCkpOwotICBBSURMX0ZBVEFMX0lGKGRlZmluZWRUeXBlID09IG51bGxwdHIsIHR5cGUpIDw8ICJVbmV4cGVjdGVkIHR5cGU6ICIgPDwgdHlwZS5HZXROYW1lKCk7CisgIGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZW5hbWVzLlRyeUdldERlZmluZWRUeXBlKHR5cGUuR2V0TmFtZSgpKTsKKyAgQUlETF9GQVRBTF9JRihkZWZpbmVkX3R5cGUgPT0gbnVsbHB0ciwgdHlwZSkgPDwgIlVuZXhwZWN0ZWQgdHlwZTogIiA8PCB0eXBlLkdldE5hbWUoKTsKIAotICBpZiAoZGVmaW5lZFR5cGUtPkFzSW50ZXJmYWNlKCkgIT0gbnVsbHB0ciB8fCBkZWZpbmVkVHlwZS0+QXNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpICE9IG51bGxwdHIgfHwKLSAgICAgIGRlZmluZWRUeXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHIgfHwgZGVmaW5lZFR5cGUtPkFzVW5pb25EZWNsYXJhdGlvbigpICE9IG51bGxwdHIpIHsKLSAgICBBZGRIZWFkZXJzKCpkZWZpbmVkVHlwZSwgaGVhZGVycyk7Ci0gIH0gZWxzZSBpZiAoZGVmaW5lZFR5cGUtPkFzUGFyY2VsYWJsZSgpICE9IG51bGxwdHIpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfaGVhZGVyID0gZGVmaW5lZFR5cGUtPkFzUGFyY2VsYWJsZSgpLT5HZXRDcHBIZWFkZXIoKTsKLSAgICBBSURMX0ZBVEFMX0lGKGNwcF9oZWFkZXIuZW1wdHkoKSwgZGVmaW5lZFR5cGUtPkFzUGFyY2VsYWJsZSgpKQotICAgICAgICA8PCAiUGFyY2VsYWJsZSAiIDw8IGRlZmluZWRUeXBlLT5Bc1BhcmNlbGFibGUoKS0+R2V0Q2Fub25pY2FsTmFtZSgpCi0gICAgICAgIDw8ICIgaGFzIG5vIEMrKyBoZWFkZXIgZGVmaW5lZC4iOwotICAgIGhlYWRlcnMtPmluc2VydChjcHBfaGVhZGVyKTsKLSAgfQorICBoZWFkZXJzLT5pbnNlcnQoQ3BwSGVhZGVyRm9yVHlwZSgqZGVmaW5lZF90eXBlKSk7CiB9CiAKLXZvaWQgQWRkSGVhZGVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRUeXBlLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGhlYWRlcnMpIHsKLSAgdmVjdG9yPHN0cmluZz4gbmFtZSA9IGRlZmluZWRUeXBlLkdldFNwbGl0UGFja2FnZSgpOwotICBuYW1lLnB1c2hfYmFjayhkZWZpbmVkVHlwZS5HZXROYW1lKCkpOwotICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfaGVhZGVyID0gSm9pbihuYW1lLCAnLycpICsgIi5oIjsKLSAgaGVhZGVycy0+aW5zZXJ0KGNwcF9oZWFkZXIpOworc3RkOjpzdHJpbmcgQ3BwSGVhZGVyRm9yVHlwZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSkgeworICAvLyBVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZSBzaG91bGQgc2V0IGl0cyBjcHBfaGVhZGVyLiB1c2UgaXQuCisgIGlmIChhdXRvIHVuc3RydWN0dXJlZCA9IEFpZGxDYXN0PEFpZGxQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyB1bnN0cnVjdHVyZWQpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjcHBfaGVhZGVyID0gdW5zdHJ1Y3R1cmVkLT5HZXRDcHBIZWFkZXIoKTsKKyAgICBBSURMX0ZBVEFMX0lGKGNwcF9oZWFkZXIuZW1wdHkoKSwgdW5zdHJ1Y3R1cmVkKQorICAgICAgICA8PCAiUGFyY2VsYWJsZSAiIDw8IHVuc3RydWN0dXJlZC0+R2V0Q2Fub25pY2FsTmFtZSgpIDw8ICIgaGFzIG5vIEMrKyBoZWFkZXIgZGVmaW5lZC4iOworICAgIHJldHVybiBjcHBfaGVhZGVyOworICB9CisgIHJldHVybiBIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCAvKnVzZV9vc19zZXA9Ki9mYWxzZSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjcHAKZGlmZiAtLWdpdCBhL2FpZGxfdG9fY3BwLmggYi9haWRsX3RvX2NwcC5oCmluZGV4IGY2OTc0ZjUuLjczYjc5YmIgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fY3BwLmgKKysrIGIvYWlkbF90b19jcHAuaApAQCAtMjMsNyArMjMsOSBAQAogCiAvLyBUaGlzIGhlYWRlciBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0cmFuc2xhdGUgQUlETCB0aGluZ3MgdG8gY3BwIHRoaW5ncy4KIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSk7CitzdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAogc3RydWN0IENvZGVHZW5lcmF0b3JDb250ZXh0IHsKICAgQ29kZVdyaXRlciYgd3JpdGVyOwpAQCAtMzQsNyArMzYsNyBAQAogICBjb25zdCBib29sIGlzUG9pbnRlcjsgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZhcmlhYmxlICduYW1lJyBpcyBhIHBvaW50ZXIgb3Igbm90CiB9OwogCi1zdGQ6OnN0cmluZyBHZXRUcmFuc2FjdGlvbklkRm9yKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QpOworc3RkOjpzdHJpbmcgR2V0VHJhbnNhY3Rpb25JZEZvcihjb25zdCBzdGQ6OnN0cmluZyYgY2xhenosIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCk7CiAKIHN0ZDo6c3RyaW5nIENwcE5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKIApAQCAtNjEsNyArNjMsNyBAQAogdm9pZCBBZGRIZWFkZXJzKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCiAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBoZWFkZXJzKTsKIAotdm9pZCBBZGRIZWFkZXJzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgcGFyY2VsYWJsZSwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBoZWFkZXJzKTsKK3N0ZDo6c3RyaW5nIENwcEhlYWRlckZvclR5cGUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUpOwogfSAgLy8gbmFtZXNwYWNlIGNwcAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9haWRsX3RvX2NwcF9jb21tb24uY3BwIGIvYWlkbF90b19jcHBfY29tbW9uLmNwcAppbmRleCBmMGJmMWRjLi5mMGRmMzA1IDEwMDY0NAotLS0gYS9haWRsX3RvX2NwcF9jb21tb24uY3BwCisrKyBiL2FpZGxfdG9fY3BwX2NvbW1vbi5jcHAKQEAgLTE5LDE1ICsxOSwxNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogCisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCi0jaW5jbHVkZSAiYXN0X2NwcC5oIgogI2luY2x1ZGUgImNvbW1lbnRzLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgIm9zLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6YmFzZTo6Sm9pbjsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTY2LDYgKzY3LDggQEAKICAgICAgIHJldHVybiAiSSIgKyBiYXNlX25hbWUgKyAiRGVmYXVsdCI7CiAgICAgY2FzZSBDbGFzc05hbWVzOjpCQVNFOgogICAgICAgcmV0dXJuIGJhc2VfbmFtZTsKKyAgICBjYXNlIENsYXNzTmFtZXM6OkRFTEVHQVRPUl9JTVBMOgorICAgICAgcmV0dXJuICJJIiArIGJhc2VfbmFtZSArICJEZWxlZ2F0b3IiOwogICAgIGNhc2UgQ2xhc3NOYW1lczo6UkFXOgogICAgICAgW1tmYWxsdGhyb3VnaF1dOwogICAgIGRlZmF1bHQ6CkBAIC03NSwxOSArNzgsMjEgQEAKIAogc3RkOjpzdHJpbmcgSGVhZGVyRmlsZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lcyBjbGFzc190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9vc19zZXApIHsKLSAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoID0gZGVmaW5lZF90eXBlLkdldFBhY2thZ2UoKTsKLSAgZm9yIChjaGFyJiBjIDogZmlsZV9wYXRoKSB7Ci0gICAgaWYgKGMgPT0gJy4nKSB7Ci0gICAgICBjID0gKHVzZV9vc19zZXApID8gT1NfUEFUSF9TRVBBUkFUT1IgOiAnLyc7Ci0gICAgfQorICAvLyBGb3IgYSBuZXN0ZWQgdHlwZSwgd2UgbmVlZCB0byBpbmNsdWRlIGl0cyB0b3AtbW9zdCBwYXJlbnQgdHlwZSdzIGhlYWRlci4KKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0b3BsZXZlbCA9ICZkZWZpbmVkX3R5cGU7CisgIGZvciAoYXV0byBwYXJlbnQgPSB0b3BsZXZlbC0+R2V0UGFyZW50VHlwZSgpOyBwYXJlbnQ7KSB7CisgICAgLy8gV2hlbiBpbmNsdWRpbmcgdGhlIHBhcmVudCdzIGhlYWRlciwgaXQgc2hvdWxkIGJlIGFsd2F5cyBSQVcKKyAgICBjbGFzc190eXBlID0gQ2xhc3NOYW1lczo6UkFXOworICAgIHRvcGxldmVsID0gcGFyZW50OworICAgIHBhcmVudCA9IHRvcGxldmVsLT5HZXRQYXJlbnRUeXBlKCk7CiAgIH0KLSAgaWYgKCFmaWxlX3BhdGguZW1wdHkoKSkgewotICAgIGZpbGVfcGF0aCArPSAodXNlX29zX3NlcCkgPyBPU19QQVRIX1NFUEFSQVRPUiA6ICcvJzsKLSAgfQotICBmaWxlX3BhdGggKz0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgY2xhc3NfdHlwZSk7Ci0gIGZpbGVfcGF0aCArPSAiLmgiOworICBBSURMX0ZBVEFMX0lGKHRvcGxldmVsLT5HZXRQYXJlbnRUeXBlKCkgIT0gbnVsbHB0ciwgZGVmaW5lZF90eXBlKQorICAgICAgPDwgIkNhbid0IGZpbmQgYSB0b3AtbGV2ZWwgZGVjbCI7CiAKLSAgcmV0dXJuIGZpbGVfcGF0aDsKKyAgY2hhciBzZXBhcmF0b3IgPSAodXNlX29zX3NlcCkgPyBPU19QQVRIX1NFUEFSQVRPUiA6ICcvJzsKKyAgdmVjdG9yPHN0cmluZz4gcGF0aHMgPSB0b3BsZXZlbC0+R2V0U3BsaXRQYWNrYWdlKCk7CisgIHBhdGhzLnB1c2hfYmFjayhDbGFzc05hbWUoKnRvcGxldmVsLCBjbGFzc190eXBlKSk7CisgIHJldHVybiBKb2luKHBhdGhzLCBzZXBhcmF0b3IpICsgIi5oIjsKIH0KIAogdm9pZCBFbnRlck5hbWVzcGFjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlKSB7CkBAIC0xOTYsMTEgKzIwMSwzOCBAQAogICByZXR1cm4gY29kZTsKIH0KIAorLy8gUmV0dXJucyBQYXJlbnQxOjpQYXJlbnQyOjpTZWxmLiBOYW1lc3BhY2VzIGFyZSBub3QgaW5jbHVkZWQuCitzdHJpbmcgR2V0UXVhbGlmaWVkTmFtZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIENsYXNzTmFtZXMgY2xhc3NfbmFtZXMpIHsKKyAgc3RyaW5nIHFfbmFtZSA9IENsYXNzTmFtZSh0eXBlLCBjbGFzc19uYW1lcyk7CisgIGZvciAoYXV0byBwYXJlbnQgPSB0eXBlLkdldFBhcmVudFR5cGUoKTsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQtPkdldFBhcmVudFR5cGUoKSkgeworICAgIHFfbmFtZSA9IHBhcmVudC0+R2V0TmFtZSgpICsgIjo6IiArIHFfbmFtZTsKKyAgfQorICByZXR1cm4gcV9uYW1lOworfQorCisvLyBHZW5lcmF0ZXMgZW51bSdzIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4gYSBwcm9wZXIgc2NvcGUuIEZvciBleGFtcGxlLCBpbiBpdHMKKy8vIG5hbWVzcGFjZSBvciBwYXJlbnQgdHlwZS4KK3ZvaWQgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfdHlwZSwgQ29uc3RhbnRWYWx1ZURlY29yYXRvciBkZWNvcmF0b3IpIHsKKyAgb3V0IDw8ICJlbnVtIGNsYXNzIjsKKyAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZW51bV9kZWNsKTsKKyAgb3V0IDw8ICIgIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICIgOiAiIDw8IGJhY2tpbmdfdHlwZSA8PCAiIHtcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKKyAgICBvdXQgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICIgPSAiCisgICAgICAgIDw8IGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBkZWNvcmF0b3IpIDw8ICIsXG4iOworICB9CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9O1xuIjsKK30KKworLy8gZW51bV92YWx1ZXMgdGVtcGxhdGUgdmFsdWUgaXMgZGVmaW5lZCBpbiBpdHMgb3duIG5hbWVzcGFjZSAoYW5kcm9pZDo6aW50ZXJuYWwgb3IgbmRrOjppbnRlcm5hbCksCisvLyBzbyB0aGUgZW51bV9kZWNsIHR5cGUgc2hvdWxkIGJlIGZ1bGx5IHF1YWxpZmllZC4KIHN0ZDo6c3RyaW5nIEdlbmVyYXRlRW51bVZhbHVlcyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBlbmNsb3NpbmdfbmFtZXNwYWNlc19vZl9lbnVtX2RlY2wpIHsKICAgY29uc3QgYXV0byBmcV9uYW1lID0KICAgICAgIEpvaW4oQXBwZW5kKGVuY2xvc2luZ19uYW1lc3BhY2VzX29mX2VudW1fZGVjbCwgZW51bV9kZWNsLkdldFNwbGl0UGFja2FnZSgpKSwgIjo6IikgKwotICAgICAgIjo6IiArIGVudW1fZGVjbC5HZXROYW1lKCk7CisgICAgICAiOjoiICsgR2V0UXVhbGlmaWVkTmFtZShlbnVtX2RlY2wpOwogICBjb25zdCBhdXRvIHNpemUgPSBlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKS5zaXplKCk7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwogICBjb2RlIDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaFxuIjsKQEAgLTIxNyw2ICsyNDksNDEgQEAKICAgcmV0dXJuIGNvZGUuc3RyKCk7CiB9CiAKKy8vIHRvU3RyaW5nKGVudW1fdHlwZSkgaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUuCisvLyBTbywgaWYgZW51bV9kZWNsIGlzIG5lc3RlZCBpbiBwYXJlbnQgdHlwZShzKSwgaXQgc2hvdWxkIGJlIHF1YWxpZmllZCB3aXRoIHBhcmVudCB0eXBlKHMpLgorc3RkOjpzdHJpbmcgR2VuZXJhdGVFbnVtVG9TdHJpbmcoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfdHlwZSkgeworICBjb25zdCBhdXRvIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoZW51bV9kZWNsKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHNpZ25hdHVyZSA9CisgICAgICAiW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCIgKyBxX25hbWUgKyAiIHZhbCkiOworICBpZiAoZW51bV9kZWNsLklzRGVwcmVjYXRlZCgpKSB7CisgICAgY29kZSA8PCBzaWduYXR1cmU7CisgICAgR2VuZXJhdGVEZXByZWNhdGVkKGNvZGUsIGVudW1fZGVjbCk7CisgICAgY29kZSA8PCAiO1xuIjsKKyAgfQorICBjb2RlIDw8IHNpZ25hdHVyZSA8PCAiIHtcbiI7CisgIGNvZGUgPDwgIiAgc3dpdGNoKHZhbCkge1xuIjsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVuaXF1ZV9jYXNlczsKKyAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLkdldEVudW1lcmF0b3JzKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBjID0gZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIEFpZGxDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKKyAgICAvLyBPbmx5IGFkZCBhIGNhc2UgaWYgaXRzIHZhbHVlIGhhcyBub3QgeWV0IGJlZW4gdXNlZCBpbiB0aGUgc3dpdGNoCisgICAgLy8gc3RhdGVtZW50LiBDKysgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgY2FzZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgYnV0CisgICAgLy8gZW51bXMgZG9lcyBhbGxvdyB0aGlzLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgZmlyc3QgZGVjbGFyZWQKKyAgICAvLyBlbnVtZXJhdG9yIHdpdGggdGhlIGdpdmVuIHZhbHVlIGlzIHByaW50ZWQuCisgICAgaWYgKHVuaXF1ZV9jYXNlcy5jb3VudChjKSA9PSAwKSB7CisgICAgICB1bmlxdWVfY2FzZXMuaW5zZXJ0KGMpOworICAgICAgY29kZSA8PCAiICBjYXNlICIgPDwgcV9uYW1lIDw8ICI6OiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICI6XG4iOworICAgICAgY29kZSA8PCAiICAgIHJldHVybiBcIiIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICJcIjtcbiI7CisgICAgfQorICB9CisgIGNvZGUgPDwgIiAgZGVmYXVsdDpcbiI7CisgIGNvZGUgPDwgIiAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8IiA8PCBiYWNraW5nX3R5cGUgPDwgIj4odmFsKSk7XG4iOworICBjb2RlIDw8ICIgIH1cbiI7CisgIGNvZGUgPDwgIn1cbiI7CisgIHJldHVybiBjb2RlLnN0cigpOworfQorCiBzdGQ6OnN0cmluZyBUZW1wbGF0ZURlY2woY29uc3QgQWlkbFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSkgewogICBzdGQ6OnN0cmluZyBkZWNsID0gIiI7CiAgIGlmIChkZWZpbmVkX3R5cGUuSXNHZW5lcmljKCkpIHsKQEAgLTIzMiw2ICsyOTksMzkgQEAKIAogdm9pZCBHZW5lcmF0ZVBhcmNlbGFibGVDb21wYXJpc29uT3BlcmF0b3JzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIHsKICAgc3RkOjpzZXQ8c3RyaW5nPiBvcGVyYXRvcnN7IjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsICIhPSJ9OworCisgIGlmIChwYXJjZWxhYmxlLkFzVW5pb25EZWNsYXJhdGlvbigpICYmIHBhcmNlbGFibGUuSXNGaXhlZFNpemUoKSkgeworICAgIGF1dG8gbmFtZSA9IHBhcmNlbGFibGUuR2V0TmFtZSgpOworICAgIGF1dG8gbWF4X3RhZyA9IHBhcmNlbGFibGUuR2V0RmllbGRzKCkuYmFjaygpLT5HZXROYW1lKCk7CisgICAgYXV0byBtaW5fdGFnID0gcGFyY2VsYWJsZS5HZXRGaWVsZHMoKS5mcm9udCgpLT5HZXROYW1lKCk7CisgICAgYXV0byB0bXBsID0gUiItLShzdGF0aWMgaW50IF9jbXAoY29uc3Qge25hbWV9JiBfbGhzLCBjb25zdCB7bmFtZX0mIF9yaHMpIHt7CisgIHJldHVybiBfY21wX3ZhbHVlKF9saHMuZ2V0VGFnKCksIF9yaHMuZ2V0VGFnKCkpIHx8IF9jbXBfdmFsdWVfYXQ8e21heF90YWd9PihfbGhzLCBfcmhzKTsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWc+CitzdGF0aWMgaW50IF9jbXBfdmFsdWVfYXQoY29uc3Qge25hbWV9JiBfbGhzLCBjb25zdCB7bmFtZX0mIF9yaHMpIHt7CisgIGlmIGNvbnN0ZXhwciAoX1RhZyA9PSB7bWluX3RhZ30pIHt7CisgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSk7CisgIH19IGVsc2Uge3sKKyAgICByZXR1cm4gKF9saHMuZ2V0VGFnKCkgPT0gX1RhZykKKyAgICAgID8gX2NtcF92YWx1ZShfbGhzLmdldDxfVGFnPigpLCBfcmhzLmdldDxfVGFnPigpKQorICAgICAgOiBfY21wX3ZhbHVlX2F0PChUYWcpKF9UYWctMSk+KF9saHMsIF9yaHMpOworICB9fQorfX0KK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHlwZT4KK3N0YXRpYyBpbnQgX2NtcF92YWx1ZShjb25zdCBfVHlwZSYgX2xocywgY29uc3QgX1R5cGUmIF9yaHMpIHt7CisgIHJldHVybiAoX2xocyA9PSBfcmhzKSA/IDAgOiAoX2xocyA8IF9yaHMpID8gLTEgOiAxOworfX0KKyktLSI7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KHRtcGwsIGZtdDo6YXJnKCJuYW1lIiwgbmFtZSksIGZtdDo6YXJnKCJtaW5fdGFnIiwgbWluX3RhZyksCisgICAgICAgICAgICAgICAgICAgICAgIGZtdDo6YXJnKCJtYXhfdGFnIiwgbWF4X3RhZykpOworICAgIGZvciAoY29uc3QgYXV0byYgb3AgOiBvcGVyYXRvcnMpIHsKKyAgICAgIG91dCA8PCAiaW5saW5lIGJvb2wgb3BlcmF0b3IiIDw8IG9wIDw8ICIoY29uc3QgIiA8PCBuYW1lIDw8ICImX3JocykgY29uc3Qge1xuIjsKKyAgICAgIG91dCA8PCAiICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgIiA8PCBvcCA8PCAiIDA7XG4iOworICAgICAgb3V0IDw8ICJ9XG4iOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKwogICBib29sIGlzX2VtcHR5ID0gZmFsc2U7CiAKICAgYXV0byBjb21wYXJhYmxlID0gWyZdKGNvbnN0IHN0cmluZyYgcHJlZml4KSB7CkBAIC0zMzAsMjcgKzQzMCw5NiBAQAogICByZXR1cm4gIiI7CiB9CiAKLWNvbnN0IHZlY3RvcjxzdHJpbmc+IFVuaW9uV3JpdGVyOjpoZWFkZXJzewotICAgICJjYXNzZXJ0IiwgICAgICAvLyBfX2Fzc2VydCBmb3IgbG9nZ2luZwotICAgICJ0eXBlX3RyYWl0cyIsICAvLyBzdGQ6OmlzX3NhbWVfdgotICAgICJ1dGlsaXR5IiwgICAgICAvLyBzdGQ6Om1vZGUvZm9yd2FyZCBmb3IgdmFsdWUKLSAgICAidmFyaWFudCIsICAgICAgLy8gc3RkOjp2YXJpYW50IGZvciB2YWx1ZQotfTsKK3NpemVfdCBBbGlnbm1lbnRPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CisgIHN0YXRpYyBtYXA8c3RyaW5nLCBzaXplX3Q+IGFsaWdubWVudCA9IHsKKyAgICAgIHsiYm9vbGVhbiIsIDF9LCB7ImJ5dGUiLCAxfSwgeyJjaGFyIiwgMn0sIHsiZG91YmxlIiwgOH0sCisgICAgICB7ImZsb2F0IiwgNH0sICAgeyJpbnQiLCA0fSwgIHsibG9uZyIsIDh9LAorICB9OworCisgIHN0cmluZyBuYW1lID0gdHlwZS5HZXROYW1lKCk7CisgIGlmIChhdXRvIGVudW1fZGVjbCA9IHR5cGVuYW1lcy5HZXRFbnVtRGVjbGFyYXRpb24odHlwZSk7IGVudW1fZGVjbCkgeworICAgIG5hbWUgPSBlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCkuR2V0TmFtZSgpOworICB9CisgIC8vIGRlZmF1bHQgdG8gMCBmb3IgcGFyY2VsYWJsZSB0eXBlcworICByZXR1cm4gYWxpZ25tZW50W25hbWVdOworfQorCitzdGQ6OnNldDxzdGQ6OnN0cmluZz4gVW5pb25Xcml0ZXI6OkdldEhlYWRlcnMoY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVjbCkgeworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdW5pb25faGVhZGVycyA9IHsKKyAgICAgICJjYXNzZXJ0IiwgICAgICAvLyBfX2Fzc2VydCBmb3IgbG9nZ2luZworICAgICAgInR5cGVfdHJhaXRzIiwgIC8vIHN0ZDo6aXNfc2FtZV92CisgICAgICAidXRpbGl0eSIsICAgICAgLy8gc3RkOjptb2RlL2ZvcndhcmQgZm9yIHZhbHVlCisgICAgICAidmFyaWFudCIsICAgICAgLy8gdW5pb24ncyBpbXBsCisgIH07CisgIGlmIChkZWNsLklzRml4ZWRTaXplKCkpIHsKKyAgICB1bmlvbl9oZWFkZXJzLmluc2VydCgidHVwbGUiKTsgIC8vIGZpeGVkLXNpemVkIHVuaW9uJ3MgdHlwZWxpc3QKKyAgfQorICByZXR1cm4gdW5pb25faGVhZGVyczsKK30KKworLy8gZml4ZWQtc2l6ZWQgdW5pb24gY2xhc3MgbG9va3MgbGlrZToKKy8vIGNsYXNzIFVuaW9uIHsKKy8vIHB1YmxpYzoKKy8vICAgZW51bSBUYWcgOiB1aW50OF90IHsKKy8vICAgICBmaWVsZDEgPSAwLAorLy8gICAgIGZpZWxkMiwKKy8vICAgfTsKKy8vICAuLi4gbWV0aG9kcyAuLi4KKy8vIHByaXZhdGU6CisvLyAgIFRhZyBfdGFnOworLy8gICB1bmlvbiB7CisvLyAgICAgdHlwZTEgZmllbGQxOworLy8gICAgIHR5cGUyIGZpZWxkMjsKKy8vICAgfSBfdmFsdWU7CisvLyB9OwogCiB2b2lkIFVuaW9uV3JpdGVyOjpQcml2YXRlRmllbGRzKENvZGVXcml0ZXImIG91dCkgY29uc3QgewotICB2ZWN0b3I8c3RyaW5nPiBmaWVsZF90eXBlczsKLSAgZm9yIChjb25zdCBhdXRvJiBmIDogZGVjbC5HZXRGaWVsZHMoKSkgewotICAgIGZpZWxkX3R5cGVzLnB1c2hfYmFjayhuYW1lX29mKGYtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSk7CisgIGlmIChkZWNsLklzRml4ZWRTaXplKCkpIHsKKyAgICBBSURMX0ZBVEFMX0lGKGRlY2wuR2V0RmllbGRzKCkuZW1wdHkoKSwgZGVjbCkgPDwgIlVuaW9uICciIDw8IGRlY2wuR2V0TmFtZSgpIDw8ICInIGlzIGVtcHR5LiI7CisgICAgY29uc3QgYXV0byYgZmlyc3RfZmllbGQgPSBkZWNsLkdldEZpZWxkcygpWzBdOworICAgIGNvbnN0IGF1dG8mIGRlZmF1bHRfbmFtZSA9IGZpcnN0X2ZpZWxkLT5HZXROYW1lKCk7CisgICAgY29uc3QgYXV0byYgZGVmYXVsdF92YWx1ZSA9IG5hbWVfb2YoZmlyc3RfZmllbGQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSArICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZpZWxkLT5WYWx1ZVN0cmluZyhkZWNvcmF0b3IpICsgIikiOworCisgICAgb3V0IDw8ICJUYWcgX3RhZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICgxKSkpID0gIiA8PCBkZWZhdWx0X25hbWUgPDwgIjtcbiI7CisgICAgb3V0IDw8ICJ1bmlvbiBfdmFsdWVfdCB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBvdXQgPDwgIl92YWx1ZV90KCkge31cbiI7CisgICAgb3V0IDw8ICJ+X3ZhbHVlX3QoKSB7fVxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBkZWNsLkdldEZpZWxkcygpKSB7CisgICAgICBjb25zdCBhdXRvJiBmbiA9IGYtPkdldE5hbWUoKTsKKyAgICAgIG91dCA8PCBuYW1lX29mKGYtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSA8PCAiICIgPDwgZm47CisgICAgICBpZiAoZGVjbC5Jc0ZpeGVkU2l6ZSgpKSB7CisgICAgICAgIGludCBhbGlnbm1lbnQgPSBBbGlnbm1lbnRPZihmLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CisgICAgICAgIGlmIChhbGlnbm1lbnQgPiAwKSB7CisgICAgICAgICAgb3V0IDw8ICIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoIiA8PCBzdGQ6OnRvX3N0cmluZyhhbGlnbm1lbnQpIDw8ICIpKSkiOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZm4gPT0gZGVmYXVsdF9uYW1lKSB7CisgICAgICAgIG91dCA8PCAiID0gIiA8PCBkZWZhdWx0X3ZhbHVlOworICAgICAgfQorICAgICAgb3V0IDw8ICI7XG4iOworICAgIH0KKyAgICBvdXQuRGVkZW50KCk7CisgICAgb3V0IDw8ICJ9IF92YWx1ZTtcbiI7CisgIH0gZWxzZSB7CisgICAgdmVjdG9yPHN0cmluZz4gZmllbGRfdHlwZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBmIDogZGVjbC5HZXRGaWVsZHMoKSkgeworICAgICAgZmllbGRfdHlwZXMucHVzaF9iYWNrKG5hbWVfb2YoZi0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpKTsKKyAgICB9CisgICAgb3V0IDw8ICJzdGQ6OnZhcmlhbnQ8IiArIEpvaW4oZmllbGRfdHlwZXMsICIsICIpICsgIj4gX3ZhbHVlO1xuIjsKICAgfQotICBvdXQgPDwgInN0ZDo6dmFyaWFudDwiICsgSm9pbihmaWVsZF90eXBlcywgIiwgIikgKyAiPiBfdmFsdWU7XG4iOwogfQogCiB2b2lkIFVuaW9uV3JpdGVyOjpQdWJsaWNGaWVsZHMoQ29kZVdyaXRlciYgb3V0KSBjb25zdCB7Ci0gIEFpZGxUeXBlU3BlY2lmaWVyIHRhZ190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImludCIsIC8qIGlzX2FycmF5PSAqLyBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9wYXJhbXM9ICovIG51bGxwdHIsIENvbW1lbnRze30pOwotICB0YWdfdHlwZS5SZXNvbHZlKHR5cGVuYW1lcyk7Ci0KLSAgb3V0IDw8ICJlbnVtIFRhZyA6ICIgPDwgbmFtZV9vZih0YWdfdHlwZSwgdHlwZW5hbWVzKSA8PCAiIHtcbiI7CisgIHN0ZDo6c3RyaW5nIHRhZ190eXBlID0gImludDMyX3QiOworICBpZiAoZGVjbC5Jc0ZpeGVkU2l6ZSgpKSB7CisgICAgLy8gRm9yIEBGaXhlZFNpemUgdW5pb24sIHdlIHVzZSBhIHNtYWxsZXIgdHlwZSBmb3IgYSB0YWcgdG8gbWluaW1pemUgdGhlIHNpemUgb3ZlcmhlYWQuCisgICAgQUlETF9GQVRBTF9JRihkZWNsLkdldEZpZWxkcygpLnNpemUoKSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpLCBkZWNsKQorICAgICAgICA8PCAiVG9vIG1hbnkgZmllbGRzIGZvciBARml4ZWRTaXplIjsKKyAgICB0YWdfdHlwZSA9ICJ1aW50OF90IjsKKyAgfQorICBvdXQgPDwgImVudW0gVGFnIDogIiA8PCB0YWdfdHlwZSA8PCAiIHtcbiI7CiAgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwogICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBkZWNsLkdldEZpZWxkcygpKSB7CiAgICAgb3V0IDw8ICIgICIgPDwgZi0+R2V0TmFtZSgpOwpAQCAtMzYzLDIxICs1MzIsNTMgQEAKIAogICBjb25zdCBhdXRvJiBuYW1lID0gZGVjbC5HZXROYW1lKCk7CiAKLSAgQUlETF9GQVRBTF9JRihkZWNsLkdldEZpZWxkcygpLmVtcHR5KCksIGRlY2wpIDw8ICJVbmlvbiAnIiA8PCBuYW1lIDw8ICInIGlzIGVtcHR5LiI7Ci0gIGNvbnN0IGF1dG8mIGZpcnN0X2ZpZWxkID0gZGVjbC5HZXRGaWVsZHMoKVswXTsKLSAgY29uc3QgYXV0byYgZGVmYXVsdF9uYW1lID0gZmlyc3RfZmllbGQtPkdldE5hbWUoKTsKLSAgY29uc3QgYXV0byYgZGVmYXVsdF92YWx1ZSA9Ci0gICAgICBuYW1lX29mKGZpcnN0X2ZpZWxkLT5HZXRUeXBlKCksIHR5cGVuYW1lcykgKyAiKCIgKyBmaXJzdF9maWVsZC0+VmFsdWVTdHJpbmcoZGVjb3JhdG9yKSArICIpIjsKKyAgaWYgKGRlY2wuSXNGaXhlZFNpemUoKSkgeworICAgIHZlY3RvcjxzdHJpbmc+IGZpZWxkX3R5cGVzOworICAgIGZvciAoY29uc3QgYXV0byYgZiA6IGRlY2wuR2V0RmllbGRzKCkpIHsKKyAgICAgIGZpZWxkX3R5cGVzLnB1c2hfYmFjayhuYW1lX29mKGYtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSk7CisgICAgfQorICAgIGF1dG8gdHlwZWxpc3QgPSBKb2luKGZpZWxkX3R5cGVzLCAiLCAiKTsKKyAgICBhdXRvIHRtcGwgPSBSIi0tKAordGVtcGxhdGUgPFRhZyBfVGFnPgordXNpbmcgX2F0ID0gdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PF9UYWcsIHN0ZDo6dHVwbGU8e3R5cGVsaXN0fT4+Ojp0eXBlOwordGVtcGxhdGUgPFRhZyBfVGFnLCB0eXBlbmFtZSBfVHlwZT4KK3N0YXRpYyB7bmFtZX0gbWFrZShfVHlwZSYmIF9hcmcpIHt7CisgIHtuYW1lfSBfaW5zdDsKKyAgX2luc3Quc2V0PF9UYWc+KHN0ZDo6Zm9yd2FyZDxfVHlwZT4oX2FyZykpOworICByZXR1cm4gX2luc3Q7Cit9fQorY29uc3RleHByIFRhZyBnZXRUYWcoKSBjb25zdCB7eworICByZXR1cm4gX3RhZzsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWc+Citjb25zdCBfYXQ8X1RhZz4mIGdldCgpIGNvbnN0IHt7CisgIGlmIChfVGFnICE9IF90YWcpIHt7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9fQorICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWc+CitfYXQ8X1RhZz4mIGdldCgpIHt7CisgIGlmIChfVGFnICE9IF90YWcpIHt7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9fQorICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKK319Cit0ZW1wbGF0ZSA8VGFnIF9UYWcsIHR5cGVuYW1lIF9UeXBlPgordm9pZCBzZXQoX1R5cGUmJiBfYXJnKSB7eworICBfdGFnID0gX1RhZzsKKyAgZ2V0PF9UYWc+KCkgPSBzdGQ6OmZvcndhcmQ8X1R5cGU+KF9hcmcpOworfX0KKyktLSI7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KHRtcGwsIGZtdDo6YXJnKCJuYW1lIiwgbmFtZSksIGZtdDo6YXJnKCJ0eXBlbGlzdCIsIHR5cGVsaXN0KSk7CisgIH0gZWxzZSB7CisgICAgQUlETF9GQVRBTF9JRihkZWNsLkdldEZpZWxkcygpLmVtcHR5KCksIGRlY2wpIDw8ICJVbmlvbiAnIiA8PCBuYW1lIDw8ICInIGlzIGVtcHR5LiI7CisgICAgY29uc3QgYXV0byYgZmlyc3RfZmllbGQgPSBkZWNsLkdldEZpZWxkcygpWzBdOworICAgIGNvbnN0IGF1dG8mIGRlZmF1bHRfbmFtZSA9IGZpcnN0X2ZpZWxkLT5HZXROYW1lKCk7CisgICAgY29uc3QgYXV0byYgZGVmYXVsdF92YWx1ZSA9IG5hbWVfb2YoZmlyc3RfZmllbGQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSArICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZpZWxkLT5WYWx1ZVN0cmluZyhkZWNvcmF0b3IpICsgIikiOwogCi0gIGF1dG8gdG1wbCA9IFIiLS0oCisgICAgYXV0byB0bXBsID0gUiItLSgKIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+Piwge25hbWV9PjsKIAoge25hbWV9KCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDx7ZGVmYXVsdF9uYW1lfT4sIHtkZWZhdWx0X3ZhbHVlfSkge3sgfX0KLXtuYW1lfShjb25zdCB7bmFtZX0mKSA9IGRlZmF1bHQ7Ci17bmFtZX0oe25hbWV9JiYpID0gZGVmYXVsdDsKLXtuYW1lfSYgb3BlcmF0b3I9KGNvbnN0IHtuYW1lfSYpID0gZGVmYXVsdDsKLXtuYW1lfSYgb3BlcmF0b3I9KHtuYW1lfSYmKSA9IGRlZmF1bHQ7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCkBAIC00MjAsMTQgKzYyMSwxNSBAQAogfX0KIAogKS0tIjsKLSAgb3V0IDw8IGZtdDo6Zm9ybWF0KHRtcGwsIGZtdDo6YXJnKCJuYW1lIiwgbmFtZSksIGZtdDo6YXJnKCJkZWZhdWx0X25hbWUiLCBkZWZhdWx0X25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgZm10OjphcmcoImRlZmF1bHRfdmFsdWUiLCBkZWZhdWx0X3ZhbHVlKSk7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KHRtcGwsIGZtdDo6YXJnKCJuYW1lIiwgbmFtZSksIGZtdDo6YXJnKCJkZWZhdWx0X25hbWUiLCBkZWZhdWx0X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICBmbXQ6OmFyZygiZGVmYXVsdF92YWx1ZSIsIGRlZmF1bHRfdmFsdWUpKTsKKyAgfQogfQogCiB2b2lkIFVuaW9uV3JpdGVyOjpSZWFkRnJvbVBhcmNlbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFBhcmNlbFdyaXRlckNvbnRleHQmIGN0eCkgY29uc3QgewotICBBaWRsVHlwZVNwZWNpZmllciB0YWdfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCAvKiBpc19hcnJheT0gKi8gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGVfcGFyYW1zPSAqLyBudWxscHRyLCBDb21tZW50c3t9KTsKLSAgdGFnX3R5cGUuUmVzb2x2ZSh0eXBlbmFtZXMpOworICAvLyBFdmVuIHRob3VnaCBARml4ZWRTaXplIHVuaW9uIG1heSB1c2UgYSBzbWFsbGVyIHR5cGUgdGhhbiBpbnQzMl90LCB3ZSBuZWVkIHRvIHJlYWQvd3JpdGUgaXQKKyAgLy8gYXMgaWYgaXQgaXMgaW50MzJfdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGJja2VuZHMuCisgIGF1dG8gdGFnX3R5cGUgPSB0eXBlbmFtZXMuTWFrZVJlc29sdmVkVHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJpbnQiLCAvKiBpc19hcnJheT0gKi8gZmFsc2UpOwogCiAgIGNvbnN0IHN0cmluZyB0YWcgPSAiX2FpZGxfdGFnIjsKICAgY29uc3Qgc3RyaW5nIHZhbHVlID0gIl9haWRsX3ZhbHVlIjsKQEAgLTQ0MSw3ICs2NDMsNyBAQAogICB9OwogCiAgIG91dCA8PCBmbXQ6OmZvcm1hdCgie30ge307XG4iLCBjdHguc3RhdHVzX3R5cGUsIHN0YXR1cyk7Ci0gIHJlYWRfdmFyKHRhZywgdGFnX3R5cGUpOworICByZWFkX3Zhcih0YWcsICp0YWdfdHlwZSk7CiAgIG91dCA8PCBmbXQ6OmZvcm1hdCgic3dpdGNoICh7fSkge3tcbiIsIHRhZyk7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBkZWNsLkdldEZpZWxkcygpKSB7CiAgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJjYXNlIHt9OiB7e1xuIiwgdmFyaWFibGUtPkdldE5hbWUoKSk7CkBAIC00NjksMTYgKzY3MSwxNiBAQAogfQogCiB2b2lkIFVuaW9uV3JpdGVyOjpXcml0ZVRvUGFyY2VsKENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsV3JpdGVyQ29udGV4dCYgY3R4KSBjb25zdCB7Ci0gIEFpZGxUeXBlU3BlY2lmaWVyIHRhZ190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImludCIsIC8qIGlzX2FycmF5PSAqLyBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9wYXJhbXM9ICovIG51bGxwdHIsIENvbW1lbnRze30pOwotICB0YWdfdHlwZS5SZXNvbHZlKHR5cGVuYW1lcyk7CisgIC8vIEV2ZW4gdGhvdWdoIEBGaXhlZFNpemUgdW5pb24gbWF5IHVzZSBhIHNtYWxsZXIgdHlwZSB0aGFuIGludDMyX3QsIHdlIG5lZWQgdG8gcmVhZC93cml0ZSBpdAorICAvLyBhcyBpZiBpdCBpcyBpbnQzMl90IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYmNrZW5kcy4KKyAgYXV0byB0YWdfdHlwZSA9IHR5cGVuYW1lcy5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImludCIsIC8qIGlzX2FycmF5PSAqLyBmYWxzZSk7CiAKICAgY29uc3Qgc3RyaW5nIHRhZyA9ICJfYWlkbF90YWciOwogICBjb25zdCBzdHJpbmcgdmFsdWUgPSAiX2FpZGxfdmFsdWUiOwogICBjb25zdCBzdHJpbmcgc3RhdHVzID0gIl9haWRsX3JldF9zdGF0dXMiOwogCiAgIG91dCA8PCBmbXQ6OmZvcm1hdCgie30ge30gPSAiLCBjdHguc3RhdHVzX3R5cGUsIHN0YXR1cyk7Ci0gIGN0eC53cml0ZV9mdW5jKG91dCwgImdldFRhZygpIiwgdGFnX3R5cGUpOworICBjdHgud3JpdGVfZnVuYyhvdXQsICJnZXRUYWcoKSIsICp0YWdfdHlwZSk7CiAgIG91dCA8PCAiO1xuIjsKICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJpZiAoe30gIT0ge30pIHJldHVybiB7fTtcbiIsIHN0YXR1cywgY3R4LnN0YXR1c19vaywgc3RhdHVzKTsKICAgb3V0IDw8ICJzd2l0Y2ggKGdldFRhZygpKSB7XG4iOwpAQCAtNDkxLDYgKzY5Myw3NyBAQAogICBvdXQgPDwgIl9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIFwiY2FuJ3QgcmVhY2ggaGVyZVwiKTtcbiI7CiB9CiAKK3N0ZDo6c3RyaW5nIENwcENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUsIGJvb2wgaXNfbmRrKSB7CisgIGlmICh0eXBlLklzQXJyYXkoKSkgeworICAgIGF1dG8gdmFsdWVzID0gc3RkOjpnZXQ8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PihyYXdfdmFsdWUpOworICAgIC8vIEhleGFkZWNpbWFsIGxpdGVyYWxzIGZvciBieXRlIGFycmF5cyBzaG91bGQgYmUgY2FzdGVkIHRvIHVpbnQ4X3QKKyAgICBpZiAodHlwZS5HZXROYW1lKCkgPT0gImJ5dGUiICYmCisgICAgICAgIHN0ZDo6YW55X29mKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIHZhbHVlKSB7IHJldHVybiAhdmFsdWUuZW1wdHkoKSAmJiB2YWx1ZVswXSA9PSAnLSc7IH0pKSB7CisgICAgICBmb3IgKGF1dG8mIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgIC8vIGNhc3Qgb25seSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHZhbHVlWzBdID09ICctJykgeworICAgICAgICAgIHZhbHVlID0gInVpbnQ4X3QoIiArIHZhbHVlICsgIikiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gInsiICsgSm9pbih2YWx1ZXMsICIsICIpICsgIn0iOworCisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICAvLyBGb3IgYXJyYXlzLCB1c2UgZG91YmxlIGJyYWNlcyBiZWNhdXNlIGFycmF5cyBjYW4gYmUgbmVzdGVkLgorICAgICAgLy8gIGUuZy4pIGFycmF5PGFycmF5PGludCwgMj4sIDM+IGludHMgPSB7eyB7ezEsMn19LCB7ezMsNH19LCB7ezUsNn19IH19OworICAgICAgLy8gVmVjdG9ycyBtaWdodCBuZWVkIGRvdWJsZSBicmFjZXMsIGJ1dCBzaW5jZSB3ZSBkb24ndCBoYXZlIG5lc3RlZCB2ZWN0b3JzICh5ZXQpCisgICAgICAvLyBzaW5nbGUgYnJhY2Ugd291bGQgd29yayBldmVuIGZvciBvcHRpb25hbCB2ZWN0b3JzLgorICAgICAgdmFsdWUgPSAieyIgKyB2YWx1ZSArICJ9IjsKKyAgICB9CisKKyAgICBpZiAoIXR5cGUuSXNNdXRhdGVkKCkgJiYgdHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICAgIC8vIEZvciBvdXRlcm1vc3Qgc3RkOjpvcHRpb25hbDw+LCB3ZSBuZWVkIGFuIGFkZGl0aW9uYWwgYnJhY2UgcGFpciB0byBpbml0aWFsaXplIGl0cyB2YWx1ZS4KKyAgICAgIHZhbHVlID0gInsiICsgdmFsdWUgKyAifSI7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSA9IHN0ZDo6Z2V0PHN0ZDo6c3RyaW5nPihyYXdfdmFsdWUpOworICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUodHlwZS5HZXROYW1lKCkpKSB7CisgICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJib29sZWFuIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSBpZiAodHlwZS5HZXROYW1lKCkgPT0gImJ5dGUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh0eXBlLkdldE5hbWUoKSA9PSAiY2hhciIpIHsKKyAgICAgIC8vIFRPRE86IGNvbnNpZGVyICdMJy1wcmVmaXggZm9yIHdpZGUgY2hhciBsaXRlcmFsCisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh0eXBlLkdldE5hbWUoKSA9PSAiZG91YmxlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSBpZiAodHlwZS5HZXROYW1lKCkgPT0gImZsb2F0IikgeworICAgICAgcmV0dXJuIHZhbHVlOyAgLy8gdmFsdWUgaGFzICdmJyBzdWZmaXgKKyAgICB9IGVsc2UgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJpbnQiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmICh0eXBlLkdldE5hbWUoKSA9PSAibG9uZyIpIHsKKyAgICAgIHJldHVybiB2YWx1ZSArICJMIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJTdHJpbmciKSB7CisgICAgICBpZiAoaXNfbmRrIHx8IHR5cGUuSXNVdGY4SW5DcHAoKSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIjo6YW5kcm9pZDo6U3RyaW5nMTYoIiArIHZhbHVlICsgIikiOworICAgICAgfQorICAgIH0KKyAgICBBSURMX0ZBVEFMKHR5cGUpIDw8ICJVbmtub3duIGJ1aWx0LWluIHR5cGU6ICIgPDwgdHlwZS5HZXROYW1lKCk7CisgIH0KKworICBhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsKKyAgQUlETF9GQVRBTF9JRighZGVmaW5lZF90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgdmFsdWUgPDwgIlwiIjsKKyAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7CisgIEFJRExfRkFUQUxfSUYoIWVudW1fdHlwZSwgdHlwZSkgPDwgIkludmFsaWQgdHlwZSBmb3IgXCIiIDw8IHZhbHVlIDw8ICJcIiI7CisKKyAgYXV0byBjcHBfdHlwZV9uYW1lID0gIjo6IiArIEpvaW4oU3BsaXQoZW51bV90eXBlLT5HZXRDYW5vbmljYWxOYW1lKCksICIuIiksICI6OiIpOworICBpZiAoaXNfbmRrKSB7CisgICAgY3BwX3R5cGVfbmFtZSA9ICI6OmFpZGwiICsgY3BwX3R5cGVfbmFtZTsKKyAgfQorICByZXR1cm4gY3BwX3R5cGVfbmFtZSArICI6OiIgKyB2YWx1ZS5zdWJzdHIodmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKK30KIH0gIC8vIG5hbWVzcGFjZSBjcHAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYWlkbF90b19jcHBfY29tbW9uLmggYi9haWRsX3RvX2NwcF9jb21tb24uaAppbmRleCBmOWZlODBiLi5lNjczM2I2IDEwMDY0NAotLS0gYS9haWRsX3RvX2NwcF9jb21tb24uaAorKysgYi9haWRsX3RvX2NwcF9jb21tb24uaApAQCAtMzMsMTYgKzMzLDIzIEBACiAKIC8vIFRoZXNlIHJvdWdobHkgY29ycmVzcG9uZCB0byB0aGUgdmFyaW91cyBjbGFzcyBuYW1lcyBpbiB0aGUgQysrIGhpZXJhcmNoeToKIGVudW0gY2xhc3MgQ2xhc3NOYW1lcyB7Ci0gIEJBU0UsICAgICAgICAgIC8vIEZvbyAobm90IGEgcmVhbCBjbGFzcywgYnV0IHVzZWZ1bCBpbiBzb21lIGNpcmN1bXN0YW5jZXMpLgotICBDTElFTlQsICAgICAgICAvLyBCcEZvbwotICBTRVJWRVIsICAgICAgICAvLyBCbkZvbwotICBJTlRFUkZBQ0UsICAgICAvLyBJRm9vCi0gIERFRkFVTFRfSU1QTCwgIC8vIElGb29EZWZhdWx0Ci0gIFJBVywgICAgICAgICAgIC8vIChhcyBzaG93biBpbiB0aGUgZmlsZSkKKyAgQkFTRSwgICAgICAgICAgICAvLyBGb28gKG5vdCBhIHJlYWwgY2xhc3MsIGJ1dCB1c2VmdWwgaW4gc29tZSBjaXJjdW1zdGFuY2VzKS4KKyAgQ0xJRU5ULCAgICAgICAgICAvLyBCcEZvbworICBTRVJWRVIsICAgICAgICAgIC8vIEJuRm9vCisgIElOVEVSRkFDRSwgICAgICAgLy8gSUZvbworICBERUZBVUxUX0lNUEwsICAgIC8vIElGb29EZWZhdWx0CisgIFJBVywgICAgICAgICAgICAgLy8gKGFzIHNob3duIGluIHRoZSBmaWxlKQorICBERUxFR0FUT1JfSU1QTCwgIC8vIElGb29EZWxlZ2F0b3IKIH07CiAKIHN0cmluZyBDbGFzc05hbWUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXMgdHlwZSk7CiAKKy8vIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIGtub3duIHR5cGVzIGFuZCBlbnVtIGJhY2tpbmcgdHlwZXMuCisvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHVua25vd24sIG9yIGl0IGlzIGEgRml6ZWRTaXplIHBhcmNlbGFibGUgd2l0aCBpdHMKKy8vIG93biBndWFyYW50ZWVkIGFsaWdubWVudChzbyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNwZWNpZmllZCksIDAgd2lsbCBiZQorLy8gcmV0dXJuZWQuCitzaXplX3QgQWxpZ25tZW50T2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7CisKIC8vIEdlbmVyYXRlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIGEgaGVhZGVyIGZpbGUuICBJZiB8dXNlX29zX3NlcHwgd2UnbGwgdXNlIHRoZQogLy8gb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvciByYXRoZXIgdGhhbiBDKysncyBleHBlY3RlZCAnLycgd2hlbgogLy8gaW5jbHVkaW5nIGhlYWRlcnMuCkBAIC03Myw2ICs4MCwxMyBAQAogICByZXR1cm4gYXBwZW5kZWQ7CiB9CiAKKy8vIFJldHVybnMgUGFyZW50MTo6UGFyZW50Mjo6U2VsZi4gTmFtZXNwYWNlcyBhcmUgbm90IGluY2x1ZGVkLgorc3RkOjpzdHJpbmcgR2V0UXVhbGlmaWVkTmFtZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIENsYXNzTmFtZXMgbmFtZSA9IENsYXNzTmFtZXM6OlJBVyk7CisKK3ZvaWQgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfdHlwZSwgOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yIGRlY29yYXRvcik7CitzdGQ6OnN0cmluZyBHZW5lcmF0ZUVudW1Ub1N0cmluZyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ190eXBlKTsKIHN0ZDo6c3RyaW5nIEdlbmVyYXRlRW51bVZhbHVlcyhjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBlbmNsb3NpbmdfbmFtZXNwYWNlc19vZl9lbnVtX2RlY2wpOwogc3RkOjpzdHJpbmcgVGVtcGxhdGVEZWNsKGNvbnN0IEFpZGxQYXJjZWxhYmxlJiBkZWZpbmVkX3R5cGUpOwpAQCAtMTA2LDcgKzEyMCw4IEBACiAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lczsKICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBBaWRsVHlwZVNwZWNpZmllciYsIGNvbnN0IEFpZGxUeXBlbmFtZXMmKT4gbmFtZV9vZjsKICAgY29uc3QgOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yJiBkZWNvcmF0b3I7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaGVhZGVyczsKKworICBzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEhlYWRlcnMoY29uc3QgQWlkbFVuaW9uRGVjbCYpOwogCiAgIHZvaWQgUHJpdmF0ZUZpZWxkcyhDb2RlV3JpdGVyJiBvdXQpIGNvbnN0OwogICB2b2lkIFB1YmxpY0ZpZWxkcyhDb2RlV3JpdGVyJiBvdXQpIGNvbnN0OwpAQCAtMTE0LDYgKzEyOSw5IEBACiAgIHZvaWQgV3JpdGVUb1BhcmNlbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFBhcmNlbFdyaXRlckNvbnRleHQmKSBjb25zdDsKIH07CiAKK3N0ZDo6c3RyaW5nIENwcENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUsIGJvb2wgaXNfbmRrKTsKIH0gIC8vIG5hbWVzcGFjZSBjcHAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYWlkbF90b19qYXZhLmNwcCBiL2FpZGxfdG9famF2YS5jcHAKaW5kZXggMDQ4ODhmZC4uZDYwMzYyYiAxMDA2NDQKLS0tIGEvYWlkbF90b19qYXZhLmNwcAorKysgYi9haWRsX3RvX2phdmEuY3BwCkBAIC0zOCwyMyArMzgsMjcgQEAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjp2ZWN0b3I7CiAKLXN0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdfdmFsdWUpIHsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpIHsKICAgaWYgKHR5cGUuSXNBcnJheSgpKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZTsKKyAgICBjb25zdCBhdXRvJiB2YWx1ZXMgPSBzdGQ6OmdldDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KHJhd192YWx1ZSk7CisgICAgcmV0dXJuICJ7IiArIEpvaW4odmFsdWVzLCAiLCAiKSArICJ9IjsKICAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4ocmF3X3ZhbHVlKTsKICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJsb25nIikgewotICAgIHJldHVybiByYXdfdmFsdWUgKyAiTCI7CisgICAgcmV0dXJuIHZhbHVlICsgIkwiOwogICB9CiAgIGlmIChhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7CiAgICAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgQUlETF9GQVRBTF9JRighZW51bV90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgcmF3X3ZhbHVlIDw8ICJcIiI7Ci0gICAgcmV0dXJuIHR5cGUuR2V0TmFtZSgpICsgIi4iICsgcmF3X3ZhbHVlLnN1YnN0cihyYXdfdmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKKyAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCB2YWx1ZSA8PCAiXCIiOworICAgIHJldHVybiB0eXBlLkdldE5hbWUoKSArICIuIiArIHZhbHVlLnN1YnN0cih2YWx1ZS5maW5kX2xhc3Rfb2YoJy4nKSArIDEpOwogICB9Ci0gIHJldHVybiByYXdfdmFsdWU7CisgIHJldHVybiB2YWx1ZTsKIH07CiAKLWNvbnN0IHN0cmluZyYgSmF2YU5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zdGFudGlhYmxlID0gZmFsc2UsIGJvb2wgYm94aW5nID0gZmFsc2UpIHsKK2NvbnN0IHN0cmluZyYgSmF2YU5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgYm9vbCBpbnN0YW50aWFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveGluZyA9IGZhbHNlKSB7CiAgIEFJRExfRkFUQUxfSUYoIWFpZGwuSXNSZXNvbHZlZCgpLCBhaWRsKSA8PCBhaWRsLlRvU3RyaW5nKCk7CiAKICAgaWYgKGluc3RhbnRpYWJsZSkgewpAQCAtMTAyLDggKzEwNiw5IEBACiAKICAgLy8gRW51bXMgaW4gSmF2YSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgYmFja2luZyB0eXBlIHdoZW4KICAgLy8gcmVmZXJlbmNlZCBpbiBwYXJjZWxhYmxlcywgbWV0aG9kcywgZXRjLgotICBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gdHlwZW5hbWVzLkdldEVudW1EZWNsYXJhdGlvbihhaWRsKTsKLSAgICAgIGVudW1fZGVjbCAhPSBudWxscHRyKSB7CisgIGNvbnN0IGF1dG8gZGVmaW5lZF90eXBlID0gYWlkbC5HZXREZWZpbmVkVHlwZSgpOworICBpZiAoZGVmaW5lZF90eXBlICYmIGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSkgeworICAgIGNvbnN0IGF1dG8gZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwogICAgIGNvbnN0IHN0cmluZyYgYmFja2luZ190eXBlX25hbWUgPSBlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCkuR2V0TmFtZSgpOwogICAgIEFJRExfRkFUQUxfSUYobS5maW5kKGJhY2tpbmdfdHlwZV9uYW1lKSA9PSBtLmVuZCgpLCBlbnVtX2RlY2wpOwogICAgIEFJRExfRkFUQUxfSUYoIUFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGJhY2tpbmdfdHlwZV9uYW1lKSwgZW51bV9kZWNsKTsKQEAgLTEzMSw1OCArMTM2LDY5IEBACiAKIG5hbWVzcGFjZSB7CiBzdHJpbmcgSmF2YVNpZ25hdHVyZU9mSW50ZXJuYWwoCi0gICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgYm9vbCBpbnN0YW50aWFibGUsCi0gICAgYm9vbCBvbWl0X2FycmF5LCBib29sIGJveGluZyA9IGZhbHNlIC8qIGJveGluZyBjYW4gYmUgdHJ1ZSBvbmx5IGlmIGl0IGlzIGEgdHlwZSBwYXJhbWV0ZXIgKi8pIHsKLSAgc3RyaW5nIHJldCA9IEphdmFOYW1lT2YoYWlkbCwgdHlwZW5hbWVzLCBpbnN0YW50aWFibGUsIGJveGluZyAmJiAhYWlkbC5Jc0FycmF5KCkpOworICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBib29sIGluc3RhbnRpYWJsZSwgYm9vbCBvbWl0X2FycmF5LAorICAgIGJvb2wgYm94aW5nID0gZmFsc2UgLyogYm94aW5nIGNhbiBiZSB0cnVlIG9ubHkgaWYgaXQgaXMgYSB0eXBlIHBhcmFtZXRlciAqLykgeworICBzdHJpbmcgcmV0ID0gSmF2YU5hbWVPZihhaWRsLCBpbnN0YW50aWFibGUsIGJveGluZyAmJiAhYWlkbC5Jc0FycmF5KCkpOwogICBpZiAoYWlkbC5Jc0dlbmVyaWMoKSkgewogICAgIHZlY3RvcjxzdHJpbmc+IGFyZ19uYW1lczsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhIDogYWlkbC5HZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICBhcmdfbmFtZXMuZW1wbGFjZV9iYWNrKAotICAgICAgICAgIEphdmFTaWduYXR1cmVPZkludGVybmFsKCp0YSwgdHlwZW5hbWVzLCBmYWxzZSwgZmFsc2UsIHRydWUgLyogYm94aW5nICovKSk7CisgICAgICBhcmdfbmFtZXMuZW1wbGFjZV9iYWNrKEphdmFTaWduYXR1cmVPZkludGVybmFsKCp0YSwgZmFsc2UsIGZhbHNlLCB0cnVlIC8qIGJveGluZyAqLykpOwogICAgIH0KICAgICByZXQgKz0gIjwiICsgSm9pbihhcmdfbmFtZXMsICIsIikgKyAiPiI7CiAgIH0KICAgaWYgKGFpZGwuSXNBcnJheSgpICYmICFvbWl0X2FycmF5KSB7Ci0gICAgcmV0ICs9ICJbXSI7CisgICAgaWYgKGFpZGwuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICByZXQgKz0gSm9pbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oYWlkbC5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKS5zaXplKCksICJbXSIpLCAiIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCArPSAiW10iOworICAgIH0KICAgfQogICByZXR1cm4gcmV0OwogfQogCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBiYWNraW5nIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gTm90ZTogdGhpcwotLy8gcmV0dXJucyB0eXBlIG5hbWVzIGFzIHVzZWQgaW4gQUlETCwgbm90IGEgSmF2YSBzaWduYXR1cmUuCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBiYWNraW5nIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKy8vIE5vdGU6IERvIG5vdCB1c2UgdGhlIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUhIEl0J3Mgc3VwcG9zZWQgdG8gYmUgdXNlZCBhcyBhIGtleS4KKy8vIFRoaXMgcmV0dXJucyB0eXBlIG5hbWVzIGFzIHVzZWQgaW4gQUlETCwgbm90IGEgSmF2YSBzaWduYXR1cmUuCiAvLyBGb3IgZW51bXMsIHRoaXMgaXMgdGhlIGVudW0ncyBiYWNraW5nIHR5cGUuCiAvLyBGb3IgYWxsIG90aGVyIHR5cGVzLCB0aGlzIGlzIHRoZSB0eXBlIGl0c2VsZi4KLXN0cmluZyBBaWRsQmFja2luZ1R5cGVOYW1lKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3N0cmluZyBBaWRsQmFja2luZ1R5cGVOYW1lKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSB7CiAgIHN0cmluZyB0eXBlX25hbWU7Ci0gIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSB0eXBlbmFtZXMuR2V0RW51bURlY2xhcmF0aW9uKHR5cGUpOwotICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKKyAgY29uc3QgYXV0byBkZWZpbmVkX3R5cGUgPSB0eXBlLkdldERlZmluZWRUeXBlKCk7CisgIGlmIChkZWZpbmVkX3R5cGUgJiYgZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpKSB7CisgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwogICAgIHR5cGVfbmFtZSA9IGVudW1fZGVjbC0+R2V0QmFja2luZ1R5cGUoKS5HZXROYW1lKCk7CiAgIH0gZWxzZSB7CiAgICAgdHlwZV9uYW1lID0gdHlwZS5HZXROYW1lKCk7CiAgIH0KICAgaWYgKHR5cGUuSXNBcnJheSgpKSB7Ci0gICAgdHlwZV9uYW1lICs9ICJbXSI7CisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpbSA6IHR5cGUuR2V0Rml4ZWRTaXplQXJyYXlEaW1lbnNpb25zKCkpIHsKKyAgICAgICAgdHlwZV9uYW1lICs9ICJbIiArIHN0ZDo6dG9fc3RyaW5nKGRpbSkgKyAiXSI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVfbmFtZSArPSAiW10iOworICAgIH0KICAgfQogICByZXR1cm4gdHlwZV9uYW1lOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAotc3RyaW5nIEphdmFTaWduYXR1cmVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIHJldHVybiBKYXZhU2lnbmF0dXJlT2ZJbnRlcm5hbChhaWRsLCB0eXBlbmFtZXMsIGZhbHNlLCBmYWxzZSk7CitzdHJpbmcgSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7CisgIHJldHVybiBKYXZhU2lnbmF0dXJlT2ZJbnRlcm5hbChhaWRsLCBmYWxzZSwgZmFsc2UpOwogfQogCi1zdHJpbmcgSW5zdGFudGlhYmxlSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKLSAgcmV0dXJuIEphdmFTaWduYXR1cmVPZkludGVybmFsKGFpZGwsIHR5cGVuYW1lcywgdHJ1ZSwgdHJ1ZSk7CitzdHJpbmcgSW5zdGFudGlhYmxlSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7CisgIHJldHVybiBKYXZhU2lnbmF0dXJlT2ZJbnRlcm5hbChhaWRsLCB0cnVlLCB0cnVlKTsKIH0KIAotc3RyaW5nIERlZmF1bHRKYXZhVmFsdWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitzdHJpbmcgRGVmYXVsdEphdmFWYWx1ZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7CiAgIHN0YXRpYyBtYXA8c3RyaW5nLCBzdHJpbmc+IG0gPSB7CiAgICAgICB7ImJvb2xlYW4iLCAiZmFsc2UifSwgeyJieXRlIiwgIjAifSwgICAgIHsiY2hhciIsIFIiKCdcdTAwMDAnKSJ9LCB7ImludCIsICIwIn0sCiAgICAgICB7ImxvbmciLCAiMEwifSwgICAgICAgeyJmbG9hdCIsICIwLjBmIn0sIHsiZG91YmxlIiwgIjAuMGQifSwKICAgfTsKIAotICBjb25zdCBzdHJpbmcgbmFtZSA9IEFpZGxCYWNraW5nVHlwZU5hbWUoYWlkbCwgdHlwZW5hbWVzKTsKKyAgY29uc3Qgc3RyaW5nIG5hbWUgPSBBaWRsQmFja2luZ1R5cGVOYW1lKGFpZGwpOwogICBBSURMX0ZBVEFMX0lGKG5hbWUgPT0gInZvaWQiLCBhaWRsKTsKIAogICBpZiAoIWFpZGwuSXNBcnJheSgpICYmIG0uZmluZChuYW1lKSAhPSBtLmVuZCgpKSB7CkBAIC0yMDEsMTEgKzIxNyw5NCBAQAogICB9CiB9CiAKLWJvb2wgV3JpdGVUb1BhcmNlbEZvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewordHlwZWRlZiB2b2lkICgqUGFyY2VsSGVscGVyR2VuZXJhdG9yKShDb2RlV3JpdGVyJiwgY29uc3QgT3B0aW9ucyYpOworCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVR5cGVkT2JqZWN0SGVscGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgT3B0aW9ucyYpIHsKKyAgLy8gTm90ZSB0aGF0IHRoZSBuYW1lIGlzIGluY29uc2lzdGVudCBoZXJlIGJlY2F1c2UgUGFyY2VsLmphdmEgZGVmaW5lcyByZWFkVHlwZWRPYmplY3QgYXMgaWYgaXQKKyAgLy8gImNyZWF0ZXMiIGEgbmV3IHZhbHVlIGZyb20gYSBwYXJjZWwuICJpbi1wbGFjZSIgcmVhZCBmdW5jdGlvbiBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UKKyAgLy8gdXNlci1kZWZpbmVkIHBhcmNlbGFibGUgZGVmaW5lcyBpdHMgcmVhZEZyb21QYXJjZWwuCisgIG91dCA8PCBSIihzdGF0aWMgcHJpdmF0ZSA8VD4gVCByZWFkVHlwZWRPYmplY3QoCisgICAgYW5kcm9pZC5vcy5QYXJjZWwgcGFyY2VsLAorICAgIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPFQ+IGMpIHsKKyAgaWYgKHBhcmNlbC5yZWFkSW50KCkgIT0gMCkgeworICAgICAgcmV0dXJuIGMuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgIH0KK30KK3N0YXRpYyBwcml2YXRlIDxUIGV4dGVuZHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlPiB2b2lkIHdyaXRlVHlwZWRPYmplY3QoCisgICAgYW5kcm9pZC5vcy5QYXJjZWwgcGFyY2VsLCBUIHZhbHVlLCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgcGFyY2VsLndyaXRlSW50KDEpOworICAgIHZhbHVlLndyaXRlVG9QYXJjZWwocGFyY2VsLCBwYXJjZWxhYmxlRmxhZ3MpOworICB9IGVsc2UgeworICAgIHBhcmNlbC53cml0ZUludCgwKTsKKyAgfQorfQorKSI7Cit9CisKK3ZvaWQgR2VuZXJhdGVQYXJjZWxIZWxwZXJzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIC8vIHJvb3QtbGV2ZWwgdHlwZSBjb250YWlucyBhbGwgbmVjZXNzYXJ5IGhlbHBlcnMKKyAgaWYgKGRlZmluZWRfdHlwZS5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gdmlzaXRzIG1ldGhvZCBwYXJhbWV0ZXJzIGFuZCBwYXJjZWxhYmxlIGZpZWxkcyB0byBjb2xsZWN0IHR5cGVzIHdoaWNoCisgIC8vIHJlcXVpcmVzIHJlYWQvd3JpdGUvY3JlYXRlIGhlbHBlcnMuCisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnM7CisgICAgc2V0PFBhcmNlbEhlbHBlckdlbmVyYXRvcj4gaGVscGVyczsKKyAgICBWaXNpdG9yKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDogb3B0aW9ucyhvcHRpb25zKSB7fQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIG92ZXJyaWRlIHsKKyAgICAgIGF1dG8gbmFtZSA9IHR5cGUuR2V0TmFtZSgpOworICAgICAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKKyAgICAgICAgaWYgKGRlZmluZWRfdHlwZS0+QXNQYXJjZWxhYmxlKCkgIT0gbnVsbHB0ciAmJiAhdHlwZS5Jc0FycmF5KCkpIHsKKyAgICAgICAgICAvLyBUeXBlZE9iamVjdHMgYXJlIHN1cHBvcnRlZCBzaW5jZSAyMy4gU28gd2UgZG9uJ3QgbmVlZCBoZWxwZXJzLgorICAgICAgICAgIGlmIChvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSA8IDIzdSkgeworICAgICAgICAgICAgaGVscGVycy5pbnNlcnQoJkdlbmVyYXRlVHlwZWRPYmplY3RIZWxwZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUncyBwYXJjZWxhYmxlLWxpa2UgYnVpbHQtaW4gdHlwZXMgYXMgd2VsbC4KKyAgICAgICAgaWYgKG5hbWUgPT0gIlBhcmNlbEZpbGVEZXNjcmlwdG9yIiB8fCBuYW1lID09ICJDaGFyU2VxdWVuY2UiKSB7CisgICAgICAgICAgaWYgKCF0eXBlLklzQXJyYXkoKSkgeworICAgICAgICAgICAgLy8gVHlwZWRPYmplY3RzIGFyZSBzdXBwb3J0ZWQgc2luY2UgMjMuIFNvIHdlIGRvbid0IG5lZWQgaGVscGVycy4KKyAgICAgICAgICAgIGlmIChvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSA8IDIzdSkgeworICAgICAgICAgICAgICBoZWxwZXJzLmluc2VydCgmR2VuZXJhdGVUeXBlZE9iamVjdEhlbHBlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHZ7b3B0aW9uc307CisKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7CisgIGlmICghdi5oZWxwZXJzLmVtcHR5KCkpIHsKKyAgICAvLyBOZXN0ZWQgY2xhc3MgKF9QYXJjZWwpIGlzIHVzZWQgdG8gY29udGFpbiBzdGF0aWMgaGVscGVyIG1ldGhvZHMgYmVjYXVzZSBzb21lIHRhcmdldHMgYXJlCisgICAgLy8gc3RpbGwgdXNpbmcgSmF2YSA3IHdoaWNoIGRvZXNuJ3QgYWxsb3cgaW50ZXJmYWNlcyB0byBoYXZlIHN0YXRpYyBtZXRob2RzLgorICAgIC8vIEhlbHBlcnMgc2hvdWxkbid0IGJvdGhlciBBUEkgY2hlY2tzLCBidXQgaW4gY2FzZSB3aGVyZSBBSURMIHR5cGVzIGFyZSBub3QgbWFya2VkIGBAaGlkZWAKKyAgICAvLyBleHBsaWNpdGx5IG1hcmtzIHRoZSBoZWxwZXIgY2xhc3MgYXMgQGhpZGUuCisgICAgb3V0IDw8ICIvKiogQGhpZGUgKi9cbiI7CisgICAgb3V0IDw8ICJzdGF0aWMgY2xhc3MgX1BhcmNlbCB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlbHBlciA6IHYuaGVscGVycykgeworICAgICAgaGVscGVyKG91dCwgb3B0aW9ucyk7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KK30KKwordm9pZCBXcml0ZVRvUGFyY2VsRm9yKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CiAgIHN0YXRpYyBtYXA8c3RyaW5nLCBmdW5jdGlvbjx2b2lkKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0Jik+PiBtZXRob2RfbWFwewogICAgICAgeyJib29sZWFuIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZUludCgoKCIgPDwgYy52YXIgPDwgIik/KDEpOigwKSkpO1xuIjsKKyAgICAgICAgIGlmIChjLm1pbl9zZGtfdmVyc2lvbiA+PSAyOXUpIHsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZUJvb2xlYW4oIiA8PCBjLnZhciA8PCAiKTtcbiI7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50KCgoIiA8PCBjLnZhciA8PCAiKT8oMSk6KDApKSk7XG4iOworICAgICAgICAgfQogICAgICAgIH19LAogICAgICAgeyJib29sZWFuW10iLAogICAgICAgIFtdKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CkBAIC0yNzAsMTUgKzM2OSwxOSBAQAogICAgICAgeyJMaXN0IiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewogICAgICAgICAgaWYgKGMudHlwZS5Jc0dlbmVyaWMoKSkgewotICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5lZF90eXBlID0gYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMCktPkdldE5hbWUoKTsKLSAgICAgICAgICAgaWYgKGNvbnRhaW5lZF90eXBlID09ICJTdHJpbmciKSB7CisgICAgICAgICAgIEFJRExfRkFUQUxfSUYoYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpICE9IDEsIGMudHlwZSk7CisgICAgICAgICAgIGNvbnN0IGF1dG8mIGVsZW1lbnRfdHlwZSA9ICpjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKTsKKyAgICAgICAgICAgY29uc3QgYXV0byYgZWxlbWVudF90eXBlX25hbWUgPSBlbGVtZW50X3R5cGUuR2V0TmFtZSgpOworICAgICAgICAgICBpZiAoZWxlbWVudF90eXBlX25hbWUgPT0gIlN0cmluZyIpIHsKICAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlU3RyaW5nTGlzdCgiIDw8IGMudmFyIDw8ICIpO1xuIjsKLSAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZWRfdHlwZSA9PSAiSUJpbmRlciIpIHsKKyAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50X3R5cGVfbmFtZSA9PSAiSUJpbmRlciIpIHsKICAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlQmluZGVyTGlzdCgiIDw8IGMudmFyIDw8ICIpO1xuIjsKLSAgICAgICAgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5Jc1BhcmNlbGFibGUoY29udGFpbmVkX3R5cGUpKSB7CisgICAgICAgICAgIH0gZWxzZSBpZiAoYy50eXBlbmFtZXMuSXNQYXJjZWxhYmxlKGVsZW1lbnRfdHlwZV9uYW1lKSkgewogICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVUeXBlZExpc3QoIiA8PCBjLnZhciA8PCAiKTtcbiI7CisgICAgICAgICAgIH0gZWxzZSBpZiAoYy50eXBlbmFtZXMuR2V0SW50ZXJmYWNlKGVsZW1lbnRfdHlwZSkpIHsKKyAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50ZXJmYWNlTGlzdCgiIDw8IGMudmFyIDw8ICIpO1xuIjsKICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBBSURMX0ZBVEFMKGMudHlwZSkgPDwgIndyaXRlOiBOT1QgSU1QTEVNRU5URUQgZm9yICIgPDwgY29udGFpbmVkX3R5cGU7CisgICAgICAgICAgICAgQUlETF9GQVRBTChjLnR5cGUpIDw8ICJ3cml0ZTogTk9UIElNUExFTUVOVEVEIGZvciAiIDw8IGVsZW1lbnRfdHlwZV9uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlTGlzdCgiIDw8IGMudmFyIDw8ICIpO1xuIjsKQEAgLTMwNCw2ICs0MDcsNyBAQAogICAgICAgICAgICAgICAgKmMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpWzFdLmdldCgpLAogICAgICAgICAgICAgICAgYy5wYXJjZWwsCiAgICAgICAgICAgICAgICAidiIsCisgICAgICAgICAgICAgICBjLm1pbl9zZGtfdmVyc2lvbiwKICAgICAgICAgICAgICAgIGMuaXNfcmV0dXJuX3ZhbHVlLAogICAgICAgICAgICAgICAgYy5pc19jbGFzc2xvYWRlcl9jcmVhdGVkLAogICAgICAgICAgICAgICAgYy5maWxlbmFtZSwKQEAgLTMzNiwxOSArNDQwLDEyIEBACiAgICAgICAgfX0sCiAgICAgICB7IlBhcmNlbEZpbGVEZXNjcmlwdG9yIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgLy8gVGhpcyBpcyBzYW1lIGFzIHdyaXRlVHlwZWRPYmplY3Qgd2hpY2ggd2FzIGludHJvZHVjZWQgd2l0aCBTREsgMjMuCi0gICAgICAgICAvLyBLZWVwaW5nIGJlbG93IGNvZGUgc28gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgYnVpbGRhYmxlIHdpdGggb2xkZXIgU0RLLgotICAgICAgICAgYy53cml0ZXIgPDwgImlmICgoIiA8PCBjLnZhciA8PCAiIT1udWxsKSkge1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZUludCgxKTtcbiI7Ci0gICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiLndyaXRlVG9QYXJjZWwoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IEdldEZsYWdGb3IoYykgPDwgIik7XG4iOwotICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCAifVxuIjsKLSAgICAgICAgIGMud3JpdGVyIDw8ICJlbHNlIHtcbiI7Ci0gICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnQoMCk7XG4iOwotICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCAifVxuIjsKKyAgICAgICAgIGlmIChjLm1pbl9zZGtfdmVyc2lvbiA+PSAyM3UpIHsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkT2JqZWN0KCIgPDwgYy52YXIgPDwgIiwgIiA8PCBHZXRGbGFnRm9yKGMpIDw8ICIpO1xuIjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8ICJfUGFyY2VsLndyaXRlVHlwZWRPYmplY3QoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IGMudmFyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgR2V0RmxhZ0ZvcihjKSA8PCAiKTtcbiI7CisgICAgICAgICB9CiAgICAgICAgfX0sCiAgICAgICB7IlBhcmNlbEZpbGVEZXNjcmlwdG9yW10iLAogICAgICAgIFtdKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CkBAIC0zNzYsNDEgKzQ3MywzOCBAQAogICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkT2JqZWN0KCIgPDwgYy52YXIgPDwgIiwgMCk7XG4iOwogICAgICAgIH19LAogICB9OwotICBjb25zdCBzdHJpbmcgdHlwZV9uYW1lID0gQWlkbEJhY2tpbmdUeXBlTmFtZShjLnR5cGUsIGMudHlwZW5hbWVzKTsKKyAgY29uc3Qgc3RyaW5nIHR5cGVfbmFtZSA9IEFpZGxCYWNraW5nVHlwZU5hbWUoYy50eXBlKTsKICAgY29uc3QgYXV0byBmb3VuZCA9IG1ldGhvZF9tYXAuZmluZCh0eXBlX25hbWUpOwogICBpZiAoZm91bmQgIT0gbWV0aG9kX21hcC5lbmQoKSkgewogICAgIGZvdW5kLT5zZWNvbmQoYyk7CisgIH0gZWxzZSBpZiAoYy50eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzID0ge2MudmFyLCBHZXRGbGFnRm9yKGMpfTsKKyAgICBmb3IgKGF1dG8gZGltIDogYy50eXBlLkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpKSB7CisgICAgICBhcmdzLnB1c2hfYmFjayhzdGQ6OnRvX3N0cmluZyhkaW0pKTsKKyAgICB9CisgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZUZpeGVkQXJyYXkoIiA8PCBKb2luKGFyZ3MsICIsICIpIDw8ICIpO1xuIjsKICAgfSBlbHNlIHsKICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHQgPSBjLnR5cGVuYW1lcy5UcnlHZXREZWZpbmVkVHlwZShjLnR5cGUuR2V0TmFtZSgpKTsKICAgICBBSURMX0ZBVEFMX0lGKHQgPT0gbnVsbHB0ciwgYy50eXBlKSA8PCAiVW5rbm93biB0eXBlOiAiIDw8IGMudHlwZS5HZXROYW1lKCk7CiAgICAgaWYgKHQtPkFzSW50ZXJmYWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgaWYgKCFjLnR5cGUuSXNBcnJheSgpKSB7Ci0gICAgICAgIC8vIFdoeSBkb24ndCB3ZSB1c2Ugd3JpdGVTdHJvbmdJbnRlcmZhY2Ugd2hpY2ggZG9lcyB0aGUgZXhhY3Qgc2FtZSB0aGluZz8KLSAgICAgICAgLy8gS2VlcGluZyBiZWxvdyBjb2RlIGp1c3Qgbm90IHRvIGJyZWFrIHVuaXQgdGVzdHMuCi0gICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVTdHJvbmdCaW5kZXIoKCgoIiA8PCBjLnZhciA8PCAiIT1udWxsKSk/IgotICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgYy52YXIgPDwgIi5hc0JpbmRlcigpKToobnVsbCkpKTtcbiI7CisgICAgICBpZiAoYy50eXBlLklzQXJyYXkoKSkgeworICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50ZXJmYWNlQXJyYXkoIiA8PCBjLnZhciA8PCAiKTtcbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlU3Ryb25nSW50ZXJmYWNlKCIgPDwgYy52YXIgPDwgIik7XG4iOwogICAgICAgfQogICAgIH0gZWxzZSBpZiAodC0+QXNQYXJjZWxhYmxlKCkgIT0gbnVsbHB0cikgewogICAgICAgaWYgKGMudHlwZS5Jc0FycmF5KCkpIHsKICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkQXJyYXkoIiA8PCBjLnZhciA8PCAiLCAiIDw8IEdldEZsYWdGb3IoYykgPDwgIik7XG4iOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBpcyBzYW1lIGFzIHdyaXRlVHlwZWRPYmplY3QuCi0gICAgICAgIC8vIEtlZXBpbmcgYmVsb3cgY29kZSBqdXN0IG5vdCB0byBicmVhayB0ZXN0cy4KLSAgICAgICAgYy53cml0ZXIgPDwgImlmICgoIiA8PCBjLnZhciA8PCAiIT1udWxsKSkge1xuIjsKLSAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7Ci0gICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIud3JpdGVJbnQoMSk7XG4iOwotICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiLndyaXRlVG9QYXJjZWwoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IEdldEZsYWdGb3IoYykgPDwgIik7XG4iOwotICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7Ci0gICAgICAgIGMud3JpdGVyIDw8ICJlbHNlIHtcbiI7Ci0gICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLndyaXRlSW50KDApO1xuIjsKLSAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOworICAgICAgICBpZiAoYy5taW5fc2RrX3ZlcnNpb24gPj0gMjN1KSB7CisgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi53cml0ZVR5cGVkT2JqZWN0KCIgPDwgYy52YXIgPDwgIiwgIiA8PCBHZXRGbGFnRm9yKGMpIDw8ICIpO1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjLndyaXRlciA8PCAiX1BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KCIgPDwgYy5wYXJjZWwgPDwgIiwgIiA8PCBjLnZhciA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgPDwgR2V0RmxhZ0ZvcihjKSA8PCAiKTtcbiI7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIEVuc3VyZXMgdGhhdCBhIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkIHRvIHJlZmVyIHRvIHRoZSBjbGFzc2xvYWRlcgpAQCAtNDI5LDcgKzUyMywxMSBAQAogICBzdGF0aWMgbWFwPHN0cmluZywgZnVuY3Rpb248dm9pZChjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYpPj4gbWV0aG9kX21hcHsKICAgICAgIHsiYm9vbGVhbiIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAoMCE9IiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRJbnQoKSk7XG4iOworICAgICAgICAgaWYgKGMubWluX3Nka192ZXJzaW9uID49IDI5dSkgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRCb29sZWFuKCk7XG4iOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICgwIT0iIDw8IGMucGFyY2VsIDw8ICIucmVhZEludCgpKTtcbiI7CisgICAgICAgICB9CiAgICAgICAgfX0sCiAgICAgICB7ImJvb2xlYW5bXSIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKQEAgLTQ5NCwxNyArNTkyLDIyIEBACiAgICAgICB7Ikxpc3QiLAogICAgICAgIFtdKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7CiAgICAgICAgICBpZiAoYy50eXBlLklzR2VuZXJpYygpKSB7Ci0gICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmVkX3R5cGUgPSBjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKS0+R2V0TmFtZSgpOwotICAgICAgICAgICBpZiAoY29udGFpbmVkX3R5cGUgPT0gIlN0cmluZyIpIHsKKyAgICAgICAgICAgQUlETF9GQVRBTF9JRihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgIT0gMSwgYy50eXBlKTsKKyAgICAgICAgICAgY29uc3QgYXV0byYgZWxlbWVudF90eXBlID0gKmMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApOworICAgICAgICAgICBjb25zdCBhdXRvJiBlbGVtZW50X3R5cGVfbmFtZSA9IGVsZW1lbnRfdHlwZS5HZXROYW1lKCk7CisgICAgICAgICAgIGlmIChlbGVtZW50X3R5cGVfbmFtZSA9PSAiU3RyaW5nIikgewogICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7XG4iOwotICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lZF90eXBlID09ICJJQmluZGVyIikgeworICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJJQmluZGVyIikgewogICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIuY3JlYXRlQmluZGVyQXJyYXlMaXN0KCk7XG4iOwotICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLklzUGFyY2VsYWJsZShjb250YWluZWRfdHlwZSkpIHsKKyAgICAgICAgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5Jc1BhcmNlbGFibGUoZWxlbWVudF90eXBlX25hbWUpKSB7CiAgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVUeXBlZEFycmF5TGlzdCgiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgSmF2YU5hbWVPZigqKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApKSwgYy50eXBlbmFtZXMpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgPDwgSmF2YU5hbWVPZihlbGVtZW50X3R5cGUpIDw8ICIuQ1JFQVRPUik7XG4iOworICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLkdldEludGVyZmFjZShlbGVtZW50X3R5cGUpKSB7CisgICAgICAgICAgICAgYXV0byBhc19pbnRlcmZhY2UgPSBlbGVtZW50X3R5cGVfbmFtZSArICIuU3R1Yjo6YXNJbnRlcmZhY2UiOworICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIuY3JlYXRlSW50ZXJmYWNlQXJyYXlMaXN0KCIgPDwgYXNfaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgPDwgIik7XG4iOwogICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIEFJRExfRkFUQUwoYy50eXBlKSA8PCAiY3JlYXRlOiBOT1QgSU1QTEVNRU5URUQgZm9yICIgPDwgY29udGFpbmVkX3R5cGU7CisgICAgICAgICAgICAgQUlETF9GQVRBTChjLnR5cGUpIDw8ICJjcmVhdGU6IE5PVCBJTVBMRU1FTlRFRCBmb3IgIiA8PCBlbGVtZW50X3R5cGVfbmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGNsYXNzbG9hZGVyID0gRW5zdXJlQW5kR2V0Q2xhc3Nsb2FkZXIoY29uc3RfY2FzdDxDb2RlR2VuZXJhdG9yQ29udGV4dCY+KGMpKTsKQEAgLTUxOSwxNyArNjIyLDE4IEBACiAgICAgICAgICAgIGMud3JpdGVyIDw8ICJpbnQgTiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50KCk7XG4iOwogICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gTiA8IDAgPyBudWxsIDogbmV3IGphdmEudXRpbC5IYXNoTWFwPD4oKTtcbiI7CiAKLSAgICAgICAgICAgYXV0byBjcmVhdG9yID0gSmF2YU5hbWVPZigqKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDEpKSwgYy50eXBlbmFtZXMpICsgIi5DUkVBVE9SIjsKKyAgICAgICAgICAgYXV0byBjcmVhdG9yID0gSmF2YU5hbWVPZigqKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDEpKSkgKyAiLkNSRUFUT1IiOwogICAgICAgICAgICBjLndyaXRlciA8PCAiamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW0ucmFuZ2UoMCwgTikuZm9yRWFjaChpIC0+IHtcbiI7CiAgICAgICAgICAgIGMud3JpdGVyLkluZGVudCgpOwogICAgICAgICAgICBjLndyaXRlciA8PCAiU3RyaW5nIGsgPSAiIDw8IGMucGFyY2VsIDw8ICIucmVhZFN0cmluZygpO1xuIjsKLSAgICAgICAgICAgYy53cml0ZXIgPDwgSmF2YVNpZ25hdHVyZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMSkpLCBjLnR5cGVuYW1lcykgPDwgIiB2O1xuIjsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgSmF2YVNpZ25hdHVyZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMSkpKSA8PCAiIHY7XG4iOwogICAgICAgICAgICBDb2RlR2VuZXJhdG9yQ29udGV4dCB2YWx1ZV9jb250ZXh0ewogICAgICAgICAgICAgICAgYy53cml0ZXIsCiAgICAgICAgICAgICAgICBjLnR5cGVuYW1lcywKICAgICAgICAgICAgICAgICpjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKVsxXS5nZXQoKSwKICAgICAgICAgICAgICAgIGMucGFyY2VsLAogICAgICAgICAgICAgICAgInYiLAorICAgICAgICAgICAgICAgYy5taW5fc2RrX3ZlcnNpb24sCiAgICAgICAgICAgICAgICBjLmlzX3JldHVybl92YWx1ZSwKICAgICAgICAgICAgICAgIGMuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCwKICAgICAgICAgICAgICAgIGMuZmlsZW5hbWUsCkBAIC01NjUsMTkgKzY2OSwxMyBAQAogICAgICAgIH19LAogICAgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgIC8vIFRoaXMgaXMgc2FtZSBhcyByZWFkVHlwZWRPYmplY3Qgd2hpY2ggd2FzIGludHJvZHVjZWQgd2l0aCBTREsgMjMuCi0gICAgICAgICAvLyBLZWVwaW5nIGJlbG93IGNvZGUgc28gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgYnVpbGRhYmxlIHdpdGggb2xkZXIgU0RLLgotICAgICAgICAgYy53cml0ZXIgPDwgImlmICgoMCE9IiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRJbnQoKSkpIHtcbiI7Ci0gICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8ICJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbCgiIDw8IGMucGFyY2VsCi0gICAgICAgICAgICAgICAgICA8PCAiKTtcbiI7Ci0gICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOwotICAgICAgICAgYy53cml0ZXIgPDwgImVsc2Uge1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9IG51bGw7XG4iOwotICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCAifVxuIjsKKyAgICAgICAgIGlmIChjLm1pbl9zZGtfdmVyc2lvbiA+PSAyM3UpIHsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTtcbiI7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gX1BhcmNlbC5yZWFkVHlwZWRPYmplY3QoIiA8PCBjLnBhcmNlbAorICAgICAgICAgICAgICAgICAgICA8PCAiLCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpO1xuIjsKKyAgICAgICAgIH0KICAgICAgICB9fSwKICAgICAgIHsiUGFyY2VsRmlsZURlc2NyaXB0b3JbXSIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKQEAgLTU4NiwxOCArNjg0LDEzIEBACiAgICAgICAgfX0sCiAgICAgICB7IkNoYXJTZXF1ZW5jZSIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgIC8vIFdlIGhhdmUgd3JpdHRlbiAwIGZvciBudWxsIENoYXJTZXF1ZW5jZS4KLSAgICAgICAgIGMud3JpdGVyIDw8ICJpZiAoMCE9IiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRJbnQoKSkge1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkluZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9IGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoIgotICAgICAgICAgICAgICAgICAgPDwgYy5wYXJjZWwgPDwgIik7XG4iOwotICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgICBjLndyaXRlciA8PCAifVxuIjsKLSAgICAgICAgIGMud3JpdGVyIDw8ICJlbHNlIHtcbiI7Ci0gICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKLSAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSBudWxsO1xuIjsKLSAgICAgICAgIGMud3JpdGVyLkRlZGVudCgpOwotICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CisgICAgICAgICBpZiAoYy5taW5fc2RrX3ZlcnNpb24gPj0gMjN1KSB7CisgICAgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsCisgICAgICAgICAgICAgICAgICAgIDw8ICIucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SKTtcbiI7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gX1BhcmNlbC5yZWFkVHlwZWRPYmplY3QoIiA8PCBjLnBhcmNlbAorICAgICAgICAgICAgICAgICAgICA8PCAiLCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUik7XG4iOworICAgICAgICAgfQogICAgICAgIH19LAogICAgICAgeyJQYXJjZWxhYmxlSG9sZGVyIiwKICAgICAgICBbXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewpAQCAtNjA4LDM1ICs3MDEsNDYgQEAKICAgICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOwogICAgICAgIH19LAogICB9OwotICBjb25zdCBhdXRvIGZvdW5kID0gbWV0aG9kX21hcC5maW5kKEFpZGxCYWNraW5nVHlwZU5hbWUoYy50eXBlLCBjLnR5cGVuYW1lcykpOworICBjb25zdCBhdXRvIGZvdW5kID0gbWV0aG9kX21hcC5maW5kKEFpZGxCYWNraW5nVHlwZU5hbWUoYy50eXBlKSk7CiAgIGlmIChmb3VuZCAhPSBtZXRob2RfbWFwLmVuZCgpKSB7CiAgICAgZm91bmQtPnNlY29uZChjKTsKKyAgfSBlbHNlIGlmIChjLnR5cGUuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MgPSB7SmF2YVNpZ25hdHVyZU9mKGMudHlwZSkgKyAiLmNsYXNzIn07CisgICAgaWYgKGMudHlwZW5hbWVzLklzUGFyY2VsYWJsZShjLnR5cGUuR2V0TmFtZSgpKSkgeworICAgICAgYXJncy5wdXNoX2JhY2soSmF2YU5hbWVPZihjLnR5cGUpICsgIi5DUkVBVE9SIik7CisgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5HZXRJbnRlcmZhY2UoYy50eXBlKSkgeworICAgICAgYXJncy5wdXNoX2JhY2soYy50eXBlLkdldE5hbWUoKSArICIuU3R1Yjo6YXNJbnRlcmZhY2UiKTsKKyAgICB9CisgICAgZm9yIChhdXRvIGRpbSA6IGMudHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSkgeworICAgICAgYXJncy5wdXNoX2JhY2soc3RkOjp0b19zdHJpbmcoZGltKSk7CisgICAgfQorICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIuY3JlYXRlRml4ZWRBcnJheSgiIDw8IEpvaW4oYXJncywgIiwgIikgPDwgIik7XG4iOwogICB9IGVsc2UgewogICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdCA9IGMudHlwZW5hbWVzLlRyeUdldERlZmluZWRUeXBlKGMudHlwZS5HZXROYW1lKCkpOwogICAgIEFJRExfRkFUQUxfSUYodCA9PSBudWxscHRyLCBjLnR5cGUpIDw8ICJVbmtub3duIHR5cGU6ICIgPDwgYy50eXBlLkdldE5hbWUoKTsKICAgICBpZiAodC0+QXNJbnRlcmZhY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICBpZiAoIWMudHlwZS5Jc0FycmF5KCkpIHsKLSAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy50eXBlLkdldE5hbWUoKSA8PCAiLlN0dWIuYXNJbnRlcmZhY2UoIiA8PCBjLnBhcmNlbAorICAgICAgYXV0byBuYW1lID0gYy50eXBlLkdldE5hbWUoKTsKKyAgICAgIGlmIChjLnR5cGUuSXNBcnJheSgpKSB7CisgICAgICAgIGF1dG8gbmV3X2FycmF5ID0gbmFtZSArICJbXTo6bmV3IjsKKyAgICAgICAgYXV0byBhc19pbnRlcmZhY2UgPSBuYW1lICsgIi5TdHViOjphc0ludGVyZmFjZSI7CisgICAgICAgIGMud3JpdGVyIDw8IGMudmFyIDw8ICIgPSAiIDw8IGMucGFyY2VsIDw8ICIuY3JlYXRlSW50ZXJmYWNlQXJyYXkoIiA8PCBuZXdfYXJyYXkgPDwgIiwgIgorICAgICAgICAgICAgICAgICA8PCBhc19pbnRlcmZhY2UgPDwgIik7XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgbmFtZSA8PCAiLlN0dWIuYXNJbnRlcmZhY2UoIiA8PCBjLnBhcmNlbAogICAgICAgICAgICAgICAgICA8PCAiLnJlYWRTdHJvbmdCaW5kZXIoKSk7XG4iOwogICAgICAgfQogICAgIH0gZWxzZSBpZiAodC0+QXNQYXJjZWxhYmxlKCkgIT0gbnVsbHB0cikgewogICAgICAgaWYgKGMudHlwZS5Jc0FycmF5KCkpIHsKLSAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVUeXBlZEFycmF5KCIKLSAgICAgICAgICAgICAgICAgPDwgSmF2YU5hbWVPZihjLnR5cGUsIGMudHlwZW5hbWVzKSA8PCAiLkNSRUFUT1IpO1xuIjsKKyAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy5wYXJjZWwgPDwgIi5jcmVhdGVUeXBlZEFycmF5KCIgPDwgSmF2YU5hbWVPZihjLnR5cGUpCisgICAgICAgICAgICAgICAgIDw8ICIuQ1JFQVRPUik7XG4iOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBpcyBzYW1lIGFzIHJlYWRUeXBlZE9iamVjdC4KLSAgICAgICAgLy8gS2VlcGluZyBiZWxvdyBjb2RlIGp1c3Qgbm90IHRvIGJyZWFrIHVuaXQgdGVzdHMuCi0gICAgICAgIGMud3JpdGVyIDw8ICJpZiAoKDAhPSIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50KCkpKSB7XG4iOwotICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKLSAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9ICIgPDwgYy50eXBlLkdldE5hbWUoKSA8PCAiLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbCgiIDw8IGMucGFyY2VsCi0gICAgICAgICAgICAgICAgIDw8ICIpO1xuIjsKLSAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7Ci0gICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOwotICAgICAgICBjLndyaXRlciA8PCAiZWxzZSB7XG4iOwotICAgICAgICBjLndyaXRlci5JbmRlbnQoKTsKLSAgICAgICAgYy53cml0ZXIgPDwgYy52YXIgPDwgIiA9IG51bGw7XG4iOwotICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CisgICAgICAgIGlmIChjLm1pbl9zZGtfdmVyc2lvbiA+PSAyM3UpIHsKKyAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRUeXBlZE9iamVjdCgiIDw8IGMudHlwZS5HZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLkNSRUFUT1IpO1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gX1BhcmNlbC5yZWFkVHlwZWRPYmplY3QoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IGMudHlwZS5HZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLkNSRUFUT1IpO1xuIjsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpAQCAtNjgwLDE3ICs3ODQsMjIgQEAKICAgICAgIHsiTGlzdCIsCiAgICAgICAgW10oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKICAgICAgICAgIGlmIChjLnR5cGUuSXNHZW5lcmljKCkpIHsKLSAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250YWluZWRfdHlwZSA9IGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApLT5HZXROYW1lKCk7Ci0gICAgICAgICAgIGlmIChjb250YWluZWRfdHlwZSA9PSAiU3RyaW5nIikgeworICAgICAgICAgICBBSURMX0ZBVEFMX0lGKGMudHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSAhPSAxLCBjLnR5cGUpOworICAgICAgICAgICBjb25zdCBhdXRvJiBlbGVtZW50X3R5cGUgPSAqYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMCk7CisgICAgICAgICAgIGNvbnN0IGF1dG8mIGVsZW1lbnRfdHlwZV9uYW1lID0gZWxlbWVudF90eXBlLkdldE5hbWUoKTsKKyAgICAgICAgICAgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJTdHJpbmciKSB7CiAgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkU3RyaW5nTGlzdCgiIDw8IGMudmFyIDw8ICIpO1xuIjsKLSAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZWRfdHlwZSA9PSAiSUJpbmRlciIpIHsKKyAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50X3R5cGVfbmFtZSA9PSAiSUJpbmRlciIpIHsKICAgICAgICAgICAgICBjLndyaXRlciA8PCBjLnBhcmNlbCA8PCAiLnJlYWRCaW5kZXJMaXN0KCIgPDwgYy52YXIgPDwgIik7XG4iOwotICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLklzUGFyY2VsYWJsZShjb250YWluZWRfdHlwZSkpIHsKKyAgICAgICAgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5Jc1BhcmNlbGFibGUoZWxlbWVudF90eXBlX25hbWUpKSB7CiAgICAgICAgICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkVHlwZWRMaXN0KCIgPDwgYy52YXIgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgIDw8IEphdmFOYW1lT2YoKihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKSksIGMudHlwZW5hbWVzKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ1JFQVRPUik7XG4iOworICAgICAgICAgICAgICAgICAgICAgIDw8IEphdmFOYW1lT2YoKihjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKSkpIDw8ICIuQ1JFQVRPUik7XG4iOworICAgICAgICAgICB9IGVsc2UgaWYgKGMudHlwZW5hbWVzLkdldEludGVyZmFjZShlbGVtZW50X3R5cGUpKSB7CisgICAgICAgICAgICAgYXV0byBhc19pbnRlcmZhY2UgPSBlbGVtZW50X3R5cGVfbmFtZSArICIuU3R1Yjo6YXNJbnRlcmZhY2UiOworICAgICAgICAgICAgIGMud3JpdGVyIDw8IGMucGFyY2VsIDw8ICIucmVhZEludGVyZmFjZUxpc3QoIiA8PCBjLnZhciA8PCAiLCAiIDw8IGFzX2ludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIpO1xuIjsKICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBBSURMX0ZBVEFMKGMudHlwZSkgPDwgInJlYWQ6IE5PVCBJTVBMRU1FTlRFRCBmb3IgIiA8PCBjb250YWluZWRfdHlwZTsKKyAgICAgICAgICAgICBBSURMX0ZBVEFMKGMudHlwZSkgPDwgInJlYWQ6IE5PVCBJTVBMRU1FTlRFRCBmb3IgIiA8PCBlbGVtZW50X3R5cGVfbmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGNsYXNzbG9hZGVyID0gRW5zdXJlQW5kR2V0Q2xhc3Nsb2FkZXIoY29uc3RfY2FzdDxDb2RlR2VuZXJhdG9yQ29udGV4dCY+KGMpKTsKQEAgLTcwNSwxMyArODE0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIDw8ICIucmVhZEludCgpKS5mb3JFYWNoKGkgLT4ge1xuIjsKICAgICAgICAgICAgYy53cml0ZXIuSW5kZW50KCk7CiAgICAgICAgICAgIGMud3JpdGVyIDw8ICJTdHJpbmcgayA9ICIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkU3RyaW5nKCk7XG4iOwotICAgICAgICAgICBjLndyaXRlciA8PCBKYXZhTmFtZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMSkpLCBjLnR5cGVuYW1lcykgPDwgIiB2O1xuIjsKKyAgICAgICAgICAgYy53cml0ZXIgPDwgSmF2YVNpZ25hdHVyZU9mKCooYy50eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuYXQoMSkpKSA8PCAiIHY7XG4iOwogICAgICAgICAgICBDb2RlR2VuZXJhdG9yQ29udGV4dCB2YWx1ZV9jb250ZXh0ewogICAgICAgICAgICAgICAgYy53cml0ZXIsCiAgICAgICAgICAgICAgICBjLnR5cGVuYW1lcywKICAgICAgICAgICAgICAgICpjLnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKVsxXS5nZXQoKSwKICAgICAgICAgICAgICAgIGMucGFyY2VsLAogICAgICAgICAgICAgICAgInYiLAorICAgICAgICAgICAgICAgYy5taW5fc2RrX3ZlcnNpb24sCiAgICAgICAgICAgICAgICBjLmlzX3JldHVybl92YWx1ZSwKICAgICAgICAgICAgICAgIGMuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCwKICAgICAgICAgICAgICAgIGMuZmlsZW5hbWUsCkBAIC03MjEsOSArODMxLDYgQEAKIAogICAgICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKICAgICAgICAgICAgYy53cml0ZXIgPDwgIn0pO1xuIjsKLQotICAgICAgICAgICBjLndyaXRlci5EZWRlbnQoKTsKLSAgICAgICAgICAgYy53cml0ZXIgPDwgIn1cbiI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzdHJpbmcgY2xhc3Nsb2FkZXIgPSBFbnN1cmVBbmRHZXRDbGFzc2xvYWRlcihjb25zdF9jYXN0PENvZGVHZW5lcmF0b3JDb250ZXh0Jj4oYykpOwogICAgICAgICAgICBjLndyaXRlciA8PCBjLnZhciA8PCAiID0gIiA8PCBjLnBhcmNlbCA8PCAiLnJlYWRIYXNoTWFwKCIgPDwgY2xhc3Nsb2FkZXIgPDwgIik7XG4iOwpAQCAtNzUxLDkgKzg1OCwxNyBAQAogICAgICAgICAgICAgICAgICAgPDwgIiwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTtcbiI7CiAgICAgICAgfX0sCiAgIH07Ci0gIGNvbnN0IGF1dG8mIGZvdW5kID0gbWV0aG9kX21hcC5maW5kKEFpZGxCYWNraW5nVHlwZU5hbWUoYy50eXBlLCBjLnR5cGVuYW1lcykpOworICBjb25zdCBhdXRvJiBmb3VuZCA9IG1ldGhvZF9tYXAuZmluZChBaWRsQmFja2luZ1R5cGVOYW1lKGMudHlwZSkpOwogICBpZiAoZm91bmQgIT0gbWV0aG9kX21hcC5lbmQoKSkgewogICAgIGZvdW5kLT5zZWNvbmQoYyk7CisgIH0gZWxzZSBpZiAoYy50eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzID0ge2MudmFyfTsKKyAgICBpZiAoYy50eXBlbmFtZXMuSXNQYXJjZWxhYmxlKGMudHlwZS5HZXROYW1lKCkpKSB7CisgICAgICBhcmdzLnB1c2hfYmFjayhjLnR5cGUuR2V0TmFtZSgpICsgIi5DUkVBVE9SIik7CisgICAgfSBlbHNlIGlmIChjLnR5cGVuYW1lcy5HZXRJbnRlcmZhY2UoYy50eXBlKSkgeworICAgICAgYXJncy5wdXNoX2JhY2soYy50eXBlLkdldE5hbWUoKSArICIuU3R1Yjo6YXNJbnRlcmZhY2UiKTsKKyAgICB9CisgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkRml4ZWRBcnJheSgiIDw8IEpvaW4oYXJncywgIiwgIikgPDwgIik7XG4iOwogICB9IGVsc2UgewogICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdCA9IGMudHlwZW5hbWVzLlRyeUdldERlZmluZWRUeXBlKGMudHlwZS5HZXROYW1lKCkpOwogICAgIEFJRExfRkFUQUxfSUYodCA9PSBudWxscHRyLCBjLnR5cGUpIDw8ICJVbmtub3duIHR5cGU6ICIgPDwgYy50eXBlLkdldE5hbWUoKTsKQEAgLTc2OCw2ICs4ODMsMTAgQEAKICAgICAgICAgYy53cml0ZXIuRGVkZW50KCk7CiAgICAgICAgIGMud3JpdGVyIDw8ICJ9XG4iOwogICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+QXNJbnRlcmZhY2UoKSkgeworICAgICAgQUlETF9GQVRBTF9JRighYy50eXBlLklzQXJyYXkoKSwgYy50eXBlKSA8PCAicmVhZEZyb21QYXJjZWwoaW50ZXJmYWNlKSBkb2Vzbid0IG1ha2Ugc2Vuc2UuIjsKKyAgICAgIGF1dG8gYXNfaW50ZXJmYWNlID0gYy50eXBlLkdldE5hbWUoKSArICIuU3R1Yjo6YXNJbnRlcmZhY2UiOworICAgICAgYy53cml0ZXIgPDwgYy5wYXJjZWwgPDwgIi5yZWFkSW50ZXJmYWNlQXJyYXkoIiA8PCBjLnZhciA8PCAiLCAiIDw8IGFzX2ludGVyZmFjZSA8PCAiKTtcbiI7CiAgICAgfQogICB9CiAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvYWlkbF90b19qYXZhLmggYi9haWRsX3RvX2phdmEuaAppbmRleCAyZWJlMmMzLi41YTQ2MzJjIDEwMDY0NAotLS0gYS9haWRsX3RvX2phdmEuaAorKysgYi9haWRsX3RvX2phdmEuaApAQCAtMzksMTggKzM5LDIwIEBACiAKIC8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRyYW5zbGF0ZSBBSURMIHRoaW5ncyB0byBKYXZhIHRoaW5ncy4KIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSk7CitzdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAogLy8gUmV0dXJucyB0aGUgSmF2YSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgQUlETCB0eXBlIHNwZWMKIC8vIFRoaXMgaW5jbHVkZXMgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgd2l0aCBhcnJheSBtb2RpZmllcnMuCi1zdHJpbmcgSmF2YVNpZ25hdHVyZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworc3RyaW5nIEphdmFTaWduYXR1cmVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCk7CiAKIC8vIFJldHVybnMgdGhlIGluc3RhbnRpYWJsZSBKdmEgdHlwZSBzaWduYXR1cmUgb2YgdGhlIEFJREwgdHlwZSBzcGVjCiAvLyBUaGlzIGluY2x1ZGVzIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzLCBidXQgZXhjbHVkZXMgYXJyYXkgbW9kaWZpZXJzLgotc3RyaW5nIEluc3RhbnRpYWJsZUphdmFTaWduYXR1cmVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKK3N0cmluZyBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwpOwogCiAvLyBSZXR1cm5zIHRoZSBkZWZhdWx0IEphdmEgdmFsdWUgb2YgdGhlIEFJREwgdHlwZSBzcGVjCi1zdHJpbmcgRGVmYXVsdEphdmFWYWx1ZU9mKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworc3RyaW5nIERlZmF1bHRKYXZhVmFsdWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCk7CiAKIC8vIFRoaXMgY2FycmllcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGNvZGUgZm9yCiAvLyBtYXJzaGFsbGluZyBhbmQgdW5tYXJzaGFsbGluZyBhIG1ldGhvZCBhcmd1bWVudCBvciBhIHBhcmNlbGFibGUgZmllbGQKQEAgLTYwLDcgKzYyLDcgQEAKICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGU7CiAgIGNvbnN0IHN0cmluZyBwYXJjZWw7CiAgIGNvbnN0IHN0cmluZyB2YXI7Ci0KKyAgY29uc3QgdWludDMyX3QgbWluX3Nka192ZXJzaW9uOwogICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBtYXJzaGFsbGVkIGRhdGEgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50CiAgIC8vIFRoaXMgaXMgZ2l2ZW4gYXMgYSBoaW50IHRvIHRoZSBQYXJjZWxhYmxlIHRoYXQgaXMgYmVpbmcgbWFyc2hhbGxlZAogICAvLyBzbyB0aGF0IHRoZSBQYXJjZWxhYmxlIGNhbiByZWxlYXNlIGl0cyByZXNvdXJjZSBhZnRlciB0aGUgbWFyc2hhbGxpbmcKQEAgLTg5LDcgKzkxLDcgQEAKIH07CiAKIC8vIFdyaXRlcyBjb2RlIGZyYWdtZW50IHRoYXQgd3JpdGVzIGEgdmFyaWFibGUgdG8gdGhlIHBhcmNlbC4KLWJvb2wgV3JpdGVUb1BhcmNlbEZvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYyk7Cit2b2lkIFdyaXRlVG9QYXJjZWxGb3IoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpOwogCiAvLyBXcml0ZXMgY29kZSBmcmFnbWVudCB0aGF0IHJlYWRzIGRhdGEgZnJvbSB0aGUgcGFyY2VsIGludG8gYSB2YXJpYWJsZS4gV2hlbgogLy8gdGhlIHZhcmlhYmxlIHR5cGUgaXMgYXJyYXkgb3IgTGlzdCwgdGhlIGFycmF5IG9yIExpc3QgaXMgY3JlYXRlZC4KQEAgLTEwMyw2ICsxMDUsMTAgQEAKIC8vIGluIGEgcGFyY2VsYWJsZQogdm9pZCBUb1N0cmluZ0Zvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYyk7CiAKKy8vIEdlbmVyYXRlcyBjcmVhdGUvcmVhZC93cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHdoaWNoIGFyZSBtaXNzaW5nIGluIFBhcmNlbC4KK3ZvaWQgR2VuZXJhdGVQYXJjZWxIZWxwZXJzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKwogfSAgLy8gbmFtZXNwYWNlIGphdmEKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYWlkbF90b19uZGsuY3BwIGIvYWlkbF90b19uZGsuY3BwCmluZGV4IDlkMWI3OTQuLmFkY2Q0NTEgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fbmRrLmNwcAorKysgYi9haWRsX3RvX25kay5jcHAKQEAgLTI0LDExICsyNCwxNSBAQAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAKIHVzaW5nIDo6YW5kcm9pZDo6YmFzZTo6Sm9pbjsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBuZGsgewogCitzdGF0aWMgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIga0ludFR5cGV7QUlETF9MT0NBVElPTl9IRVJFLCAiaW50IiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50c3t9fTsKKwogc3RkOjpzdHJpbmcgTmRrSGVhZGVyRmlsZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY3BwOjpDbGFzc05hbWVzIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX29zX3NlcCkgewogICBjaGFyIHNlcGVyYXRvciA9ICh1c2Vfb3Nfc2VwKSA/IE9TX1BBVEhfU0VQQVJBVE9SIDogJy8nOwpAQCAtMzcsMzkyICs0MSwxNjIgQEAKIAogLy8gVGhpcyByZXByZXNlbnRzIGEgdHlwZSBpbiBBSURMIChlLmcuICdTdHJpbmcnIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIG11bHRpcGxlIHdheXMpCiBzdHJ1Y3QgVHlwZUluZm8gewotICBzdHJ1Y3QgQXNwZWN0IHsKLSAgICAvLyBuYW1lIG9mIHRoZSB0eXBlIGluIEMrKyBvdXRwdXQKLSAgICBzdGQ6OnN0cmluZyBjcHBfbmFtZTsKLSAgICAvLyB3aGV0aGVyIHRvIHByZWZlciAndmFsdWUgdHlwZScgb3ZlciAnY29uc3QmJwotICAgIGJvb2wgdmFsdWVfaXNfY2hlYXA7Ci0KLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpPiByZWFkX2Z1bmM7Ci0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKT4gd3JpdGVfZnVuYzsKLSAgfTsKLQotICAvLyBlLmcuICdTdHJpbmcnCi0gIEFzcGVjdCByYXc7Ci0KLSAgLy8gZS5nLiAnU3RyaW5nW10nCi0gIHN0ZDo6c2hhcmVkX3B0cjxBc3BlY3Q+IGFycmF5OwotCi0gIC8vIG5vdGU6IE51bGxhYmxlIHR5cGVzIGRvIG5vdCBleGlzdCBpbiBKYXZhLiBGb3IgbW9zdCBKYXZhIHR5cGVzLCB0aGUgdHlwZSBpcyBzcGxpdCBpbnRvIGEKLSAgLy8gbnVsbGFibGUgYW5kIG5vbi1udWxsYWJsZSB2YXJpYW50LiBUaGlzIGlzIGJlY2F1c2UgQysrIHR5cGVzIGFyZSBtb3JlIHVzdWFsbHkgbm9uLW51bGxhYmxlLCBidXQKLSAgLy8gZXZlcnl0aGluZyBpbiBKYXZhIGlzIG5vbi1udWxsYWJsZS4gVGhpcyBkb2VzIG1lYW4gdGhhdCBzb21lIEphdmEgaW50ZXJmYWNlcyBtYXkgaGF2ZSB0byBoYXZlCi0gIC8vICdAbnVsbGFibGUnIGFkZGVkIHRvIHRoZW0gaW4gb3JkZXIgdG8gZnVuY3Rpb24gYXMgZXhwZWN0ZWQgdy8gdGhlIE5ESy4gSXQgYWxzbyBtZWFucyB0aGF0IHNvbWUKLSAgLy8gdHJhbnNhY3Rpb25zIHdpbGwgYmUgYWxsb3dlZCBpbiBKYXZhIHdoaWNoIGFyZSBub3QgYWxsb3dlZCBpbiBDKysuIEhvd2V2ZXIsIGluIEphdmEsIGlmIGEgbnVsbAotICAvLyBpcyBpZ25vcmVkLCBpdCB3aWxsIGp1c3QgcmVzdWx0IGluIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gYW5kIGJlIGRlbGl2ZXJlZCB0byB0aGUgb3RoZXIgc2lkZS4KLSAgLy8gQysrIGRvZXMgbm90IGhhdmUgdGhpcyBzYW1lIGNhcGFjaXR5IChpbiBBbmRyb2lkKSwgYW5kIHNvIGluc3RlYWQsIHdlIGRpc3Rpbmd1aXNoIG51bGxhYmlsaXR5Ci0gIC8vIGluIHRoZSB0eXBlIHN5c3RlbS4KLQotICAvLyBlLmcuICdAbnVsbGFibGUgU3RyaW5nJwotICBzdGQ6OnNoYXJlZF9wdHI8QXNwZWN0PiBudWxsYWJsZTsKLQotICAvLyBlLmcuICdAbnVsbGFibGUgU3RyaW5nW10nCi0gIHN0ZDo6c2hhcmVkX3B0cjxBc3BlY3Q+IG51bGxhYmxlX2FycmF5OworICAvLyBuYW1lIG9mIHRoZSB0eXBlIGluIEMrKyBvdXRwdXQKKyAgc3RkOjpzdHJpbmcgY3BwX25hbWU7CisgIC8vIHdoZXRoZXIgdG8gcHJlZmVyICd2YWx1ZSB0eXBlJyBvdmVyICdjb25zdCYnCisgIGJvb2wgdmFsdWVfaXNfY2hlYXAgPSBmYWxzZTsKIH07CiAKLXN0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdfdmFsdWUpIHsKLSAgaWYgKHR5cGUuSXNBcnJheSgpKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZTsKLSAgfQotCi0gIGlmICh0eXBlLkdldE5hbWUoKSA9PSAibG9uZyIgJiYgIXR5cGUuSXNBcnJheSgpKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZSArICJMIjsKLSAgfQotCi0gIGlmIChhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7Ci0gICAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgQUlETF9GQVRBTF9JRighZW51bV90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgcmF3X3ZhbHVlIDw8ICJcIiI7Ci0gICAgcmV0dXJuIE5ka0Z1bGxDbGFzc05hbWUoKmVudW1fdHlwZSwgY3BwOjpDbGFzc05hbWVzOjpSQVcpICsKLSAgICAgICAgICAgIjo6IiArIHJhd192YWx1ZS5zdWJzdHIocmF3X3ZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7Ci0gIH0KLQotICByZXR1cm4gcmF3X3ZhbHVlOworc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICByZXR1cm4gY3BwOjpDcHBDb25zdGFudFZhbHVlRGVjb3JhdG9yKHR5cGUsIHJhd192YWx1ZSwgLyppc19uZGs9Ki90cnVlKTsKIH07CiAKLXN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpPiBTdGFuZGFyZFJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIFtuYW1lXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgIGMud3JpdGVyIDw8IG5hbWUgPDwgIigiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOwotICB9OwotfQotc3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYyk+IFN0YW5kYXJkV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIFtuYW1lXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgIGMud3JpdGVyIDw8IG5hbWUgPDwgIigiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOwotICB9OwotfQotCi1UeXBlSW5mbyBQcmltaXRpdmVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjcHBfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHByZXR0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgY3BwX25hbWVfZm9yX2FycmF5X29wdCA9IHN0ZDo6bnVsbG9wdCkgewotICBzdGQ6OnN0cmluZyBjcHBfbmFtZV9mb3JfYXJyYXkgPSBjcHBfbmFtZV9mb3JfYXJyYXlfb3B0LnZhbHVlX29yKGNwcF9uYW1lKTsKLSAgcmV0dXJuIFR5cGVJbmZvewotICAgICAgLnJhdyA9Ci0gICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgLmNwcF9uYW1lID0gY3BwX25hbWUsCi0gICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IHRydWUsCi0gICAgICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIkFQYXJjZWxfcmVhZCIgKyBwcmV0dHlfbmFtZSksCi0gICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZSgiQVBhcmNlbF93cml0ZSIgKyBwcmV0dHlfbmFtZSksCi0gICAgICAgICAgfSwKLSAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIGNwcF9uYW1lX2Zvcl9hcnJheSArICI+IiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yIiksCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvciIpLAotICAgICAgfSksCi0gICAgICAubnVsbGFibGUgPSBudWxscHRyLAotICAgICAgLm51bGxhYmxlX2FycmF5ID0gc3RkOjpzaGFyZWRfcHRyPFR5cGVJbmZvOjpBc3BlY3Q+KG5ldyBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgIC5jcHBfbmFtZSA9ICJzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPCIgKyBjcHBfbmFtZV9mb3JfYXJyYXkgKyAiPj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IiKSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yIiksCi0gICAgICB9KSwKLSAgfTsKLX0KLQotVHlwZUluZm8gSW50ZXJmYWNlVHlwZUluZm8oY29uc3QgQWlkbEludGVyZmFjZSYgdHlwZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IE5ka0Z1bGxDbGFzc05hbWUodHlwZSwgY3BwOjpDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotCi0gIHJldHVybiBUeXBlSW5mb3sKLSAgICAgIC5yYXcgPQotICAgICAgICAgIFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICJzdGQ6OnNoYXJlZF9wdHI8IiArIGNsYXp6ICsgIj4iLAotICAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZChjbGF6eiArICI6OnJlYWRGcm9tUGFyY2VsIiksCi0gICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZShjbGF6eiArICI6OndyaXRlVG9QYXJjZWwiKSwKLSAgICAgICAgICB9LAotICAgICAgLmFycmF5ID0gbnVsbHB0ciwKLSAgICAgIC5udWxsYWJsZSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjpzaGFyZWRfcHRyPCIgKyBjbGF6eiArICI+IiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKGNsYXp6ICsgIjo6cmVhZEZyb21QYXJjZWwiKSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoY2xhenogKyAiOjp3cml0ZVRvUGFyY2VsIiksCi0gICAgICB9KSwKLSAgICAgIC5udWxsYWJsZV9hcnJheSA9IG51bGxwdHIsCi0gIH07Ci19Ci0KLVR5cGVJbmZvIFBhcmNlbGFibGVUeXBlSW5mbyhjb25zdCBBaWRsUGFyY2VsYWJsZSYgdHlwZSwgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzKSB7Ci0gIHN0ZDo6c3RyaW5nIGNsYXp6ID0gTmRrRnVsbENsYXNzTmFtZSh0eXBlLCBjcHA6OkNsYXNzTmFtZXM6OlJBVyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBsYXRlX3BhcmFtcyA9ICIiOwotICBpZiAodHlwZVNwZWMuSXNHZW5lcmljKCkpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbXM7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiB0eXBlU3BlYy5HZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICB0eXBlX3BhcmFtcy5wdXNoX2JhY2soTmRrTmFtZU9mKHR5cGVzLCAqcGFyYW1ldGVyLCBTdG9yYWdlTW9kZTo6U1RBQ0spKTsKLSAgICB9Ci0gICAgY2xhenogKz0gYmFzZTo6U3RyaW5nUHJpbnRmKCI8JXM+IiwgYmFzZTo6Sm9pbih0eXBlX3BhcmFtcywgIiwgIikuY19zdHIoKSk7Ci0gIH0KLSAgcmV0dXJuIFR5cGVJbmZvewotICAgICAgLnJhdyA9Ci0gICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgLmNwcF9uYW1lID0gY2xhenosCi0gICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkUGFyY2VsYWJsZSIpLAotICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZSIpLAotICAgICAgICAgIH0sCi0gICAgICAuYXJyYXkgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6dmVjdG9yPCIgKyBjbGF6eiArICI+IiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yIiksCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvciIpLAotICAgICAgfSksCi0gICAgICAubnVsbGFibGUgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8IiArIGNsYXp6ICsgIj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVBhcmNlbGFibGUiKSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxhYmxlIiksCi0gICAgICB9KSwKLSAgICAgIC5udWxsYWJsZV9hcnJheSA9IG51bGxwdHIsCi0gIH07Ci19Ci0KLVR5cGVJbmZvIEVudW1EZWNsYXJhdGlvblR5cGVJbmZvKGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgewotICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IE5ka0Z1bGxDbGFzc05hbWUoZW51bV9kZWNsLCBjcHA6OkNsYXNzTmFtZXM6OlJBVyk7Ci0KLSAgc3RhdGljIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGtBUGFyY2VsVHlwZU5hbWVNYXAgPSB7Ci0gICAgICB7ImJ5dGUiLCAiQnl0ZSJ9LAotICAgICAgeyJpbnQiLCAiSW50MzIifSwKLSAgICAgIHsibG9uZyIsICJJbnQ2NCJ9LAotICB9OwotICBhdXRvIGFwYXJjZWxfbmFtZV9pdCA9IGtBUGFyY2VsVHlwZU5hbWVNYXAuZmluZChlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKS5HZXROYW1lKCkpOwotICBBSURMX0ZBVEFMX0lGKGFwYXJjZWxfbmFtZV9pdCA9PSBrQVBhcmNlbFR5cGVOYW1lTWFwLmVuZCgpLCBlbnVtX2RlY2wpOwotICBjb25zdCBzdGQ6OnN0cmluZyBhcGFyY2VsX25hbWUgPSBhcGFyY2VsX25hbWVfaXQtPnNlY29uZDsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBiYWNraW5nX3R5cGVfbmFtZSA9Ci0gICAgICBOZGtOYW1lT2YoQWlkbFR5cGVuYW1lcygpLCBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgU3RvcmFnZU1vZGU6OlNUQUNLKTsKLQotICByZXR1cm4gVHlwZUluZm97Ci0gICAgICAucmF3ID0gVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSBjbGF6eiwKLSAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSB0cnVlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF9yZWFkIiA8PCBhcGFyY2VsX25hbWUgPDwgIigiIDw8IGMucGFyY2VsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgcmVpbnRlcnByZXRfY2FzdDwiIDw8IGJhY2tpbmdfdHlwZV9uYW1lIDw8ICIqPigiIDw8IGMudmFyIDw8ICIpKSI7Ci0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF93cml0ZSIgPDwgYXBhcmNlbF9uYW1lIDw8ICIoIiA8PCBjLnBhcmNlbCA8PCAiLCBzdGF0aWNfY2FzdDwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgYmFja2luZ190eXBlX25hbWUgPDwgIj4oIiA8PCBjLnZhciA8PCAiKSkiOwotICAgICAgICAgICAgICB9LAotICAgICAgfSwKLSAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIGNsYXp6ICsgIj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF9yZWFkIiA8PCBhcGFyY2VsX25hbWUgPDwgIkFycmF5KCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0aWNfY2FzdDx2b2lkKj4oIiA8PCBjLnZhcgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPCIgPDwgYmFja2luZ190eXBlX25hbWUgPDwgIj4pIjsKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAud3JpdGVfZnVuYyA9Ci0gICAgICAgICAgICAgIFthcGFyY2VsX25hbWUsIGJhY2tpbmdfdHlwZV9uYW1lXShjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICAgICAgICAgICAgICAgIGMud3JpdGVyIDw8ICJBUGFyY2VsX3dyaXRlIiA8PCBhcGFyY2VsX25hbWUgPDwgIkFycmF5KCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCByZWludGVycHJldF9jYXN0PGNvbnN0ICIgPDwgYmFja2luZ190eXBlX25hbWUgPDwgIio+KCIgPDwgYy52YXIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLmRhdGEoKSksICIgPDwgYy52YXIgPDwgIi5zaXplKCkpIjsKLSAgICAgICAgICAgICAgfSwKLSAgICAgIH0pLAotICAgICAgLm51bGxhYmxlID0gbnVsbHB0ciwKLSAgICAgIC5udWxsYWJsZV9hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjwiICsgY2xhenogKyAiPj4iLAotICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgIC5yZWFkX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF9yZWFkIiA8PCBhcGFyY2VsX25hbWUgPDwgIkFycmF5KCIgPDwgYy5wYXJjZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0aWNfY2FzdDx2b2lkKj4oIiA8PCBjLnZhcgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8IiA8PCBiYWNraW5nX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI+KSI7Ci0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgLndyaXRlX2Z1bmMgPQotICAgICAgICAgICAgICBbYXBhcmNlbF9uYW1lLCBiYWNraW5nX3R5cGVfbmFtZV0oY29uc3QgQ29kZUdlbmVyYXRvckNvbnRleHQmIGMpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFyIGV4aXN0cywgdXNlIHdyaXRlQXJyYXkgd2l0aCBkYXRhKCkgYW5kIHNpemUoKS4KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBudWxscHRyIGFuZCAtMS4KLSAgICAgICAgICAgICAgICBjLndyaXRlciA8PCAiQVBhcmNlbF93cml0ZSIgPDwgYXBhcmNlbF9uYW1lIDw8ICJBcnJheSgiIDw8IGMucGFyY2VsIDw8ICIsICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgYy52YXIgPDwgIiA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgIiA8PCBiYWNraW5nX3R5cGVfbmFtZSA8PCAiKj4oIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGMudmFyIDw8ICItPmRhdGEoKSkgOiBudWxscHRyKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAoIiA8PCBjLnZhciA8PCAiID8gIiA8PCBjLnZhciA8PCAiLT5zaXplKCkgOiAtMSkpIjsKLSAgICAgICAgICAgICAgfSwKLSAgICAgIH0pLAotICB9OwotfQotCiAvLyBtYXAgZnJvbSBBSURMIGJ1aWx0LWluIHR5cGUgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyBOZGsgdHlwZSBpbmZvCiBzdGF0aWMgbWFwPHN0ZDo6c3RyaW5nLCBUeXBlSW5mbz4ga05ka1R5cGVJbmZvTWFwID0gewotICAgIHsidm9pZCIsIFR5cGVJbmZve3sidm9pZCIsIHRydWUsIG51bGxwdHIsIG51bGxwdHJ9LCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfX0sCi0gICAgeyJib29sZWFuIiwgUHJpbWl0aXZlVHlwZSgiYm9vbCIsICJCb29sIil9LAotICAgIHsiYnl0ZSIsIFByaW1pdGl2ZVR5cGUoImludDhfdCIsICJCeXRlIiwgInVpbnQ4X3QiKX0sCi0gICAgeyJjaGFyIiwgUHJpbWl0aXZlVHlwZSgiY2hhcjE2X3QiLCAiQ2hhciIpfSwKLSAgICB7ImludCIsIFByaW1pdGl2ZVR5cGUoImludDMyX3QiLCAiSW50MzIiKX0sCi0gICAgeyJsb25nIiwgUHJpbWl0aXZlVHlwZSgiaW50NjRfdCIsICJJbnQ2NCIpfSwKLSAgICB7ImZsb2F0IiwgUHJpbWl0aXZlVHlwZSgiZmxvYXQiLCAiRmxvYXQiKX0sCi0gICAgeyJkb3VibGUiLCBQcmltaXRpdmVUeXBlKCJkb3VibGUiLCAiRG91YmxlIil9LAotICAgIHsiU3RyaW5nIiwKLSAgICAgVHlwZUluZm97Ci0gICAgICAgICAucmF3ID0KLSAgICAgICAgICAgICBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjpzdHJpbmciLAotICAgICAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyIpLAotICAgICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkV3JpdGUoIjo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nIiksCi0gICAgICAgICAgICAgfSwKLSAgICAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IiwKLSAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvciIpLAotICAgICAgICAgfSksCi0gICAgICAgICAubnVsbGFibGUgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IiwKLSAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyIpLAotICAgICAgICAgfSksCi0gICAgICAgICAubnVsbGFibGVfYXJyYXkgPSBzdGQ6OnNoYXJlZF9wdHI8VHlwZUluZm86OkFzcGVjdD4obmV3IFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiIsCi0gICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvciIpLAotICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZSgiOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IiKSwKLSAgICAgICAgIH0pLAotICAgICB9fSwKKyAgICB7InZvaWQiLCB7InZvaWQiLCB0cnVlfX0sCisgICAgeyJib29sZWFuIiwgeyJib29sIiwgdHJ1ZX19LAorICAgIHsiYnl0ZSIsIHsiaW50OF90IiwgdHJ1ZX19LAorICAgIHsiY2hhciIsIHsiY2hhcjE2X3QiLCB0cnVlfX0sCisgICAgeyJpbnQiLCB7ImludDMyX3QiLCB0cnVlfX0sCisgICAgeyJsb25nIiwgeyJpbnQ2NF90IiwgdHJ1ZX19LAorICAgIHsiZmxvYXQiLCB7ImZsb2F0IiwgdHJ1ZX19LAorICAgIHsiZG91YmxlIiwgeyJkb3VibGUiLCB0cnVlfX0sCisgICAgeyJTdHJpbmciLCB7InN0ZDo6c3RyaW5nIn19LAogICAgIC8vIFRPRE8oYi8xMzYwNDg2ODQpIHsiTWFwIiwgIiJ9LAotICAgIHsiSUJpbmRlciIsCi0gICAgIFR5cGVJbmZvewotICAgICAgICAgLnJhdyA9Ci0gICAgICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgICAgLmNwcF9uYW1lID0gIjo6bmRrOjpTcEFJQmluZGVyIiwKLSAgICAgICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWRSZXF1aXJlZFN0cm9uZ0JpbmRlciIpLAotICAgICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFN0cm9uZ0JpbmRlciIpLAotICAgICAgICAgICAgIH0sCi0gICAgICAgICAuYXJyYXkgPSBudWxscHRyLAotICAgICAgICAgLm51bGxhYmxlID0gc3RkOjpzaGFyZWRfcHRyPFR5cGVJbmZvOjpBc3BlY3Q+KG5ldyBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICI6Om5kazo6U3BBSUJpbmRlciIsCi0gICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlU3Ryb25nQmluZGVyIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVTdHJvbmdCaW5kZXIiKSwKLSAgICAgICAgIH0pLAotICAgICAgICAgLm51bGxhYmxlX2FycmF5ID0gbnVsbHB0ciwKLSAgICAgfX0sCi0gICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsCi0gICAgIFR5cGVJbmZvewotICAgICAgICAgLnJhdyA9Ci0gICAgICAgICAgICAgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAgICAgLmNwcF9uYW1lID0gIjo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciIsCi0gICAgICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAucmVhZF9mdW5jID0gU3RhbmRhcmRSZWFkKCI6Om5kazo6QVBhcmNlbF9yZWFkUmVxdWlyZWRQYXJjZWxGaWxlRGVzY3JpcHRvciIpLAotICAgICAgICAgICAgICAgICAud3JpdGVfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFBhcmNlbEZpbGVEZXNjcmlwdG9yIiksCi0gICAgICAgICAgICAgfSwKLSAgICAgICAgIC5hcnJheSA9IHN0ZDo6c2hhcmVkX3B0cjxUeXBlSW5mbzo6QXNwZWN0PihuZXcgVHlwZUluZm86OkFzcGVjdHsKLSAgICAgICAgICAgICAuY3BwX25hbWUgPSAic3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiIsCi0gICAgICAgICAgICAgLnZhbHVlX2lzX2NoZWFwID0gZmFsc2UsCi0gICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvciIpLAotICAgICAgICAgICAgIC53cml0ZV9mdW5jID0gU3RhbmRhcmRXcml0ZSgiOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IiKSwKLSAgICAgICAgIH0pLAotICAgICAgICAgLm51bGxhYmxlID0gc3RkOjpzaGFyZWRfcHRyPFR5cGVJbmZvOjpBc3BlY3Q+KG5ldyBUeXBlSW5mbzo6QXNwZWN0ewotICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICI6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IiLAotICAgICAgICAgICAgIC52YWx1ZV9pc19jaGVhcCA9IGZhbHNlLAotICAgICAgICAgICAgIC5yZWFkX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVBhcmNlbEZpbGVEZXNjcmlwdG9yIiksCi0gICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFJlYWQoIjo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvciIpLAotICAgICAgICAgfSksCi0gICAgICAgICAubnVsbGFibGVfYXJyYXkgPSBudWxscHRyLAotICAgICB9fSwKLSAgICB7IlBhcmNlbGFibGVIb2xkZXIiLAotICAgICBUeXBlSW5mb3sKLSAgICAgICAgIC5yYXcgPQotICAgICAgICAgICAgIFR5cGVJbmZvOjpBc3BlY3R7Ci0gICAgICAgICAgICAgICAgIC5jcHBfbmFtZSA9ICI6Om5kazo6QVBhcmNlbGFibGVIb2xkZXIiLAotICAgICAgICAgICAgICAgICAudmFsdWVfaXNfY2hlYXAgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgLnJlYWRfZnVuYyA9IFN0YW5kYXJkUmVhZCgiOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUiKSwKLSAgICAgICAgICAgICAgICAgLndyaXRlX2Z1bmMgPSBTdGFuZGFyZFdyaXRlKCI6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUiKSwKLSAgICAgICAgICAgICB9LAotICAgICAgICAgLmFycmF5ID0gbnVsbHB0ciwKLSAgICAgICAgIC5udWxsYWJsZSA9IG51bGxwdHIsCi0gICAgICAgICAubnVsbGFibGVfYXJyYXkgPSBudWxscHRyLAotICAgICB9fSwKKyAgICB7IklCaW5kZXIiLCB7Ijo6bmRrOjpTcEFJQmluZGVyIn19LAorICAgIHsiUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7Ijo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciJ9fSwKKyAgICB7IlBhcmNlbGFibGVIb2xkZXIiLCB7Ijo6bmRrOjpBUGFyY2VsYWJsZUhvbGRlciJ9fSwKIH07CiAKLXN0YXRpYyBUeXBlSW5mbzo6QXNwZWN0IEdldFR5cGVBc3BlY3QoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7Ci0gIEFJRExfRkFUQUxfSUYoIWFpZGwuSXNSZXNvbHZlZCgpLCBhaWRsKSA8PCBhaWRsLlRvU3RyaW5nKCk7CitzdGF0aWMgVHlwZUluZm8gR2V0QmFzZVR5cGVJbmZvKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCkgewogICBhdXRvJiBhaWRsX25hbWUgPSBhaWRsLkdldE5hbWUoKTsKIAotICBUeXBlSW5mbyBpbmZvOwotCi0gIC8vIFRPRE8oYi8xMzYwNDg2ODQpOiBGb3Igbm93LCBMaXN0PFQ+IGlzIGNvbnZlcnRlZCB0byBUW10uKEJvdGggYXJlIHVzaW5nIHZlY3RvcjxUPikKLSAgaWYgKGFpZGxfbmFtZSA9PSAiTGlzdCIpIHsKLSAgICBBSURMX0ZBVEFMX0lGKCFhaWRsLklzR2VuZXJpYygpLCBhaWRsKSA8PCAiTGlzdCBtdXN0IGJlIGdlbmVyaWMgdHlwZS4iOwotICAgIEFJRExfRkFUQUxfSUYoYWlkbC5HZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSAhPSAxLCBhaWRsKQotICAgICAgICA8PCAiTGlzdCBjYW4gYWNjZXB0IG9ubHkgb25lIHR5cGUgcGFyYW1ldGVyLiI7Ci0gICAgY29uc3QgYXV0byYgdHlwZV9wYXJhbSA9IGFpZGwuR2V0VHlwZVBhcmFtZXRlcnMoKVswXTsKLSAgICAvLyBUT0RPKGIvMTM2MDQ4Njg0KSBBSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgdHlwZSBwYXJhbWV0ZXIgeWV0LgotICAgIEFJRExfRkFUQUxfSUYodHlwZV9wYXJhbS0+SXNHZW5lcmljKCksIGFpZGwpIDw8ICJBSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgdHlwZSBwYXJhbWV0ZXIiOwotCi0gICAgQWlkbFR5cGVTcGVjaWZpZXIgYXJyYXlfdHlwZSA9Ci0gICAgICAgIEFpZGxUeXBlU3BlY2lmaWVyKEFJRExfTE9DQVRJT05fSEVSRSwgdHlwZV9wYXJhbS0+R2V0VW5yZXNvbHZlZE5hbWUoKSwgdHJ1ZSAvKiBpc0FycmF5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIHR5cGVfcGFyYW1zICovLCBhaWRsLkdldENvbW1lbnRzKCkpOwotICAgIGlmICghKGFycmF5X3R5cGUuUmVzb2x2ZSh0eXBlcykgJiYgYXJyYXlfdHlwZS5DaGVja1ZhbGlkKHR5cGVzKSkpIHsKLSAgICAgIEFJRExfRkFUQUwoYWlkbCkgPDwgIlRoZSB0eXBlIHBhcmFtZXRlciBpcyB3cm9uZy4iOwotICAgIH0KLSAgICByZXR1cm4gR2V0VHlwZUFzcGVjdCh0eXBlcywgYXJyYXlfdHlwZSk7Ci0gIH0KLQogICBpZiAoQWlkbFR5cGVuYW1lczo6SXNCdWlsdGluVHlwZW5hbWUoYWlkbF9uYW1lKSkgewogICAgIGF1dG8gaXQgPSBrTmRrVHlwZUluZm9NYXAuZmluZChhaWRsX25hbWUpOwogICAgIEFJRExfRkFUQUxfSUYoaXQgPT0ga05ka1R5cGVJbmZvTWFwLmVuZCgpLCBhaWRsX25hbWUpOwotICAgIGluZm8gPSBpdC0+c2Vjb25kOworICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKGFpZGxfbmFtZSk7CisgIEFJRExfRkFUQUxfSUYodHlwZSA9PSBudWxscHRyLCBhaWRsX25hbWUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZS4iOworCisgIGlmIChjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRmID0gdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZiAhPSBudWxscHRyKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBOZGtGdWxsQ2xhc3NOYW1lKCppbnRmLCBjcHA6OkNsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisgICAgcmV0dXJuIFR5cGVJbmZveyJzdGQ6OnNoYXJlZF9wdHI8IiArIGNsYXp6ICsgIj4ifTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IHR5cGUtPkFzUGFyY2VsYWJsZSgpOyBwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKKyAgICBzdGQ6OnN0cmluZyBjbGF6eiA9IE5ka0Z1bGxDbGFzc05hbWUoKnBhcmNlbGFibGUsIGNwcDo6Q2xhc3NOYW1lczo6UkFXKTsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wbGF0ZV9wYXJhbXMgPSAiIjsKKyAgICBpZiAoYWlkbC5Jc0dlbmVyaWMoKSkgeworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1zOworICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiBhaWRsLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgdHlwZV9wYXJhbXMucHVzaF9iYWNrKE5ka05hbWVPZih0eXBlcywgKnBhcmFtZXRlciwgU3RvcmFnZU1vZGU6OlNUQUNLKSk7CisgICAgICB9CisgICAgICBjbGF6eiArPSBiYXNlOjpTdHJpbmdQcmludGYoIjwlcz4iLCBiYXNlOjpKb2luKHR5cGVfcGFyYW1zLCAiLCAiKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIFR5cGVJbmZve2NsYXp6fTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSB0eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOworICAgICAgICAgICAgIGVudW1fZGVjbCAhPSBudWxscHRyKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBOZGtGdWxsQ2xhc3NOYW1lKCplbnVtX2RlY2wsIGNwcDo6Q2xhc3NOYW1lczo6UkFXKTsKKyAgICByZXR1cm4gVHlwZUluZm97Y2xhenosIHRydWV9OwogICB9IGVsc2UgewotICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKGFpZGxfbmFtZSk7Ci0gICAgQUlETF9GQVRBTF9JRih0eXBlID09IG51bGxwdHIsIGFpZGxfbmFtZSkgPDwgIlVucmVjb2duaXplZCB0eXBlLiI7CisgICAgQUlETF9GQVRBTChhaWRsX25hbWUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSI7CisgIH0KK30KIAotICAgIGlmIChjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRmID0gdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZiAhPSBudWxscHRyKSB7Ci0gICAgICBpbmZvID0gSW50ZXJmYWNlVHlwZUluZm8oKmludGYpOwotICAgIH0gZWxzZSBpZiAoY29uc3QgQWlkbFBhcmNlbGFibGUqIHBhcmNlbGFibGUgPSB0eXBlLT5Bc1BhcmNlbGFibGUoKTsgcGFyY2VsYWJsZSAhPSBudWxscHRyKSB7Ci0gICAgICBpbmZvID0gUGFyY2VsYWJsZVR5cGVJbmZvKCpwYXJjZWxhYmxlLCBhaWRsLCB0eXBlcyk7Ci0gICAgfSBlbHNlIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSB0eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICAgIGluZm8gPSBFbnVtRGVjbGFyYXRpb25UeXBlSW5mbygqZW51bV9kZWNsKTsKLSAgICB9IGVsc2UgewotICAgICAgQUlETF9GQVRBTChhaWRsX25hbWUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSI7CitzdGF0aWMgVHlwZUluZm8gV3JhcE51bGxhYmxlVHlwZShUeXBlSW5mbyBpbmZvLCBib29sIGlzX2hlYXApIHsKKyAgaWYgKGlzX2hlYXApIHsKKyAgICBpbmZvLmNwcF9uYW1lID0gInN0ZDo6dW5pcXVlX3B0cjwiICsgaW5mby5jcHBfbmFtZSArICI+IjsKKyAgfSBlbHNlIHsKKyAgICBpbmZvLmNwcF9uYW1lID0gInN0ZDo6b3B0aW9uYWw8IiArIGluZm8uY3BwX25hbWUgKyAiPiI7CisgIH0KKyAgaW5mby52YWx1ZV9pc19jaGVhcCA9IGZhbHNlOworICByZXR1cm4gaW5mbzsKK30KKworc3RhdGljIFR5cGVJbmZvIFdyYXBBcnJheVR5cGUoVHlwZUluZm8gaW5mbywgY29uc3QgQXJyYXlUeXBlKiBhcnJheSkgeworICBBSURMX0ZBVEFMX0lGKCFhcnJheSwgQUlETF9MT0NBVElPTl9IRVJFKSA8PCAibm90IGFuIGFycmF5IjsKKyAgLy8gV2hlbiAiYnl0ZSIoQUlETCkgaXMgdXNlZCBpbiBhbiBhcnJheSwgdXNlICJ1aW50OF90IiBiZWNhdXNlIGl0J3MgbW9yZSBDKysgaWRpb21hdGljLgorICBpZiAoaW5mby5jcHBfbmFtZSA9PSAiaW50OF90IikgeworICAgIGluZm8uY3BwX25hbWUgPSAidWludDhfdCI7CisgIH0KKyAgaWYgKHN0ZDo6Z2V0X2lmPER5bmFtaWNBcnJheT4oYXJyYXkpKSB7CisgICAgaW5mby5jcHBfbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgaW5mby5jcHBfbmFtZSArICI+IjsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBhdXRvJiBkaW1lbnNpb25zID0gc3RkOjpnZXQ8Rml4ZWRTaXplQXJyYXk+KCphcnJheSkuZGltZW5zaW9uczsKKyAgICBmb3IgKGF1dG8gaXQgPSByYmVnaW4oZGltZW5zaW9ucyksIGVuZCA9IHJlbmQoZGltZW5zaW9ucyk7IGl0ICE9IGVuZDsgaXQrKykgeworICAgICAgaW5mby5jcHBfbmFtZSA9ICJzdGQ6OmFycmF5PCIgKyBpbmZvLmNwcF9uYW1lICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgKCppdCktPlZhbHVlU3RyaW5nKGtJbnRUeXBlLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKSArICI+IjsKICAgICB9CiAgIH0KKyAgaW5mby52YWx1ZV9pc19jaGVhcCA9IGZhbHNlOworICByZXR1cm4gaW5mbzsKK30KIAotICBpZiAoYWlkbC5Jc0FycmF5KCkpIHsKLSAgICBpZiAoYWlkbC5Jc051bGxhYmxlKCkpIHsKLSAgICAgIEFJRExfRkFUQUxfSUYoaW5mby5udWxsYWJsZV9hcnJheSA9PSBudWxscHRyLCBhaWRsKQotICAgICAgICAgIDw8ICJVbnN1cHBvcnRlZCB0eXBlIGluIE5ESyBCYWNrZW5kOiAiIDw8IGFpZGwuVG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiAqaW5mby5udWxsYWJsZV9hcnJheTsKK3N0YXRpYyBib29sIFNob3VsZFdyYXBOdWxsYWJsZShjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3Qgc3RkOjpzdHJpbmcmIGFpZGxfbmFtZSkgeworICBpZiAoQWlkbFR5cGVuYW1lczo6SXNQcmltaXRpdmVUeXBlbmFtZShhaWRsX25hbWUpIHx8IGFpZGxfbmFtZSA9PSAiUGFyY2VsYWJsZUhvbGRlciIgfHwKKyAgICAgIGFpZGxfbmFtZSA9PSAiSUJpbmRlciIgfHwgYWlkbF9uYW1lID09ICJQYXJjZWxGaWxlRGVzY3JpcHRvciIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZXMuVHJ5R2V0RGVmaW5lZFR5cGUoYWlkbF9uYW1lKTsgZGVmaW5lZF90eXBlKSB7CisgICAgaWYgKGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKSB8fCBkZWZpbmVkX3R5cGUtPkFzSW50ZXJmYWNlKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgQUlETF9GQVRBTF9JRihpbmZvLmFycmF5ID09IG51bGxwdHIsIGFpZGwpCi0gICAgICAgIDw8ICJVbnN1cHBvcnRlZCB0eXBlIGluIE5ESyBCYWNrZW5kOiAiIDw8IGFpZGwuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gKmluZm8uYXJyYXk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBUeXBlSW5mbyBHZXRUeXBlSW5mbyhjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwpIHsKKyAgQUlETF9GQVRBTF9JRighYWlkbC5Jc1Jlc29sdmVkKCksIGFpZGwpIDw8IGFpZGwuVG9TdHJpbmcoKTsKKyAgLy8gS2VlcCBvcmlnaW5hbCBAbnVsbGFibGUgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIExpc3Q8VD4uICJAbnVsbGFibGUiIGlzIGF0dGFjaGVkIHRvICJMaXN0IiBub3QKKyAgLy8gIlQiCisgIGJvb2wgaXNfbnVsbGFibGUgPSBhaWRsLklzTnVsbGFibGUoKTsKKyAgY29uc3QgQXJyYXlUeXBlKiBhcnJheSA9IG51bGxwdHI7CisgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyKiBlbGVtZW50X3R5cGUgPSAmYWlkbDsKKworICAvLyBMaXN0PFQ+IGlzIGNvbnZlcnRlZCB0byBUW10uCisgIGlmIChhaWRsLkdldE5hbWUoKSA9PSAiTGlzdCIpIHsKKyAgICBzdGF0aWMgY29uc3QgQXJyYXlUeXBlIGtEeW5hbWljQXJyYXl7RHluYW1pY0FycmF5e319OworCisgICAgQUlETF9GQVRBTF9JRighYWlkbC5Jc0dlbmVyaWMoKSwgYWlkbCkgPDwgIkxpc3QgbXVzdCBiZSBnZW5lcmljIHR5cGUuIjsKKyAgICBBSURMX0ZBVEFMX0lGKGFpZGwuR2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgIT0gMSwgYWlkbCkKKyAgICAgICAgPDwgIkxpc3QgY2FuIGFjY2VwdCBvbmx5IG9uZSB0eXBlIHBhcmFtZXRlci4iOworICAgIGNvbnN0IGF1dG8mIHR5cGVfcGFyYW0gPSAqYWlkbC5HZXRUeXBlUGFyYW1ldGVycygpWzBdOworICAgIC8vIFRPRE8oYi8xMzYwNDg2ODQpIEFJREwgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCB0eXBlIHBhcmFtZXRlciB5ZXQuCisgICAgQUlETF9GQVRBTF9JRih0eXBlX3BhcmFtLklzR2VuZXJpYygpLCBhaWRsKSA8PCAiQUlETCBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIHR5cGUgcGFyYW1ldGVyIjsKKyAgICAvLyBUcmVhdCAiTGlzdDxUPiIgYXMgYW4gYXJyYXkgb2YgVC4KKyAgICBhcnJheSA9ICZrRHluYW1pY0FycmF5OworICAgIGVsZW1lbnRfdHlwZSA9ICZ0eXBlX3BhcmFtOworICB9IGVsc2UgaWYgKGFpZGwuSXNBcnJheSgpKSB7CisgICAgYXJyYXkgPSAmYWlkbC5HZXRBcnJheSgpOwogICB9CiAKLSAgaWYgKGFpZGwuSXNOdWxsYWJsZSgpKSB7Ci0gICAgQUlETF9GQVRBTF9JRihpbmZvLm51bGxhYmxlID09IG51bGxwdHIsIGFpZGwpCi0gICAgICAgIDw8ICJVbnN1cHBvcnRlZCB0eXBlIGluIE5ESyBCYWNrZW5kOiAiIDw8IGFpZGwuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gKmluZm8ubnVsbGFibGU7Ci0gIH0KKyAgVHlwZUluZm8gaW5mbyA9IEdldEJhc2VUeXBlSW5mbyh0eXBlcywgKmVsZW1lbnRfdHlwZSk7CiAKLSAgcmV0dXJuIGluZm8ucmF3OworICBpZiAoaXNfbnVsbGFibGUgJiYgU2hvdWxkV3JhcE51bGxhYmxlKHR5cGVzLCBlbGVtZW50X3R5cGUtPkdldE5hbWUoKSkpIHsKKyAgICBpbmZvID0gV3JhcE51bGxhYmxlVHlwZShpbmZvLCBhaWRsLklzSGVhcE51bGxhYmxlKCkpOworICB9CisgIGlmIChhcnJheSkgeworICAgIGluZm8gPSBXcmFwQXJyYXlUeXBlKGluZm8sIGFycmF5KTsKKyAgICBpZiAoaXNfbnVsbGFibGUpIHsKKyAgICAgIEFJRExfRkFUQUxfSUYoYWlkbC5Jc0hlYXBOdWxsYWJsZSgpLCBhaWRsKSA8PCAiQXJyYXkvTGlzdCBjYW4ndCBiZSBAbnVsbGFibGUoaGVhcD10cnVlKSI7CisgICAgICBpbmZvID0gV3JhcE51bGxhYmxlVHlwZShpbmZvLCAvKmlzX2hlYXA9Ki9mYWxzZSk7CisgICAgfQorICB9CisgIHJldHVybiBpbmZvOwogfQogCiBzdGQ6OnN0cmluZyBOZGtGdWxsQ2xhc3NOYW1lKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwgY3BwOjpDbGFzc05hbWVzIG5hbWUpIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlcyA9IHsiOjphaWRsIn07Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYWNrYWdlID0gdHlwZS5HZXRTcGxpdFBhY2thZ2UoKTsKLSAgcGllY2VzLmluc2VydChwaWVjZXMuZW5kKCksIHBhY2thZ2UuYmVnaW4oKSwgcGFja2FnZS5lbmQoKSk7Ci0gIHBpZWNlcy5wdXNoX2JhY2soY3BwOjpDbGFzc05hbWUodHlwZSwgbmFtZSkpOwotCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdF9uYW1lID0gU3BsaXQodHlwZS5HZXRDYW5vbmljYWxOYW1lKCksICIuIik7CisgIHBpZWNlcy5pbnNlcnQocGllY2VzLmVuZCgpLCBzcGxpdF9uYW1lLmJlZ2luKCksIHNwbGl0X25hbWUuZW5kKCkpOworICAvLyBPdmVycmlkZSBuYW1lIHBhcnQgd2l0aCBjcHA6OkNsYXNzTmFtZSh0eXBlLCBuYW1lKQorICBwaWVjZXMuYmFjaygpID0gY3BwOjpDbGFzc05hbWUodHlwZSwgbmFtZSk7CiAgIHJldHVybiBKb2luKHBpZWNlcywgIjo6Iik7CiB9CiAKIHN0ZDo6c3RyaW5nIE5ka05hbWVPZihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIFN0b3JhZ2VNb2RlIG1vZGUpIHsKLSAgVHlwZUluZm86OkFzcGVjdCBhc3BlY3QgPSBHZXRUeXBlQXNwZWN0KHR5cGVzLCBhaWRsKTsKKyAgVHlwZUluZm8gYXNwZWN0ID0gR2V0VHlwZUluZm8odHlwZXMsIGFpZGwpOwogCiAgIHN3aXRjaCAobW9kZSkgewogICAgIGNhc2UgU3RvcmFnZU1vZGU6OlNUQUNLOgpAQCAtNDQwLDM0ICsyMTQsMjAgQEAKICAgfQogfQogCi1zaXplX3QgTmRrQWxpZ25tZW50T2YoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiBhaWRsKSB7Ci0gIC8vIG1hcCBmcm9tIE5ESyB0eXBlIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWxpZ25tZW50IHNpemUKLSAgc3RhdGljIG1hcDxzdHJpbmcsIGludD4gYWxpZ25tZW50ID0gewotICAgICAgeyJib29sIiwgMX0sICB7ImludDhfdCIsIDF9LCAgeyJjaGFyMTZfdCIsIDJ9LCB7ImRvdWJsZSIsIDh9LAotICAgICAgeyJmbG9hdCIsIDR9LCB7ImludDMyX3QiLCA0fSwgeyJpbnQ2NF90IiwgOH0sCi0gIH07Ci0KLSAgY29uc3Qgc3RyaW5nJiBuYW1lID0gTmRrTmFtZU9mKHR5cGVzLCBhaWRsLCBTdG9yYWdlTW9kZTo6U1RBQ0spOwotICBpZiAoYWxpZ25tZW50LmZpbmQobmFtZSkgIT0gYWxpZ25tZW50LmVuZCgpKSB7Ci0gICAgcmV0dXJuIGFsaWdubWVudFtuYW1lXTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBhdXRvJiBkZWZpbmVkVHlwZSA9IHR5cGVzLlRyeUdldERlZmluZWRUeXBlKGFpZGwuR2V0TmFtZSgpKTsKLSAgICBBSURMX0ZBVEFMX0lGKGRlZmluZWRUeXBlID09IG51bGxwdHIsIGFpZGwpIDw8ICJGYWlsZWQgdG8gcmVzb2x2ZSB0eXBlLiI7Ci0gICAgaWYgKGNvbnN0IGF1dG8mIGVudW1UeXBlID0gZGVmaW5lZFR5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7IGVudW1UeXBlICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBOZGtBbGlnbm1lbnRPZih0eXBlcywgZW51bVR5cGUtPkdldEJhY2tpbmdUeXBlKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQogdm9pZCBXcml0ZVRvUGFyY2VsRm9yKGNvbnN0IENvZGVHZW5lcmF0b3JDb250ZXh0JiBjKSB7Ci0gIFR5cGVJbmZvOjpBc3BlY3QgYXNwZWN0ID0gR2V0VHlwZUFzcGVjdChjLnR5cGVzLCBjLnR5cGUpOwotICBhc3BlY3Qud3JpdGVfZnVuYyhjKTsKKyAgaWYgKGMudHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICBjLndyaXRlciA8PCAiOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoIiA8PCBjLnBhcmNlbCA8PCAiLCAiIDw8IGMudmFyIDw8ICIpIjsKKyAgfSBlbHNlIHsKKyAgICBjLndyaXRlciA8PCAiOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKCIgPDwgYy5wYXJjZWwgPDwgIiwgIiA8PCBjLnZhciA8PCAiKSI7CisgIH0KIH0KIAogdm9pZCBSZWFkRnJvbVBhcmNlbEZvcihjb25zdCBDb2RlR2VuZXJhdG9yQ29udGV4dCYgYykgewotICBUeXBlSW5mbzo6QXNwZWN0IGFzcGVjdCA9IEdldFR5cGVBc3BlY3QoYy50eXBlcywgYy50eXBlKTsKLSAgYXNwZWN0LnJlYWRfZnVuYyhjKTsKKyAgaWYgKGMudHlwZS5Jc051bGxhYmxlKCkpIHsKKyAgICBjLndyaXRlciA8PCAiOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YSgiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOworICB9IGVsc2UgeworICAgIGMud3JpdGVyIDw8ICI6Om5kazo6QVBhcmNlbF9yZWFkRGF0YSgiIDw8IGMucGFyY2VsIDw8ICIsICIgPDwgYy52YXIgPDwgIikiOworICB9CiB9CiAKIHN0ZDo6c3RyaW5nIE5ka0FyZ0xpc3QoCmRpZmYgLS1naXQgYS9haWRsX3RvX25kay5oIGIvYWlkbF90b19uZGsuaAppbmRleCAzNzBkMDdiLi43ZDgxNWM1IDEwMDY0NAotLS0gYS9haWRsX3RvX25kay5oCisrKyBiL2FpZGxfdG9fbmRrLmgKQEAgLTMxLDcgKzMxLDkgQEAKIHN0ZDo6c3RyaW5nIE5ka0hlYWRlckZpbGUoY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNwcDo6Q2xhc3NOYW1lcyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9vc19zZXAgPSB0cnVlKTsKIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSk7CitzdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlKTsKIAogLy8gUmV0dXJucyA6OmFpZGw6OnNvbWVfcGFja2FnZTo6c29tZV9zdWJfcGFja2FnZTo6Zm9vOjpJRm9vL0JwRm9vL0JuRm9vCiBzdGQ6OnN0cmluZyBOZGtGdWxsQ2xhc3NOYW1lKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwgY3BwOjpDbGFzc05hbWVzIG5hbWUpOwpAQCAtNDAsMTIgKzQyLDYgQEAKIC8vIGFycmF5IG1vZGlmaWVycy4KIHN0ZDo6c3RyaW5nIE5ka05hbWVPZihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIFN0b3JhZ2VNb2RlIG1vZGUpOwogCi0vLyBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiBrbm93biB0eXBlcyBhbmQgZW51bSBiYWNraW5nIHR5cGVzLgotLy8gSWYgdGhlIGFsaWdubWVudCBpcyB1bmtub3duLCBvciBpdCBpcyBhIEZpemVkU2l6ZSBwYXJjZWxhYmxlIHdpdGggaXRzCi0vLyBvd24gZ3VhcmFudGVlZCBhbGlnbm1lbnQoc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQpLCAwIHdpbGwgYmUKLS8vIHJldHVybmVkLgotc2l6ZV90IE5ka0FsaWdubWVudE9mKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYWlkbCk7Ci0KIHN0cnVjdCBDb2RlR2VuZXJhdG9yQ29udGV4dCB7CiAgIENvZGVXcml0ZXImIHdyaXRlcjsKIApkaWZmIC0tZ2l0IGEvYWlkbF90b19ydXN0LmNwcCBiL2FpZGxfdG9fcnVzdC5jcHAKaW5kZXggNDEyMWZmNC4uMzIxMzI2NiAxMDA2NDQKLS0tIGEvYWlkbF90b19ydXN0LmNwcAorKysgYi9haWRsX3RvX3J1c3QuY3BwCkBAIC0zOSw0MCArMzksNTQgQEAKIG5hbWVzcGFjZSB7CiBzdGQ6OnN0cmluZyBHZXRSYXdSdXN0TmFtZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSk7CiAKLXN0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3JJbnRlcm5hbChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlLCBib29sIGJ5X3JlZikgeworc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvckludGVybmFsKAorICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgIGNvbnN0IHN0ZDo6dmFyaWFudDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiYgcmF3X3ZhbHVlLCBib29sIGJ5X3JlZikgewogICBpZiAodHlwZS5Jc0FycmF5KCkpIHsKLSAgICAvLyBDb252ZXJ0IGB7IC4uLiB9YCB0byBgdmVjIXsgLi4uIH1gCi0gICAgcmV0dXJuICJ2ZWMhIiArIHJhd192YWx1ZTsKKyAgICBjb25zdCBhdXRvJiB2YWx1ZXMgPSBzdGQ6OmdldDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KHJhd192YWx1ZSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSAiWyIgKyBKb2luKHZhbHVlcywgIiwgIikgKyAiXSI7CisgICAgaWYgKHR5cGUuSXNEeW5hbWljQXJyYXkoKSkgeworICAgICAgdmFsdWUgPSAidmVjISIgKyB2YWx1ZTsKKyAgICB9CisgICAgaWYgKCF0eXBlLklzTXV0YXRlZCgpICYmIHR5cGUuSXNOdWxsYWJsZSgpKSB7CisgICAgICB2YWx1ZSA9ICJTb21lKCIgKyB2YWx1ZSArICIpIjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOwogICB9CiAKKyAgc3RkOjpzdHJpbmcgdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4ocmF3X3ZhbHVlKTsKKwogICBjb25zdCBhdXRvJiBhaWRsX25hbWUgPSB0eXBlLkdldE5hbWUoKTsKICAgaWYgKGFpZGxfbmFtZSA9PSAiY2hhciIpIHsKLSAgICByZXR1cm4gcmF3X3ZhbHVlICsgIiBhcyB1MTYiOworICAgIHJldHVybiB2YWx1ZSArICIgYXMgdTE2IjsKICAgfQogCiAgIGlmIChhaWRsX25hbWUgPT0gImZsb2F0IikgewotICAgIC8vIHJhd192YWx1ZSBhbHJlYWR5IGVuZHMgaW4gYGZgLCBzbyBqdXN0IGFkZCBgMzJgCi0gICAgcmV0dXJuIHJhd192YWx1ZSArICIzMiI7CisgICAgLy8gdmFsdWUgYWxyZWFkeSBlbmRzIGluIGBmYCwgc28ganVzdCBhZGQgYDMyYAorICAgIHJldHVybiB2YWx1ZSArICIzMiI7CiAgIH0KIAogICBpZiAoYWlkbF9uYW1lID09ICJkb3VibGUiKSB7Ci0gICAgcmV0dXJuIHJhd192YWx1ZSArICJmNjQiOworICAgIHJldHVybiB2YWx1ZSArICJmNjQiOworICB9CisKKyAgaWYgKGF1dG8gZGVmaW5lZF90eXBlID0gdHlwZS5HZXREZWZpbmVkVHlwZSgpOyBkZWZpbmVkX3R5cGUpIHsKKyAgICBhdXRvIGVudW1fdHlwZSA9IGRlZmluZWRfdHlwZS0+QXNFbnVtRGVjbGFyYXRpb24oKTsKKyAgICBBSURMX0ZBVEFMX0lGKCFlbnVtX3R5cGUsIHR5cGUpIDw8ICJJbnZhbGlkIHR5cGUgZm9yIFwiIiA8PCB2YWx1ZSA8PCAiXCIiOworICAgIHJldHVybiBHZXRSYXdSdXN0TmFtZSh0eXBlKSArICI6OiIgKyB2YWx1ZS5zdWJzdHIodmFsdWUuZmluZF9sYXN0X29mKCcuJykgKyAxKTsKICAgfQogCiAgIGlmIChhaWRsX25hbWUgPT0gIlN0cmluZyIgJiYgIWJ5X3JlZikgewogICAgIC8vIFRoZSBhY3R1YWwgdHlwZSBtaWdodCBiZSBTdHJpbmcgb3IgJnN0ciwKICAgICAvLyBhbmQgLmludG8oKSB0cmFuc3BhcmVudGx5IGNvbnZlcnRzIGludG8gZWl0aGVyIG9uZQotICAgIHJldHVybiByYXdfdmFsdWUgKyAiLmludG8oKSI7CisgICAgdmFsdWUgPSB2YWx1ZSArICIuaW50bygpIjsKICAgfQogCi0gIGlmIChhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGUuR2V0RGVmaW5lZFR5cGUoKTsgZGVmaW5lZF90eXBlKSB7Ci0gICAgYXV0byBlbnVtX3R5cGUgPSBkZWZpbmVkX3R5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgQUlETF9GQVRBTF9JRighZW51bV90eXBlLCB0eXBlKSA8PCAiSW52YWxpZCB0eXBlIGZvciBcIiIgPDwgcmF3X3ZhbHVlIDw8ICJcIiI7Ci0gICAgcmV0dXJuIEdldFJhd1J1c3ROYW1lKHR5cGUpICsgIjo6IiArIHJhd192YWx1ZS5zdWJzdHIocmF3X3ZhbHVlLmZpbmRfbGFzdF9vZignLicpICsgMSk7CisgIGlmICh0eXBlLklzTnVsbGFibGUoKSkgeworICAgIHZhbHVlID0gIlNvbWUoIiArIHZhbHVlICsgIikiOwogICB9CiAKLSAgcmV0dXJuIHJhd192YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOwogfQogCiBzdGQ6OnN0cmluZyBHZXRSYXdSdXN0TmFtZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgewpAQCAtMTAwLDkgKzExNCwxMCBAQAogICAgICAgeyJkb3VibGUiLCAiZjY0In0sCiAgICAgICB7IlN0cmluZyIsICJTdHJpbmcifSwKICAgICAgIHsiSUJpbmRlciIsICJiaW5kZXI6OlNwSUJpbmRlciJ9LAotICAgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsICJiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3IifSwKKyAgICAgIHsiUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvciJ9LAorICAgICAgeyJQYXJjZWxhYmxlSG9sZGVyIiwgImJpbmRlcjo6UGFyY2VsYWJsZUhvbGRlciJ9LAogICB9OwotCisgIGNvbnN0IGJvb2wgaXNfdmVjdG9yID0gdHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKTsKICAgLy8gSWYgdGhlIHR5cGUgaXMgYW4gYXJyYXkvTGlzdDxUPiwgZ2V0IHRoZSBpbm5lciBlbGVtZW50IHR5cGUKICAgQUlETF9GQVRBTF9JRih0eXBlbmFtZXMuSXNMaXN0KHR5cGUpICYmIHR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgIT0gMSwgdHlwZSk7CiAgIGNvbnN0IGF1dG8mIGVsZW1lbnRfdHlwZSA9IHR5cGUuSXNHZW5lcmljKCkgPyAoKnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKSkgOiB0eXBlOwpAQCAtMTEzLDggKzEyOCw4IEBACiAgICAgICByZXR1cm4gInU4IjsKICAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJTdHJpbmciICYmIG1vZGUgPT0gU3RvcmFnZU1vZGU6OlVOU0laRURfQVJHVU1FTlQpIHsKICAgICAgIHJldHVybiAic3RyIjsKLSAgICB9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZV9uYW1lID09ICJQYXJjZWxGaWxlRGVzY3JpcHRvciIpIHsKLSAgICAgIGlmICh0eXBlLklzQXJyYXkoKSAmJiBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CisgICAgfSBlbHNlIGlmIChlbGVtZW50X3R5cGVfbmFtZSA9PSAiUGFyY2VsRmlsZURlc2NyaXB0b3IiIHx8IGVsZW1lbnRfdHlwZV9uYW1lID09ICJJQmluZGVyIikgeworICAgICAgaWYgKGlzX3ZlY3RvciAmJiBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CiAgICAgICAgIC8vIE91dC1hcmd1bWVudHMgb2YgUGFyY2VsRmlsZURlc2NyaXB0b3JzIGFycmF5cyBuZWVkIHRvCiAgICAgICAgIC8vIGJlIFZlYzxPcHRpb248UGFyY2VsRmlsZURlc2NyaXB0b3I+PiBzbyByZXNpemVfb3V0X3ZlYwogICAgICAgICAvLyBjYW4gaW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgdG8gTm9uZSAoaXQgcmVxdWlyZXMgRGVmYXVsdApAQCAtMTI2LDUwICsxNDEsMTA4IEBACiAgICAgfQogICAgIHJldHVybiBtW2VsZW1lbnRfdHlwZV9uYW1lXTsKICAgfQorICBhdXRvIG5hbWUgPSBHZXRSYXdSdXN0TmFtZShlbGVtZW50X3R5cGUpOwogICBpZiAoVHlwZUlzSW50ZXJmYWNlKGVsZW1lbnRfdHlwZSwgdHlwZW5hbWVzKSkgewotICAgIHJldHVybiAiYmluZGVyOjpTdHJvbmc8ZHluICIgKyBHZXRSYXdSdXN0TmFtZShlbGVtZW50X3R5cGUpICsgIj4iOworICAgIG5hbWUgPSAiYmluZGVyOjpTdHJvbmc8ZHluICIgKyBuYW1lICsgIj4iOworICAgIGlmIChpc192ZWN0b3IgJiYgbW9kZSA9PSBTdG9yYWdlTW9kZTo6REVGQVVMVF9WQUxVRSkgeworICAgICAgLy8gT3V0LWFyZ3VtZW50cyBvZiBpbnRlcmZhY2UgYXJyYXlzIG5lZWQgdG8gYmUgVmVjPE9wdGlvbjwuLi4+PiBzbyByZXNpemVfb3V0X3ZlYworICAgICAgLy8gY2FuIGluaXRpYWxpemUgYWxsIGVsZW1lbnRzIHRvIE5vbmUuCisgICAgICBuYW1lID0gIk9wdGlvbjwiICsgbmFtZSArICI+IjsKKyAgICB9CiAgIH0KLQotICByZXR1cm4gR2V0UmF3UnVzdE5hbWUoZWxlbWVudF90eXBlKTsKKyAgcmV0dXJuIG5hbWU7CiB9CiB9ICAvLyBuYW1lc3BhY2UKIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvcihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSkgewotICBhdXRvIHJ1c3RfdmFsdWUgPSBDb25zdGFudFZhbHVlRGVjb3JhdG9ySW50ZXJuYWwodHlwZSwgcmF3X3ZhbHVlLCBmYWxzZSk7Ci0gIGlmICh0eXBlLklzTnVsbGFibGUoKSkgewotICAgIHJldHVybiAiU29tZSgiICsgcnVzdF92YWx1ZSArICIpIjsKLSAgfQotICByZXR1cm4gcnVzdF92YWx1ZTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpIHsKKyAgcmV0dXJuIENvbnN0YW50VmFsdWVEZWNvcmF0b3JJbnRlcm5hbCh0eXBlLCByYXdfdmFsdWUsIGZhbHNlKTsKIH0KIAotc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvclJlZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJhd192YWx1ZSkgewotICBhdXRvIHJ1c3RfdmFsdWUgPSBDb25zdGFudFZhbHVlRGVjb3JhdG9ySW50ZXJuYWwodHlwZSwgcmF3X3ZhbHVlLCB0cnVlKTsKLSAgaWYgKHR5cGUuSXNOdWxsYWJsZSgpKSB7Ci0gICAgcmV0dXJuICJTb21lKCIgKyBydXN0X3ZhbHVlICsgIikiOworc3RkOjpzdHJpbmcgQ29uc3RhbnRWYWx1ZURlY29yYXRvclJlZigKKyAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZhcmlhbnQ8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4mIHJhd192YWx1ZSkgeworICByZXR1cm4gQ29uc3RhbnRWYWx1ZURlY29yYXRvckludGVybmFsKHR5cGUsIHJhd192YWx1ZSwgdHJ1ZSk7Cit9CisKKy8vIFJldHVybnMgZGVmYXVsdCB2YWx1ZSBmb3IgYXJyYXkuCitzdGQ6OnN0cmluZyBBcnJheURlZmF1bHRWYWx1ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICBBSURMX0ZBVEFMX0lGKCF0eXBlLklzRml4ZWRTaXplQXJyYXkoKSwgdHlwZSkgPDwgIm5vdCBhIGZpeGVkLXNpemUgYXJyYXkiOworICBhdXRvIGRpbWVuc2lvbnMgPSB0eXBlLkdldEZpeGVkU2l6ZUFycmF5RGltZW5zaW9ucygpOworICBzdGQ6OnN0cmluZyB2YWx1ZSA9ICJEZWZhdWx0OjpkZWZhdWx0KCkiOworICBmb3IgKGF1dG8gaXQgPSByYmVnaW4oZGltZW5zaW9ucyksIGVuZCA9IHJlbmQoZGltZW5zaW9ucyk7IGl0ICE9IGVuZDsgaXQrKykgeworICAgIHZhbHVlID0gIlsiICsgSm9pbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKml0LCB2YWx1ZSksICIsICIpICsgIl0iOwogICB9Ci0gIHJldHVybiBydXN0X3ZhbHVlOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBAbnVsbGFibGUgVFtdIHNob3VsZCBiZSBtYXBwZWQgT3B0aW9uPFZlYzxPcHRpb248VD4+Citib29sIFVzZXNPcHRpb25Jbk51bGxhYmxlVmVjdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgQUlETF9GQVRBTF9JRighdHlwZS5Jc0FycmF5KCkgJiYgIXR5cGVuYW1lcy5Jc0xpc3QodHlwZSksIHR5cGUpIDw8ICJub3QgYSB2ZWN0b3IiOworICBBSURMX0ZBVEFMX0lGKHR5cGVuYW1lcy5Jc0xpc3QodHlwZSkgJiYgdHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSAhPSAxLCB0eXBlKQorICAgICAgPDwgIkxpc3Qgc2hvdWxkIGhhdmUgYSBzaW5nbGUgdHlwZSBhcmcuIjsKKworICBjb25zdCBhdXRvJiBlbGVtZW50X3R5cGUgPSB0eXBlLklzQXJyYXkoKSA/IHR5cGUgOiAqdHlwZS5HZXRUeXBlUGFyYW1ldGVycygpLmF0KDApOworICBpZiAodHlwZW5hbWVzLklzUHJpbWl0aXZlVHlwZW5hbWUoZWxlbWVudF90eXBlLkdldE5hbWUoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHR5cGVuYW1lcy5HZXRFbnVtRGVjbGFyYXRpb24oZWxlbWVudF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgUnVzdExpZmV0aW1lTmFtZShMaWZldGltZSBsaWZldGltZSkgeworICBzd2l0Y2ggKGxpZmV0aW1lKSB7CisgICAgY2FzZSBMaWZldGltZTo6Tk9ORToKKyAgICAgIHJldHVybiAiIjsKKyAgICBjYXNlIExpZmV0aW1lOjpBOgorICAgICAgcmV0dXJuICInYSAiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFJ1c3RMaWZldGltZUdlbmVyaWMoTGlmZXRpbWUgbGlmZXRpbWUpIHsKKyAgc3dpdGNoIChsaWZldGltZSkgeworICAgIGNhc2UgTGlmZXRpbWU6Ok5PTkU6CisgICAgICByZXR1cm4gIiI7CisgICAgY2FzZSBMaWZldGltZTo6QToKKyAgICAgIHJldHVybiAiPCdhPiI7CisgIH0KIH0KIAogc3RkOjpzdHJpbmcgUnVzdE5hbWVPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTW9kZSBtb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VNb2RlIG1vZGUsIExpZmV0aW1lIGxpZmV0aW1lKSB7CiAgIHN0ZDo6c3RyaW5nIHJ1c3RfbmFtZTsKICAgaWYgKHR5cGUuSXNBcnJheSgpIHx8IHR5cGVuYW1lcy5Jc0xpc3QodHlwZSkpIHsKICAgICBTdG9yYWdlTW9kZSBlbGVtZW50X21vZGU7Ci0gICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGU6Ok9VVF9BUkdVTUVOVCB8fCBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CisgICAgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpICYmIG1vZGUgPT0gU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQpIHsKKyAgICAgIC8vIEVsZW1lbnRzIG9mIGZpeGVkLXNpemUgYXJyYXkgZmllbGQgbmVlZCB0byBoYXZlIERlZmF1bHQuCisgICAgICBlbGVtZW50X21vZGUgPSBTdG9yYWdlTW9kZTo6REVGQVVMVF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGU6Ok9VVF9BUkdVTUVOVCB8fCBtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFKSB7CiAgICAgICAvLyBFbGVtZW50cyBuZWVkIHRvIGhhdmUgRGVmYXVsdCBmb3IgcmVzaXplX291dF92ZWMoKQogICAgICAgZWxlbWVudF9tb2RlID0gU3RvcmFnZU1vZGU6OkRFRkFVTFRfVkFMVUU7CiAgICAgfSBlbHNlIHsKICAgICAgIGVsZW1lbnRfbW9kZSA9IFN0b3JhZ2VNb2RlOjpWQUxVRTsKICAgICB9CiAgICAgcnVzdF9uYW1lID0gR2V0UnVzdE5hbWUodHlwZSwgdHlwZW5hbWVzLCBlbGVtZW50X21vZGUpOwotICAgIGlmICh0eXBlLklzTnVsbGFibGUoKSAmJiBydXN0X25hbWUgPT0gIlN0cmluZyIpIHsKKyAgICBpZiAodHlwZS5Jc051bGxhYmxlKCkgJiYgVXNlc09wdGlvbkluTnVsbGFibGVWZWN0b3IodHlwZSwgdHlwZW5hbWVzKSkgewogICAgICAgLy8gVGhlIG1hcHBpbmcgZm9yIG51bGxhYmxlIHN0cmluZyBhcnJheXMgaXMKICAgICAgIC8vIG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxzdHJpbmc+Pj4gaW4gdGhlIE5ESywKICAgICAgIC8vIHNvIHdlIGRvIHRoZSBzYW1lCi0gICAgICBydXN0X25hbWUgPSAiT3B0aW9uPCIgKyBydXN0X25hbWUgKyAiPiI7CisgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBuZWVkIHRvIHdoZW4gR2V0UnVzdE5hbWUoKSBhbHJlYWR5IHdyYXBzIGl0IHdpdGggT3B0aW9uLgorICAgICAgaWYgKCFiYXNlOjpTdGFydHNXaXRoKHJ1c3RfbmFtZSwgIk9wdGlvbjwiKSkgeworICAgICAgICBydXN0X25hbWUgPSAiT3B0aW9uPCIgKyBydXN0X25hbWUgKyAiPiI7CisgICAgICB9CiAgICAgfQogICAgIGlmIChtb2RlID09IFN0b3JhZ2VNb2RlOjpVTlNJWkVEX0FSR1VNRU5UKSB7CiAgICAgICBydXN0X25hbWUgPSAiWyIgKyBydXN0X25hbWUgKyAiXSI7CisgICAgfSBlbHNlIGlmICh0eXBlLklzRml4ZWRTaXplQXJyYXkoKSkgeworICAgICAgYXV0byBkaW1lbnNpb25zID0gdHlwZS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKTsKKyAgICAgIC8vIFRbTl1bTV0gPT4gW1tUOyBNXTsgTl0KKyAgICAgIGZvciAoYXV0byBpdCA9IHJiZWdpbihkaW1lbnNpb25zKSwgZW5kID0gcmVuZChkaW1lbnNpb25zKTsgaXQgIT0gZW5kOyBpdCsrKSB7CisgICAgICAgIHJ1c3RfbmFtZSA9ICJbIiArIHJ1c3RfbmFtZSArICI7ICIgKyBzdGQ6OnRvX3N0cmluZygqaXQpICsgIl0iOworICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBydXN0X25hbWUgPSAiVmVjPCIgKyBydXN0X25hbWUgKyAiPiI7CiAgICAgfQpAQCAtMTgwLDIwICsyNTMsMjQgQEAKICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGU6OklOX0FSR1VNRU5UIHx8IG1vZGUgPT0gU3RvcmFnZU1vZGU6OlVOU0laRURfQVJHVU1FTlQpIHsKICAgICAvLyBJZiB0aGlzIGlzIGEgbnVsbGFibGUgaW5wdXQgYXJndW1lbnQsIHB1dCB0aGUgcmVmZXJlbmNlIGluc2lkZSB0aGUgb3B0aW9uLAogICAgIC8vIGUuZy4sIGBPcHRpb248JnN0cj5gIGluc3RlYWQgb2YgYCZPcHRpb248c3RyPmAKLSAgICBydXN0X25hbWUgPSAiJiIgKyBydXN0X25hbWU7CisgICAgcnVzdF9uYW1lID0gIiYiICsgUnVzdExpZmV0aW1lTmFtZShsaWZldGltZSkgKyBydXN0X25hbWU7CiAgIH0KIAogICBpZiAodHlwZS5Jc051bGxhYmxlKCkgfHwKICAgICAgIC8vIFNvbWUgdHlwZXMgZG9uJ3QgaW1wbGVtZW50IERlZmF1bHQsIHNvIHdlIHdyYXAgdGhlbQogICAgICAgLy8gaW4gT3B0aW9uLCB3aGljaCBkZWZhdWx0cyB0byBOb25lCi0gICAgICAoIVR5cGVIYXNEZWZhdWx0KHR5cGUsIHR5cGVuYW1lcykgJiYKKyAgICAgIChUeXBlTmVlZHNPcHRpb24odHlwZSwgdHlwZW5hbWVzKSAmJgogICAgICAgIChtb2RlID09IFN0b3JhZ2VNb2RlOjpERUZBVUxUX1ZBTFVFIHx8IG1vZGUgPT0gU3RvcmFnZU1vZGU6Ok9VVF9BUkdVTUVOVCB8fAogICAgICAgICBtb2RlID09IFN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxEKSkpIHsKLSAgICBydXN0X25hbWUgPSAiT3B0aW9uPCIgKyBydXN0X25hbWUgKyAiPiI7CisgICAgaWYgKHR5cGUuSXNIZWFwTnVsbGFibGUoKSkgeworICAgICAgcnVzdF9uYW1lID0gIk9wdGlvbjxCb3g8IiArIHJ1c3RfbmFtZSArICI+PiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ1c3RfbmFtZSA9ICJPcHRpb248IiArIHJ1c3RfbmFtZSArICI+IjsKKyAgICB9CiAgIH0KIAogICBpZiAobW9kZSA9PSBTdG9yYWdlTW9kZTo6T1VUX0FSR1VNRU5UIHx8IG1vZGUgPT0gU3RvcmFnZU1vZGU6OklOT1VUX0FSR1VNRU5UKSB7Ci0gICAgcnVzdF9uYW1lID0gIiZtdXQgIiArIHJ1c3RfbmFtZTsKKyAgICBydXN0X25hbWUgPSAiJiIgKyBSdXN0TGlmZXRpbWVOYW1lKGxpZmV0aW1lKSArICJtdXQgIiArIHJ1c3RfbmFtZTsKICAgfQogCiAgIHJldHVybiBydXN0X25hbWU7CkBAIC0yMDksOSArMjg2LDkgQEAKIAogICBjb25zdCBib29sIGlzRW51bSA9IGRlZmluZWRUeXBlICYmIGRlZmluZWRUeXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHI7CiAgIGNvbnN0IGJvb2wgaXNQcmltaXRpdmUgPSBBaWRsVHlwZW5hbWVzOjpJc1ByaW1pdGl2ZVR5cGVuYW1lKHR5cGVOYW1lKTsKLSAgaWYgKHR5cGVOYW1lID09ICJTdHJpbmciIHx8IGFyZy5HZXRUeXBlKCkuSXNBcnJheSgpIHx8IHR5cGVuYW1lcy5Jc0xpc3QoYXJnLkdldFR5cGUoKSkpIHsKKyAgaWYgKHR5cGVOYW1lID09ICJTdHJpbmciIHx8IGFyZy5HZXRUeXBlKCkuSXNEeW5hbWljQXJyYXkoKSB8fCB0eXBlbmFtZXMuSXNMaXN0KGFyZy5HZXRUeXBlKCkpKSB7CiAgICAgcmV0dXJuIFN0b3JhZ2VNb2RlOjpVTlNJWkVEX0FSR1VNRU5UOwotICB9IGVsc2UgaWYgKCEoaXNQcmltaXRpdmUgfHwgaXNFbnVtKSkgeworICB9IGVsc2UgaWYgKCEoaXNQcmltaXRpdmUgfHwgaXNFbnVtKSB8fCBhcmcuR2V0VHlwZSgpLklzRml4ZWRTaXplQXJyYXkoKSkgewogICAgIHJldHVybiBTdG9yYWdlTW9kZTo6SU5fQVJHVU1FTlQ7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIFN0b3JhZ2VNb2RlOjpWQUxVRTsKQEAgLTI3MSwzMCArMzQ4LDM1IEBACiAgIHJldHVybiBkZWZpbmVkVHlwZSAhPSBudWxscHRyICYmIGRlZmluZWRUeXBlLT5Bc0ludGVyZmFjZSgpICE9IG51bGxwdHI7CiB9CiAKLWJvb2wgVHlwZUhhc0RlZmF1bHQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworYm9vbCBUeXBlTmVlZHNPcHRpb24oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBpZiAodHlwZS5Jc0FycmF5KCkgfHwgdHlwZW5hbWVzLklzTGlzdCh0eXBlKSkgewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIC8vIEFscmVhZHkgYW4gT3B0aW9uPFQ+CiAgIGlmICh0eXBlLklzTnVsbGFibGUoKSkgewotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIGNvbnN0IHN0cmluZyYgYWlkbF9uYW1lID0gdHlwZS5HZXROYW1lKCk7CiAgIGlmIChhaWRsX25hbWUgPT0gIklCaW5kZXIiKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwogICB9CiAgIGlmIChhaWRsX25hbWUgPT0gIlBhcmNlbEZpbGVEZXNjcmlwdG9yIikgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChhaWRsX25hbWUgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7CisgICAgLy8gUGFyY2VsYWJsZUhvbGRlciBuZXZlciBuZWVkcyBhbiBPcHRpb24gYmVjYXVzZSB3ZSBhbHdheXMKKyAgICAvLyBjYWxsIGl0cyBuZXcoKSBjb25zdHJ1Y3RvciBkaXJlY3RseSBpbnN0ZWFkIG9mIGRlZmF1bHQoKQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIC8vIFN0cm9uZzxkeW4gSUZvbz4gdmFsdWVzIGRvbid0IGltcGxlbWVudCBEZWZhdWx0CiAgIGlmIChUeXBlSXNJbnRlcmZhY2UodHlwZSwgdHlwZW5hbWVzKSkgewotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBydXN0CmRpZmYgLS1naXQgYS9haWRsX3RvX3J1c3QuaCBiL2FpZGxfdG9fcnVzdC5oCmluZGV4IDI5MmU0ZGYuLjhhNDlhNTYgMTAwNjQ0Ci0tLSBhL2FpZGxfdG9fcnVzdC5oCisrKyBiL2FpZGxfdG9fcnVzdC5oCkBAIC00Miw2ICs0MiwxMSBAQAogICBBU19ERVJFRiwKIH07CiAKK2VudW0gY2xhc3MgTGlmZXRpbWUgeworICBOT05FLAorICBBLAorfTsKKwogaW5saW5lIGJvb2wgSXNSZWZlcmVuY2UoUmVmZXJlbmNlTW9kZSByZWZfbW9kZSkgewogICBzd2l0Y2ggKHJlZl9tb2RlKSB7CiAgICAgY2FzZSBSZWZlcmVuY2VNb2RlOjpSRUY6CkBAIC01MywxNCArNTgsMjkgQEAKICAgfQogfQogCi1zdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3IoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpOwogCi1zdGQ6OnN0cmluZyBDb25zdGFudFZhbHVlRGVjb3JhdG9yUmVmKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3ZhbHVlKTsKK3N0ZDo6c3RyaW5nIENvbnN0YW50VmFsdWVEZWNvcmF0b3JSZWYoCisgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsCisgICAgY29uc3Qgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+JiByYXdfdmFsdWUpOworCitzdGQ6OnN0cmluZyBBcnJheURlZmF1bHRWYWx1ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSk7CisKKy8vIFJldHVybnMgIidsaWZldGltZV9uYW1lICIgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGFwb3N0cm9waGUgYW5kIHRoZSB0cmFpbGluZyBzcGFjZS4KKy8vIFJldHVybnMgZW1wdHkgc3RyaW5nIGZvciBOT05FLgorc3RkOjpzdHJpbmcgUnVzdExpZmV0aW1lTmFtZShMaWZldGltZSBsaWZldGltZSk7CisKKy8vIFJldHVybnMgIjwnbGlmZXRpbWVfbmFtZT4iIG9yIGVtcHR5IHN0cmluZyBmb3IgTk9ORS4KK3N0ZDo6c3RyaW5nIFJ1c3RMaWZldGltZUdlbmVyaWMoTGlmZXRpbWUgbGlmZXRpbWUpOwogCiAvLyBSZXR1cm5zIHRoZSBSdXN0IHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBBSURMIHR5cGUgc3BlYwogLy8gVGhpcyBpbmNsdWRlcyBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyB3aXRoIGFycmF5IG1vZGlmaWVycy4KKy8vCisvLyBUaGUgbGlmZXRpbWUgYXJndW1lbnQgaXMgdXNlZCB0byBhbm5vdGF0ZSBhbGwgcmVmZXJlbmNlcy4KIHN0ZDo6c3RyaW5nIFJ1c3ROYW1lT2YoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIGFpZGwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZU1vZGUgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VNb2RlIG1vZGUsIExpZmV0aW1lIGxpZmV0aW1lKTsKIAogU3RvcmFnZU1vZGUgQXJndW1lbnRTdG9yYWdlTW9kZShjb25zdCBBaWRsQXJndW1lbnQmIGFyZywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKIApAQCAtNzAsNyArOTAsNyBAQAogCiBib29sIFR5cGVJc0ludGVyZmFjZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKIAotYm9vbCBUeXBlSGFzRGVmYXVsdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKK2Jvb2wgVHlwZU5lZWRzT3B0aW9uKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOwogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2FpZGxfdHlwZW5hbWVzLmNwcCBiL2FpZGxfdHlwZW5hbWVzLmNwcAppbmRleCA4NDQwNDYzLi42N2RhNGU3IDEwMDY0NAotLS0gYS9haWRsX3R5cGVuYW1lcy5jcHAKKysrIGIvYWlkbF90eXBlbmFtZXMuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZS5oIgogI2luY2x1ZGUgImxvZ2dpbmcuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KIAogI2luY2x1ZGUgPG1hcD4KQEAgLTEwMyw0MyArMTA0LDg3IEBACiB9CiAKIGJvb2wgQWlkbFR5cGVuYW1lczo6SXNJZ25vcmFibGVJbXBvcnQoY29uc3Qgc3RyaW5nJiBpbXBvcnQpIGNvbnN0IHsKKyAgaWYgKElzQnVpbHRpblR5cGVuYW1lKGltcG9ydCkpIHJldHVybiB0cnVlOworCiAgIHN0YXRpYyBzZXQ8c3RyaW5nPiBpZ25vcmVfaW1wb3J0ID0gewogICAgICAgImFuZHJvaWQub3MuSUludGVyZmFjZSIsICAgImFuZHJvaWQub3MuSUJpbmRlciIsICJhbmRyb2lkLm9zLlBhcmNlbGFibGUiLCAiYW5kcm9pZC5vcy5QYXJjZWwiLAogICAgICAgImFuZHJvaWQuY29udGVudC5Db250ZXh0IiwgImphdmEubGFuZy5TdHJpbmciLCAgICJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIn07CiAgIC8vIHRoZXNlIGtub3duIGJ1aWx0LWluIHR5cGVzIGRvbid0IG5lZWQgdG8gYmUgaW1wb3J0ZWQKLSAgY29uc3QgYm9vbCBpbl9pZ25vcmVfaW1wb3J0ID0gaWdub3JlX2ltcG9ydC5maW5kKGltcG9ydCkgIT0gaWdub3JlX2ltcG9ydC5lbmQoKTsKLSAgLy8gYW4gYWxyZWFkeSBkZWZpbmVkIHR5cGUgZG9lc24ndCBuZWVkIHRvIGJlIGltcG9ydGVkIGFnYWluIHVubGVzcyBpdCBpcyBmcm9tCi0gIC8vIHRoZSBwcmVwcm9jZXNzZWQgZmlsZQotICBhdXRvIHJldCA9IFRyeUdldERlZmluZWRUeXBlSW1wbChpbXBvcnQpOwotICBjb25zdCBib29sIGRlZmluZWRfdHlwZV9ub3RfZnJvbV9wcmVwcm9jZXNzZWQgPSByZXQudHlwZSAhPSBudWxscHRyICYmICFyZXQuZnJvbV9wcmVwcm9jZXNzZWQ7Ci0gIHJldHVybiBpbl9pZ25vcmVfaW1wb3J0IHx8IGRlZmluZWRfdHlwZV9ub3RfZnJvbV9wcmVwcm9jZXNzZWQ7CisgIGlmIChpZ25vcmVfaW1wb3J0LmZpbmQoaW1wb3J0KSAhPSBpZ25vcmVfaW1wb3J0LmVuZCgpKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoVHJ5R2V0RGVmaW5lZFR5cGUoaW1wb3J0KSkgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBBZGQgYSBwYXJzZWQgZG9jdW1lbnQgYW5kIHBvcHVsYXRlIHR5cGUgbmFtZXMgaW4gaXQuCisvLyBOYW1lIGNvbmZsaWN0IGlzIGFuIGVycm9yIHVubGVzcyBvbmUgb2YgdGhlbSBpcyBmcm9tIHByZXByb2Nlc3NlZC4KKy8vIEZvciBsZWdhY3ksIHdlIHBvcHVsYXRlIHVucXVhbGlmaWVkIG5hbWVzIGZyb20gcHJlcHJvY2Vzc2VkIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlIHR5cGVzCisvLyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlZmVyZW5jZWQgdmlhIGEgc2ltcGxlIG5hbWUuCiBib29sIEFpZGxUeXBlbmFtZXM6OkFkZERvY3VtZW50KHN0ZDo6dW5pcXVlX3B0cjxBaWRsRG9jdW1lbnQ+IGRvYykgewotICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiBkb2MtPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgaWYgKGRlZmluZWRfdHlwZXNfLmZpbmQodHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpKSAhPSBkZWZpbmVkX3R5cGVzXy5lbmQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIUhhc1ZhbGlkTmFtZUNvbXBvbmVudHMoKnR5cGUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGRvY3VtZW50c18ucHVzaF9iYWNrKHN0ZDo6bW92ZShkb2MpKTsKLSAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogZG9jdW1lbnRzXy5iYWNrKCktPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgZGVmaW5lZF90eXBlc18uZW1wbGFjZSh0eXBlLT5HZXRDYW5vbmljYWxOYW1lKCksIHR5cGUuZ2V0KCkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQorICBib29sIGlzX3ByZXByb2Nlc3NlZCA9IGRvYy0+SXNQcmVwcm9jZXNzZWQoKTsKKyAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gdHlwZXNfdG9fYWRkOworICAvLyBBZGQgdHlwZXMgaW4gdHdvIHN0ZXBzIHRvIGF2b2lkIGFkZGluZyBhIHR5cGUgd2hpbGUgdGhlIGRvYyBpcyByZWplY3RlZC4KKyAgLy8gMS4gZmlsdGVyIHR5cGVzIHRvIGFkZAorICAvLyAyLiBhZGQgdHlwZXMKIAotY29uc3QgQWlkbERvY3VtZW50KiBBaWRsVHlwZW5hbWVzOjpHZXREb2N1bWVudEZvcihjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHR5cGUpIGNvbnN0IHsKLSAgZm9yIChjb25zdCBhdXRvJiBkb2MgOiBBbGxEb2N1bWVudHMoKSkgewotICAgIGZvciAoY29uc3QgYXV0byYgZGVmaW5lZF90eXBlIDogZG9jLT5EZWZpbmVkVHlwZXMoKSkgewotICAgICAgaWYgKGRlZmluZWRfdHlwZS5nZXQoKSA9PSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBkb2MuZ2V0KCk7CisgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4mKT4gY29sbGVjdF90eXBlc190b19hZGQ7CisgIGNvbGxlY3RfdHlwZXNfdG9fYWRkID0gWyZdKGF1dG8mIHR5cGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogdHlwZXMpIHsKKyAgICAgIGlmIChJc0J1aWx0aW5UeXBlbmFtZSh0eXBlLT5HZXROYW1lKCkpKSB7CisgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGlzIHRyZWF0ZWQgYXMgYSBidWlsdC1pbiB0eXBlLCBidXQgaXQncyBhbHNvIGluIHRoZSBmcmFtZXdvcmsuYWlkbC4KKyAgICAgICAgLy8gU28gYWlkbCBzaG91bGQgaWdub3JlIGJ1aWx0LWluIHR5cGVzIGluIGZyYW1ld29yay5haWRsIHRvIHByZXZlbnQgZHVwbGljYXRpb24uCisgICAgICAgIC8vIChiLzEzMDg5OTQ5MSkKKyAgICAgICAgaWYgKGlzX3ByZXByb2Nlc3NlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIEhhc1ZhbGlkTmFtZUNvbXBvbmVudHMgaGFuZGxlcyBuYW1lIGNvbmZsaWN0cyB3aXRoIGJ1aWx0LWluIHR5cGVzCisgICAgICB9CisKKyAgICAgIGlmIChhdXRvIHByZXZfZGVmaW5pdGlvbiA9IGRlZmluZWRfdHlwZXNfLmZpbmQodHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICBwcmV2X2RlZmluaXRpb24gIT0gZGVmaW5lZF90eXBlc18uZW5kKCkpIHsKKyAgICAgICAgLy8gU2tpcCBkdXBsaWNhdGUgdHlwZSBpbiBwcmVwcm9jZXNzZWQgZG9jdW1lbnQKKyAgICAgICAgaWYgKGlzX3ByZXByb2Nlc3NlZCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE92ZXJ3cml0ZSBkdXBsaWNhdGUgdHlwZSB3aGljaCBpcyBhbHJlYWR5IGFkZGVkIHZpYSBwcmVwcm9jZXNzZWQgd2l0aCBhIG5ldyBvbmUKKyAgICAgICAgaWYgKCFwcmV2X2RlZmluaXRpb24tPnNlY29uZC0+R2V0RG9jdW1lbnQoKS5Jc1ByZXByb2Nlc3NlZCgpKSB7CisgICAgICAgICAgQUlETF9FUlJPUih0eXBlKSA8PCAicmVkZWZpbml0aW9uOiAiIDw8IHR5cGUtPkdldENhbm9uaWNhbE5hbWUoKSA8PCAiIGlzIGRlZmluZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJldl9kZWZpbml0aW9uLT5zZWNvbmQtPkdldExvY2F0aW9uKCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghSGFzVmFsaWROYW1lQ29tcG9uZW50cygqdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0eXBlc190b19hZGQucHVzaF9iYWNrKHR5cGUuZ2V0KCkpOworCisgICAgICAvLyByZWN1cnNpdmVseSBjaGVjayBuZXN0ZWQgdHlwZXMKKyAgICAgIGlmICghY29sbGVjdF90eXBlc190b19hZGQodHlwZS0+R2V0TmVzdGVkVHlwZXMoKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKKworICBpZiAoIWNvbGxlY3RfdHlwZXNfdG9fYWRkKGRvYy0+RGVmaW5lZFR5cGVzKCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIHJldHVybiBudWxscHRyOworCisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVzX3RvX2FkZCkgeworICAgIC8vIHBvcHVsYXRlIGdsb2JhbCAndHlwZScgbmFtZXNwYWNlIHdpdGggZnVsbHktcXVhbGlmaWVkIG5hbWVzCisgICAgZGVmaW5lZF90eXBlc18uZW1wbGFjZSh0eXBlLT5HZXRDYW5vbmljYWxOYW1lKCksIHR5cGUpOworICAgIC8vIHByZXByb2Nlc3NlZCB1bnN0cnVjdHVyZWQgcGFyY2VsYWJsZSB0eXBlcyBjYW4gYmUgcmVmZXJlbmNlZCB3aXRob3V0IHF1YWxpZmljYXRpb24KKyAgICBpZiAoaXNfcHJlcHJvY2Vzc2VkICYmIHR5cGUtPkFzVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpKSB7CisgICAgICBkZWZpbmVkX3R5cGVzXy5lbXBsYWNlKHR5cGUtPkdldE5hbWUoKSwgdHlwZSk7CisgICAgfQorICB9CisKKyAgLy8gdHJhbnNmZXIgb3duZXJzaGlwIG9mIGRvY3VtZW50CisgIGRvY3VtZW50c18ucHVzaF9iYWNrKHN0ZDo6bW92ZShkb2MpKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGNvbnN0IEFpZGxEb2N1bWVudCYgQWlkbFR5cGVuYW1lczo6TWFpbkRvY3VtZW50KCkgY29uc3QgewpAQCAtMTQ3LDE4ICsxOTIsNiBAQAogICByZXR1cm4gKihkb2N1bWVudHNfWzBdKTsKIH0KIAotYm9vbCBBaWRsVHlwZW5hbWVzOjpBZGRQcmVwcm9jZXNzZWRUeXBlKHVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPiB0eXBlKSB7Ci0gIGNvbnN0IHN0cmluZyBuYW1lID0gdHlwZS0+R2V0Q2Fub25pY2FsTmFtZSgpOwotICBpZiAocHJlcHJvY2Vzc2VkX3R5cGVzXy5maW5kKG5hbWUpICE9IHByZXByb2Nlc3NlZF90eXBlc18uZW5kKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFIYXNWYWxpZE5hbWVDb21wb25lbnRzKCp0eXBlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwcmVwcm9jZXNzZWRfdHlwZXNfLmluc2VydChtYWtlX3BhaXIobmFtZSwgc3RkOjptb3ZlKHR5cGUpKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCiBib29sIEFpZGxUeXBlbmFtZXM6OklzQnVpbHRpblR5cGVuYW1lKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7CiAgIHJldHVybiBrQnVpbHRpblR5cGVzLmZpbmQodHlwZV9uYW1lKSAhPSBrQnVpbHRpblR5cGVzLmVuZCgpIHx8CiAgICAgICBrSmF2YUxpa2VUeXBlVG9BaWRsVHlwZS5maW5kKHR5cGVfbmFtZSkgIT0ga0phdmFMaWtlVHlwZVRvQWlkbFR5cGUuZW5kKCk7CkBAIC0xNzksNDUgKzIxMiwyMyBAQAogfQogCiBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIEFpZGxUeXBlbmFtZXM6OlRyeUdldERlZmluZWRUeXBlKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSBjb25zdCB7Ci0gIHJldHVybiBUcnlHZXREZWZpbmVkVHlwZUltcGwodHlwZV9uYW1lKS50eXBlOwotfQotCi1BaWRsVHlwZW5hbWVzOjpEZWZpbmVkSW1wbFJlc3VsdCBBaWRsVHlwZW5hbWVzOjpUcnlHZXREZWZpbmVkVHlwZUltcGwoCi0gICAgY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0IHsKLSAgLy8gRG8gdGhlIGV4YWN0IG1hdGNoIGZpcnN0LgogICBhdXRvIGZvdW5kX2RlZiA9IGRlZmluZWRfdHlwZXNfLmZpbmQodHlwZV9uYW1lKTsKICAgaWYgKGZvdW5kX2RlZiAhPSBkZWZpbmVkX3R5cGVzXy5lbmQoKSkgewotICAgIHJldHVybiBEZWZpbmVkSW1wbFJlc3VsdChmb3VuZF9kZWYtPnNlY29uZCwgZmFsc2UpOworICAgIHJldHVybiBmb3VuZF9kZWYtPnNlY29uZDsKICAgfQotCi0gIGF1dG8gZm91bmRfcHJlcCA9IHByZXByb2Nlc3NlZF90eXBlc18uZmluZCh0eXBlX25hbWUpOwotICBpZiAoZm91bmRfcHJlcCAhPSBwcmVwcm9jZXNzZWRfdHlwZXNfLmVuZCgpKSB7Ci0gICAgcmV0dXJuIERlZmluZWRJbXBsUmVzdWx0KGZvdW5kX3ByZXAtPnNlY29uZC5nZXQoKSwgdHJ1ZSk7Ci0gIH0KLQotICAvLyBUaGVuIG1hdGNoIHdpdGggdGhlIGNsYXNzIG5hbWUuIERlZmluZWQgdHlwZXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuCi0gIC8vIHR5cGVzIGZyb20gdGhlIHByZXByb2Nlc3NlZCBmaWxlLgotICBmb3IgKGF1dG8gaXQgPSBkZWZpbmVkX3R5cGVzXy5iZWdpbigpOyBpdCAhPSBkZWZpbmVkX3R5cGVzXy5lbmQoKTsgaXQrKykgewotICAgIGlmIChpdC0+c2Vjb25kLT5HZXROYW1lKCkgPT0gdHlwZV9uYW1lKSB7Ci0gICAgICByZXR1cm4gRGVmaW5lZEltcGxSZXN1bHQoaXQtPnNlY29uZCwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGZvciAoYXV0byBpdCA9IHByZXByb2Nlc3NlZF90eXBlc18uYmVnaW4oKTsgaXQgIT0gcHJlcHJvY2Vzc2VkX3R5cGVzXy5lbmQoKTsgaXQrKykgewotICAgIGlmIChpdC0+c2Vjb25kLT5HZXROYW1lKCkgPT0gdHlwZV9uYW1lKSB7Ci0gICAgICByZXR1cm4gRGVmaW5lZEltcGxSZXN1bHQoaXQtPnNlY29uZC5nZXQoKSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIERlZmluZWRJbXBsUmVzdWx0KG51bGxwdHIsIGZhbHNlKTsKKyAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0ZDo6dmVjdG9yPEFpZGxEZWZpbmVkVHlwZSo+IEFpZGxUeXBlbmFtZXM6OkFsbERlZmluZWRUeXBlcygpIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gcmVzOwotICBmb3IgKGNvbnN0IGF1dG8mIGQgOiBBbGxEb2N1bWVudHMoKSkgewotICAgIGZvciAoY29uc3QgYXV0byYgdCA6IGQtPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgICByZXMucHVzaF9iYWNrKHQuZ2V0KCkpOwotICAgIH0KK3N0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IEFpZGxUeXBlbmFtZXM6OkFsbERlZmluZWRUeXBlcygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQWlkbERlZmluZWRUeXBlKj4gcmVzOworICBmb3IgKGNvbnN0IGF1dG8mIGRvYyA6IEFsbERvY3VtZW50cygpKSB7CisgICAgVmlzaXRUb3BEb3duKAorICAgICAgICBbJl0oY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgICAgICAgICBpZiAoYXV0byBkZWZpbmVkX3R5cGUgPSBBaWRsQ2FzdDxBaWRsRGVmaW5lZFR5cGU+KG5vZGUpOyBkZWZpbmVkX3R5cGUpIHsKKyAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soZGVmaW5lZF90eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICpkb2MpOwogICB9CiAgIHJldHVybiByZXM7CiB9CkBAIC0yMzgsNiArMjQ5LDIwIEBACiAgIH0KIH0KIAorc3RkOjp1bmlxdWVfcHRyPEFpZGxUeXBlU3BlY2lmaWVyPiBBaWRsVHlwZW5hbWVzOjpNYWtlUmVzb2x2ZWRUeXBlKGNvbnN0IEFpZGxMb2NhdGlvbiYgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJyYXkpIGNvbnN0IHsKKyAgc3RkOjpvcHRpb25hbDxBcnJheVR5cGU+IGFycmF5OworICBpZiAoaXNfYXJyYXkpIHsKKyAgICBhcnJheSA9IER5bmFtaWNBcnJheXt9OworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsVHlwZVNwZWNpZmllcj4gdHlwZSgKKyAgICAgIG5ldyBBaWRsVHlwZVNwZWNpZmllcihsb2NhdGlvbiwgbmFtZSwgc3RkOjptb3ZlKGFycmF5KSwgbnVsbHB0ciwge30pKTsKKyAgQUlETF9GQVRBTF9JRighdHlwZS0+UmVzb2x2ZSgqdGhpcywgbnVsbHB0ciksIHR5cGUpIDw8ICJDYW4ndCBtYWtlIHVua25vd24gdHlwZTogIiA8PCBuYW1lOworICB0eXBlLT5NYXJrVmlzaXRlZCgpOworICByZXR1cm4gdHlwZTsKK30KKwogLy8gT25seSBpbW11dGFibGUgUGFyY2VsYWJsZSwgcHJpbWl0aXZlIHR5cGUsIGFuZCBTdHJpbmcsIGFuZCBMaXN0LCBNYXAsIGFycmF5IG9mIHRoZSB0eXBlcyBjYW4gYmUKIC8vIGltbXV0YWJsZS4KIGJvb2wgQWlkbFR5cGVuYW1lczo6Q2FuQmVKYXZhT25seUltbXV0YWJsZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgY29uc3QgewpAQCAtMjY2LDEwICsyOTEsMTYgQEAKICAgcmV0dXJuIHQtPklzSmF2YU9ubHlJbW11dGFibGUoKTsKIH0KIAotLy8gT25seSBGaXhlZFNpemUgUGFyY2VsYWJsZSwgcHJpbWl0aXZlIHR5cGVzLCBhbmQgZW51bSB0eXBlcyBjYW4gYmUgRml4ZWRTaXplLgorLy8gRm9sbG93aW5ncyBjYW4gYmUgRml4ZWRTaXplOgorLy8gLSBARml4ZWRTaXplIHBhcmNlbGFibGVzCisvLyAtIHByaW1pdGl2ZSB0eXBlcyBhbmQgZW51bSB0eXBlcworLy8gLSBmaXhlZC1zaXplIGFycmF5cyBvZiBGaXhlZFNpemUgdHlwZXMKIGJvb2wgQWlkbFR5cGVuYW1lczo6Q2FuQmVGaXhlZFNpemUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIGNvbnN0IHsKICAgY29uc3Qgc3RyaW5nJiBuYW1lID0gdHlwZS5HZXROYW1lKCk7Ci0gIGlmICh0eXBlLklzR2VuZXJpYygpIHx8IHR5cGUuSXNBcnJheSgpKSB7CisgIGlmICh0eXBlLklzR2VuZXJpYygpIHx8IHR5cGUuSXNOdWxsYWJsZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh0eXBlLklzQXJyYXkoKSAmJiAhdHlwZS5Jc0ZpeGVkU2l6ZUFycmF5KCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgaWYgKElzUHJpbWl0aXZlVHlwZW5hbWUobmFtZSkpIHsKQEAgLTM2Myw5ICszOTQsNiBAQAogICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogZGVmaW5lZF90eXBlc18pIHsKICAgICBib2R5KCprdi5zZWNvbmQpOwogICB9Ci0gIGZvciAoY29uc3QgYXV0byYga3YgOiBwcmVwcm9jZXNzZWRfdHlwZXNfKSB7Ci0gICAgYm9keSgqa3Yuc2Vjb25kKTsKLSAgfQogfQogCiBib29sIEFpZGxUeXBlbmFtZXM6OkF1dG9maWxsKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvYWlkbF90eXBlbmFtZXMuaCBiL2FpZGxfdHlwZW5hbWVzLmgKaW5kZXggZjg2ZjE1OC4uOWFlODUxZCAxMDA2NDQKLS0tIGEvYWlkbF90eXBlbmFtZXMuaAorKysgYi9haWRsX3R5cGVuYW1lcy5oCkBAIC0zNSw2ICszNSw3IEBACiBjbGFzcyBBaWRsRGVmaW5lZFR5cGU7CiBjbGFzcyBBaWRsRW51bURlY2xhcmF0aW9uOwogY2xhc3MgQWlkbEludGVyZmFjZTsKK2NsYXNzIEFpZGxMb2NhdGlvbjsKIGNsYXNzIEFpZGxQYXJjZWxhYmxlOwogY2xhc3MgQWlkbFR5cGVTcGVjaWZpZXI7CiBjbGFzcyBBaWRsRG9jdW1lbnQ7CkBAIC01OCwxNSArNTksMTMgQEAKICBwdWJsaWM6CiAgIEFpZGxUeXBlbmFtZXMoKSA9IGRlZmF1bHQ7CiAgIGJvb2wgQWRkRG9jdW1lbnQoc3RkOjp1bmlxdWVfcHRyPEFpZGxEb2N1bWVudD4gZG9jKTsKLSAgY29uc3QgQWlkbERvY3VtZW50KiBHZXREb2N1bWVudEZvcihjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHR5cGUpIGNvbnN0OwogICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERvY3VtZW50Pj4mIEFsbERvY3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIGRvY3VtZW50c187IH0KICAgY29uc3QgQWlkbERvY3VtZW50JiBNYWluRG9jdW1lbnQoKSBjb25zdDsKLSAgYm9vbCBBZGRQcmVwcm9jZXNzZWRUeXBlKHVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPiB0eXBlKTsKICAgc3RhdGljIGJvb2wgSXNCdWlsdGluVHlwZW5hbWUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpOwogICBzdGF0aWMgYm9vbCBJc1ByaW1pdGl2ZVR5cGVuYW1lKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKTsKICAgYm9vbCBJc1BhcmNlbGFibGUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0OwogICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIFRyeUdldERlZmluZWRUeXBlKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSBjb25zdDsKLSAgc3RkOjp2ZWN0b3I8QWlkbERlZmluZWRUeXBlKj4gQWxsRGVmaW5lZFR5cGVzKCkgY29uc3Q7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IEFsbERlZmluZWRUeXBlcygpIGNvbnN0OwogCiAgIHN0cnVjdCBSZXNvbHZlZFR5cGVuYW1lIHsKICAgICBzdGQ6OnN0cmluZyBjYW5vbmljYWxfbmFtZTsKQEAgLTc0LDYgKzczLDggQEAKICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZTsKICAgfTsKICAgUmVzb2x2ZWRUeXBlbmFtZSBSZXNvbHZlVHlwZW5hbWUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+IE1ha2VSZXNvbHZlZFR5cGUoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBpc19hcnJheSkgY29uc3Q7CiAgIEFyZ3VtZW50QXNwZWN0IEdldEFyZ3VtZW50QXNwZWN0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSBjb25zdDsKICAgYm9vbCBDYW5CZUphdmFPbmx5SW1tdXRhYmxlKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSBjb25zdDsKICAgYm9vbCBDYW5CZUZpeGVkU2l6ZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgY29uc3Q7CkBAIC04OSwyMSArOTAsMTMgQEAKICAgLy8gUmV0dXJucyB0aGUgQWlkbFBhcmNlbGFibGUgb2YgdGhlIGdpdmVuIHR5cGUsIG9yIG51bGxwdHIgaWYgdGhlIHR5cGUKICAgLy8gaXMgbm90IGFuIEFpZGxQYXJjZWxhYmxlOwogICBjb25zdCBBaWRsUGFyY2VsYWJsZSogR2V0UGFyY2VsYWJsZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgY29uc3Q7Ci0gIC8vIEl0ZXJhdGVzIG92ZXIgYWxsIGRlZmluZWQgYW5kIHRoZW4gcHJlcHJvY2Vzc2VkIHR5cGVzCisgIC8vIEl0ZXJhdGVzIG92ZXIgYWxsIGRlZmluZWQgdHlwZXMKICAgdm9pZCBJdGVyYXRlVHlwZXMoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYpPiYgYm9keSkgY29uc3Q7CiAgIC8vIEZpeGVzIEFTVCBhZnRlciB0eXBlL3JlZiByZXNvbHV0aW9uIGJlZm9yZSB2YWxpZGF0aW9uCiAgIGJvb2wgQXV0b2ZpbGwoKSBjb25zdDsKIAogIHByaXZhdGU6Ci0gIHN0cnVjdCBEZWZpbmVkSW1wbFJlc3VsdCB7Ci0gICAgRGVmaW5lZEltcGxSZXN1bHQoY29uc3QgQWlkbERlZmluZWRUeXBlKiB0eXBlLCBjb25zdCBib29sIGZyb21fcHJlcHJvY2Vzc2VkKQotICAgICAgICA6IHR5cGUodHlwZSksIGZyb21fcHJlcHJvY2Vzc2VkKGZyb21fcHJlcHJvY2Vzc2VkKSB7fQotICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogdHlwZTsKLSAgICBjb25zdCBib29sIGZyb21fcHJlcHJvY2Vzc2VkOwotICB9OwotICBEZWZpbmVkSW1wbFJlc3VsdCBUcnlHZXREZWZpbmVkVHlwZUltcGwoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIGNvbnN0OwogICBtYXA8c3RyaW5nLCBBaWRsRGVmaW5lZFR5cGUqPiBkZWZpbmVkX3R5cGVzXzsKLSAgbWFwPHN0cmluZywgdW5pcXVlX3B0cjxBaWRsRGVmaW5lZFR5cGU+PiBwcmVwcm9jZXNzZWRfdHlwZXNfOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERvY3VtZW50Pj4gZG9jdW1lbnRzXzsKIH07CiAKZGlmZiAtLWdpdCBhL2FpZGxfdW5pdHRlc3QuY3BwIGIvYWlkbF91bml0dGVzdC5jcHAKaW5kZXggZjgyNWNmZC4uNWE5NzVmZSAxMDA2NDQKLS0tIGEvYWlkbF91bml0dGVzdC5jcHAKKysrIGIvYWlkbF91bml0dGVzdC5jcHAKQEAgLTI1LDI2ICsyNSwzMSBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYWlkbF9jaGVja2FwaS5oIgogI2luY2x1ZGUgImFpZGxfZHVtcGFwaS5oIgogI2luY2x1ZGUgImFpZGxfbGFuZ3VhZ2UuaCIKICNpbmNsdWRlICJhaWRsX3RvX2NwcC5oIgorI2luY2x1ZGUgImFpZGxfdG9fY3BwX2NvbW1vbi5oIgogI2luY2x1ZGUgImFpZGxfdG9famF2YS5oIgogI2luY2x1ZGUgImFpZGxfdG9fbmRrLmgiCisjaW5jbHVkZSAiYWlkbF90b19ydXN0LmgiCiAjaW5jbHVkZSAiY29tbWVudHMuaCIKICNpbmNsdWRlICJsb2dnaW5nLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInByZXByb2Nlc3MuaCIKICNpbmNsdWRlICJ0ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmgiCiAKLXVzaW5nIGFuZHJvaWQ6OmFpZGw6OmludGVybmFsczo6cGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGU7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0OjpGYWtlSW9EZWxlZ2F0ZTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIHN0ZDo6bWFwOwogdXNpbmcgc3RkOjpzZXQ7CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKK3VzaW5nIHN0ZDo6dmFyaWFudDsKIHVzaW5nIHN0ZDo6dmVjdG9yOwogdXNpbmcgdGVzdGluZzo6SGFzU3Vic3RyOwogdXNpbmcgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzsKQEAgLTkxLDYgKzk2LDcgQEAKICAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKHBhdGgsIGNvbnRlbnRzKTsKICAgICB2ZWN0b3I8c3RyaW5nPiBhcmdzOwogICAgIGFyZ3MuZW1wbGFjZV9iYWNrKCJhaWRsIik7CisgICAgYXJncy5lbXBsYWNlX2JhY2soIi0tbWluX3Nka192ZXJzaW9uPWN1cnJlbnQiKTsKICAgICBhcmdzLmVtcGxhY2VfYmFjaygiLS1sYW5nPSIgKyB0b19zdHJpbmcobGFuZykpOwogICAgIGZvciAoY29uc3Qgc3RyaW5nJiBzIDogYWRkaXRpb25hbF9hcmd1bWVudHMpIHsKICAgICAgIGFyZ3MuZW1wbGFjZV9iYWNrKHMpOwpAQCAtMTA0LDcgKzExMCw3IEBACiAgICAgYXJncy5lbXBsYWNlX2JhY2socGF0aCk7CiAgICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKICAgICB2ZWN0b3I8c3RyaW5nPiBpbXBvcnRlZF9maWxlczsKLSAgICBJbXBvcnRSZXNvbHZlciBpbXBvcnRfcmVzb2x2ZXJ7aW9fZGVsZWdhdGVfLCBwYXRoLCBpbXBvcnRfcGF0aHNfLCB7fX07CisgICAgSW1wb3J0UmVzb2x2ZXIgaW1wb3J0X3Jlc29sdmVye2lvX2RlbGVnYXRlXywgcGF0aCwgaW1wb3J0X3BhdGhzX307CiAgICAgQWlkbEVycm9yIGFjdHVhbF9lcnJvciA9IDo6YW5kcm9pZDo6YWlkbDo6aW50ZXJuYWxzOjpsb2FkX2FuZF92YWxpZGF0ZV9haWRsKAogICAgICAgICBwYXRoLCBvcHRpb25zLCBpb19kZWxlZ2F0ZV8sICZ0eXBlbmFtZXNfLCAmaW1wb3J0ZWRfZmlsZXMpOwogCkBAIC0xODMsMjEgKzE4OSw2IEBACiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpIDw8IGZpbGVfY29udGVudHM7CiB9CiAKLVRFU1RfUChBaWRsVGVzdCwgUmVqZWN0c0FycmF5c09mQmluZGVycykgewotICBpbXBvcnRfcGF0aHNfLmVtcGxhY2UoIiIpOwotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJiYXIvSUJhci5haWRsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBiYXI7IGludGVyZmFjZSBJQmFyIHt9Iik7Ci0gIGNvbnN0IHN0cmluZyBwYXRoID0gImZvby9JRm9vLmFpZGwiOwotICBjb25zdCBzdHJpbmcgY29udGVudHMgPQotICAgICAgInBhY2thZ2UgZm9vO1xuIgotICAgICAgImltcG9ydCBiYXIuSUJhcjtcbiIKLSAgICAgICJpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZihpbiBJQmFyW10gaW5wdXQpOyB9IjsKLSAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9ICJFUlJPUjogZm9vL0lGb28uYWlkbDozLjI3LTMyOiBCaW5kZXIgdHlwZSBjYW5ub3QgYmUgYW4gYXJyYXlcbiI7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKHBhdGgsIGNvbnRlbnRzLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwotfQotCiBURVNUX1AoQWlkbFRlc3QsIFN1cHBvcnRPbmx5T3V0UGFyYW1ldGVycykgewogICBjb25zdCBzdHJpbmcgaW50ZXJmYWNlX2xpc3QgPSAicGFja2FnZSBhOyBpbnRlcmZhY2UgSUJhciB7IHZvaWQgZihvdXQgTGlzdDxTdHJpbmc+IGJhcik7IH0iOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoImEvSUJhci5haWRsIiwgaW50ZXJmYWNlX2xpc3QsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKQEAgLTI1Nyw2ICsyNDgsNjMgQEAKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgUmVqZWN0UmVjdXJzaXZlUGFyY2VsYWJsZSkgeworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZSgiRm9vLmFpZGwiLCAicGFyY2VsYWJsZSBGb28geyBGb28gZm9vOyB9IiwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkZvbyBpcyBhIHJlY3Vyc2l2ZSBwYXJjZWxhYmxlIikpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFJlamVjdEluZGlyZWN0UmVjdXJzaXZlUGFyY2VsYWJsZSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJCYXIuYWlkbCIsICJwYXJjZWxhYmxlIEJhciB7IEZvbyBmb287IH0iKTsKKyAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHsgQmFyIGJhcjsgfSIsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJGb28gaXMgYSByZWN1cnNpdmUgcGFyY2VsYWJsZSIpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBSZWplY3RSZWN1cnNpdmVUeXBlRXZlbklmTnVsbGFibGUpIHsKKyAgLy8gTm90ZTogaW4gbmF0aXZlIGJhY2tlbmRzIEBudWxsYWJsZSBpcyBtYXBwZWQgdG8gbm9uLWhlYXAgd3JhcHBlciBsaWtlIHN0ZDo6b3B0aW9uYWwvT3B0aW9uPFQ+CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgInBhcmNlbGFibGUgQmFyIHsgQG51bGxhYmxlIEZvbyBmb287IH0iKTsKKyAgaW1wb3J0X3BhdGhzXy5lbXBsYWNlKCIiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHsgQmFyIGJhcjsgfSIsIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJGb28gaXMgYSByZWN1cnNpdmUgcGFyY2VsYWJsZSIpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBPa2F5SWZSZWN1cnNpb25JbnZvbHZlc0hlYXBUeXBlKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9vbmx5X21hcF9maWVsZDsKKyAgaWYgKEdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEpIHsKKyAgICBqYXZhX29ubHlfbWFwX2ZpZWxkID0gIiAgTWFwPFN0cmluZywgRm9vPiBtYXA7XG4iOworICB9CisgIEVYUEVDVF9ORShudWxscHRyLCBQYXJzZSgiRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIExpc3Q8Rm9vPiBsaXN0O1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YV9vbmx5X21hcF9maWVsZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRm9vW10gYXJyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEBudWxsYWJsZShoZWFwPXRydWUpIEZvbyBoZWFwX251bGxhYmxlO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7Cit9CisKK1RFU1RfUChBaWRsVGVzdCwgSW50ZXJmYWNlQ2FuUmVmZXJlbmNlSXRzZWxmKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbyhpbiBJRm9vIHNlbGYpOyB9IiwgdHlwZW5hbWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworfQorCitURVNUX1AoQWlkbFRlc3QsIEhlYXBOdWxsYWJsZUNhbnRBcHBseVRvT3RoZXJUaGFuUGFyY2VsYWJsZXMpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBAbnVsbGFibGUoaGVhcD10cnVlKSBTdHJpbmcgcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJAbnVsbGFibGUoaGVhcD10cnVlKSBpcyBhdmFpbGFibGUgdG8gcGFyY2VsYWJsZXMiKSk7Cit9CisKIFRFU1RfUChBaWRsVGVzdCwgUmVqZWN0c0R1cGxpY2F0ZWRBcmd1bWVudE5hbWVzKSB7CiAgIGNvbnN0IHN0cmluZyBtZXRob2QgPSAicGFja2FnZSBhOyBpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZihpbnQgYSwgaW50IGEpOyB9IjsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9CkBAIC0zMTYsMjAgKzM2NCwxMSBAQAogICBFWFBFQ1RfRVEoQWlkbEVycm9yOjpCQURfVFlQRSwgZXJyb3IpOwogfQogCi1URVNUX1AoQWlkbFRlc3QsIFJlamVjdFVuc3VwcG9ydGVkUGFyY2VsYWJsZUFubm90YXRpb25zKSB7Ci0gIEFpZGxFcnJvciBlcnJvcjsKLSAgY29uc3Qgc3RyaW5nIG1ldGhvZCA9ICJwYWNrYWdlIGE7IEBudWxsYWJsZSBwYXJjZWxhYmxlIElGb28gY3BwX2hlYWRlciBcIklGb28uaFwiOyI7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJhL0lGb28uYWlkbCIsIG1ldGhvZCwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSwgJmVycm9yKSk7Ci0gIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQG51bGxhYmxlIGlzIG5vdCBhdmFpbGFibGUuIikpOwotICBFWFBFQ1RfRVEoQWlkbEVycm9yOjpCQURfVFlQRSwgZXJyb3IpOwotfQotCiBURVNUX1AoQWlkbFRlc3QsIFJlamVjdFVuc3VwcG9ydGVkUGFyY2VsYWJsZURlZmluZUFubm90YXRpb25zKSB7CiAgIEFpZGxFcnJvciBlcnJvcjsKLSAgY29uc3Qgc3RyaW5nIG1ldGhvZCA9ICJwYWNrYWdlIGE7IEBudWxsYWJsZSBwYXJjZWxhYmxlIElGb28geyBTdHJpbmcgYTsgU3RyaW5nIGI7IH0iOworICBjb25zdCBzdHJpbmcgbWV0aG9kID0gInBhY2thZ2UgYTsgQG51bGxhYmxlIHBhcmNlbGFibGUgRm9vIHsgU3RyaW5nIGE7IFN0cmluZyBiOyB9IjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvSUZvby5haWRsIiwgbWV0aG9kLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpLCAmZXJyb3IpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJhL0Zvby5haWRsIiwgbWV0aG9kLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpLCAmZXJyb3IpKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJAbnVsbGFibGUgaXMgbm90IGF2YWlsYWJsZS4iKSk7CiAgIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7CiB9CkBAIC00MjMsNiArNDYyLDI4IEBACiAgIEFTU0VSVF9UUlVFKGludGVyZmFjZS0+SXNWaW50ZlN0YWJpbGl0eSgpKTsKIH0KIAorVEVTVF9QKEFpZGxUZXN0LCBUeXBlc1Nob3VsZEhhdmVWaW50ZlN0YWJpbGl0eVdoZW5Db21waWxpbmdXaXRoVGhlVmludGZGbGFnKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgc3RyaW5nIGNvZGUgPQorICAgICAgIkBWaW50ZlN0YWJpbGl0eVxuIgorICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICIgIGludGVyZmFjZSBJTmVzdGVkIHt9IgorICAgICAgIn0iOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwgY29kZSwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLS1zdHJ1Y3R1cmVkIiwgIi0tc3RhYmlsaXR5IiwgInZpbnRmIn0pKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKyAgYXV0byBuZXN0ZWQgPSB0eXBlbmFtZXNfLlRyeUdldERlZmluZWRUeXBlKCJGb28uSU5lc3RlZCIpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbmVzdGVkKTsKKyAgQVNTRVJUX1RSVUUobmVzdGVkLT5Jc1ZpbnRmU3RhYmlsaXR5KCkpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFZpbnRmU3RhYmlsaXR5QXBwbGllc1RvTmVzdGVkVHlwZXNBc1dlbGwpIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHt9IiwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLS1zdHJ1Y3R1cmVkIiwgIi0tc3RhYmlsaXR5IiwgInZpbnRmIn0pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJGb28gZG9lcyBub3QgaGF2ZSBWSU5URiBsZXZlbCBzdGFiaWxpdHkiKSk7Cit9CisKIFRFU1RfRihBaWRsVGVzdCwgUGFyc2VzSmF2YU9ubHlTdGFibGVQYXJjZWxhYmxlKSB7CiAgIE9wdGlvbnMgamF2YV9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtbyBvdXQgLS1zdHJ1Y3R1cmVkIGEvRm9vLmFpZGwiKTsKICAgT3B0aW9ucyBjcHBfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWNwcCAtbyBvdXQgLWggb3V0L2luY2x1ZGUgYS9Gb28uYWlkbCIpOwpAQCAtNDMzLDI1ICs0OTQsMjMgQEAKICAgICAgICJhL0Zvby5haWRsIiwKICAgICAgIFN0cmluZ1ByaW50ZigicGFja2FnZSBhOyBASmF2YU9ubHlTdGFibGVQYXJjZWxhYmxlIHBhcmNlbGFibGUgRm9vIGNwcF9oZWFkZXIgXCJGb28uaFwiIDsiKSk7CiAKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChjcHBfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQotICAgICAgIkVSUk9SOiBhL0Zvby5haWRsOjEuNDgtNTI6IENhbm5vdCBkZWNsYXJlZCBwYXJjZWxhYmxlIGluIGEgLS1zdHJ1Y3R1cmVkIGludGVyZmFjZS4gIgotICAgICAgIlBhcmNlbGFibGUgbXVzdCBiZSBkZWZpbmVkIGluIEFJREwgZGlyZWN0bHkuXG4iOwotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChjcHBfc3RydWN0dXJlZF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoY3BwX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKHJ1c3Rfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKGNwcF9zdHJ1Y3R1cmVkX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkNhbm5vdCBkZWNsYXJlIHVuc3RydWN0dXJlZCIpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwocnVzdF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJDYW5ub3QgZGVjbGFyZSB1bnN0cnVjdHVyZWQiKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgUGFyY2VsYWJsZVN1cHBvcnRKYXZhRGVyaXZlVG9TdHJpbmcpIHsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9Gb28uYWlkbCIsIFIiKHBhY2thZ2UgYTsKICAgICBASmF2YURlcml2ZSh0b1N0cmluZz10cnVlKSBwYXJjZWxhYmxlIEZvbyB7IGludCBhOyBmbG9hdCBiOyB9KSIpOwogICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIHN0cmluZyBqYXZhX291dDsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cygib3V0L2EvRm9vLmphdmEiLCAmamF2YV9vdXQpKTsKQEAgLTQ1OSwxMCArNTE4LDEwIEBACiAKICAgLy8gT3RoZXIgYmFja2VuZHMgc2hvdWxkbid0IGJlIGJvdGhlcmVkCiAgIE9wdGlvbnMgY3BwX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1jcHAgLW8gb3V0IC1oIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChjcHBfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChjcHBfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgT3B0aW9ucyBuZGtfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPW5kayAtbyBvdXQgLWggb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG5ka19vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG5ka19vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBVbmlvblN1cHBvcnRKYXZhRGVyaXZlVG9TdHJpbmcpIHsKQEAgLTQ3MCw3ICs1MjksNyBAQAogICAgIEBKYXZhRGVyaXZlKHRvU3RyaW5nPXRydWUpIHVuaW9uIEZvbyB7IGludCBhOyBpbnRbXSBiOyB9KSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgamF2YV9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3RvX3N0cmluZ19tZXRob2QgPSBSIi0tKApAQCAtNDk0LDcgKzU1Myw3IEBACiAgICAgQEphdmFEZXJpdmUoZXF1YWxzPXRydWUpIHBhcmNlbGFibGUgRm9vIHsgaW50IGE7IGZsb2F0IGI7IH0pIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAogICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZCA9IFIiLS0oCkBAIC01MjUsNyArNTg0LDcgQEAKICAgICBASmF2YURlcml2ZShlcXVhbHM9dHJ1ZSkgdW5pb24gRm9vIHsgaW50IGE7IGludFtdIGI7IH0pIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAogICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZCA9IFIiLS0oCkBAIC01NTcsNyArNjE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGE7IEBKYXZhRGVyaXZlKGJsYWg9dHJ1ZSkgcGFyY2VsYWJsZSBGb297fSIpOwogICAgIE9wdGlvbnMgamF2YV9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9Gb28uYWlkbCIpOwogICAgIENhcHR1cmVTdGRlcnIoKTsKLSAgICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KICAgICAgICAgIkVSUk9SOiBhL0Zvby5haWRsOjEuMTEtMzQ6IFBhcmFtZXRlciBibGFoIG5vdCBzdXBwb3J0ZWQgZm9yIGFubm90YXRpb24gSmF2YURlcml2ZS4iOwogICAgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksCkBAIC01NjgsNyArNjI3LDcgQEAKICAgICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsICJwYWNrYWdlIGE7IEBKYXZhRGVyaXZlIGludGVyZmFjZSBJRm9ve30iKTsKICAgICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChqYXZhX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICAgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkBKYXZhRGVyaXZlIGlzIG5vdCBhdmFpbGFibGUuIikpOwogICB9CiAKQEAgLTU3Niw3ICs2MzUsNyBAQAogICAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgInBhY2thZ2UgYTsgQEphdmFEZXJpdmUgZW51bSBJRm9vIHsgQT0xLCB9Iik7CiAgICAgT3B0aW9ucyBqYXZhX29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOwogICAgIENhcHR1cmVTdGRlcnIoKTsKLSAgICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJASmF2YURlcml2ZSBpcyBub3QgYXZhaWxhYmxlLiIpKTsKICAgfQogfQpAQCAtNTkyLDYgKzY1MSwxOCBAQAogICBBU1NFUlRfRVEoIklCYXIiLCBpbnRlcmZhY2UtPkdldERlc2NyaXB0b3IoKSk7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgVW5rbm93bkFubm90YXRpb24pIHsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvSUZvby5haWRsIiwgInBhY2thZ2UgYTsgQFVua25vd24gaW50ZXJmYWNlIElGb28geyB9IiwgdHlwZW5hbWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJub3QgYSByZWNvZ25pemVkIGFubm90YXRpb24iKSk7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvSUZvby5haWRsIiwgInBhY2thZ2UgYTsgQFVua25vd24ocGFyYW09dHJ1ZSkgaW50ZXJmYWNlIElGb28geyB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJub3QgYSByZWNvZ25pemVkIGFubm90YXRpb24iKSk7Cit9CisKIFRFU1RfUChBaWRsVGVzdCwgQWNjZXB0c09uZXdheU1ldGhvZCkgewogICBjb25zdCBzdHJpbmcgb25ld2F5X21ldGhvZCA9ICJwYWNrYWdlIGE7IGludGVyZmFjZSBJRm9vIHsgb25ld2F5IHZvaWQgZihpbnQgYSk7IH0iOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoImEvSUZvby5haWRsIiwgb25ld2F5X21ldGhvZCwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOwpAQCAtNjI2LDYgKzY5NywyOCBAQAogICBBU1NFUlRfVFJVRShyZXRfdHlwZS5Jc0hpZGUoKSk7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgQW5ub3RhdGlvblZhbHVlQXR0cmlidXRlKSB7CisgIGNvbnN0IHN0cmluZyBjb250ZW50ID0KKyAgICAgICJwYWNrYWdlIGE7IEBEZXNjcmlwdG9yKFwiZGVzY3JpcHRvcl92YWx1ZVwiKSBpbnRlcmZhY2UgSUZvbyB7IHZvaWQgZihpbnQgYSk7IH0iOworICBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWQgPSBQYXJzZSgiYS9JRm9vLmFpZGwiLCBjb250ZW50LCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRlZmluZWQpOworICBjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSA9IGRlZmluZWQtPkFzSW50ZXJmYWNlKCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBpZmFjZSk7CisKKyAgQVNTRVJUX0VRKCJkZXNjcmlwdG9yX3ZhbHVlIiwgaWZhY2UtPkdldERlc2NyaXB0b3IoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQ2hlY2tBcGlGb3JBbm5vdGF0aW9uVmFsdWVBdHRyaWJ1dGUpIHsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWNoZWNrYXBpPWVxdWFsIG9sZCBuZXciKTsKKworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJvbGQvcC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IEBEZXNjcmlwdG9yKHZhbHVlPVwidjFcIikgaW50ZXJmYWNlIElGb297IHZvaWQgZm9vKCk7fSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJuZXcvcC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IEBEZXNjcmlwdG9yKFwidjFcIikgaW50ZXJmYWNlIElGb297IHZvaWQgZm9vKCk7fSIpOworCisgIEVYUEVDVF9UUlVFKDo6YW5kcm9pZDo6YWlkbDo6Y2hlY2tfYXBpKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworfQorCiBURVNUX1AoQWlkbFRlc3QsIFdyaXRlc0NvbW1lbnRzKSB7CiAgIHN0cmluZyBmb29faW50ZXJmYWNlID0KICAgICAgIFIiKHBhY2thZ2UgYTsKQEAgLTY3MiwxMSArNzY1LDI4IEBACiAgIEVYUEVDVF9FUSgoQ29tbWVudHN7eyIvLyBnZXQgYmFyXG4ifX0pLCBpbnRlcmZhY2UtPkdldE1ldGhvZHMoKVswXS0+R2V0Q29tbWVudHMoKSk7CiB9CiAKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0c0lmQ3BwSGVhZGVySXNNaXNzaW5nKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vOyIpOworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyBjcHAgLWggaCAtbyBvIEZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJtdXN0IGhhdmUgQysrIGhlYWRlciBkZWZpbmVkIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdHNJZlR5cGVSZWZzQ3BwSGVhZGVySXNNaXNzaW5nKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vOyIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJJQmFyLmFpZGwiLCAiaW50ZXJmYWNlIElCYXIgeyB2b2lkIGJhcihpbiBGb28gZm9vKTsgfSIpOworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIC4gLS1sYW5nIGNwcCAtaCBoIC1vIG8gSUJhci5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJtdXN0IGhhdmUgQysrIGhlYWRlciBkZWZpbmVkIikpOworfQorCiBURVNUX0YoQWlkbFRlc3QsIFBhcnNlc1ByZXByb2Nlc3NlZEZpbGUpIHsKICAgc3RyaW5nIHNpbXBsZV9jb250ZW50ID0gInBhcmNlbGFibGUgYS5Gb287XG5pbnRlcmZhY2UgYi5JQmFyOyI7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInBhdGgiLCBzaW1wbGVfY29udGVudCk7CiAgIEVYUEVDVF9GQUxTRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiYS5Gb28iKS5pc19yZXNvbHZlZCk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlX3ByZXByb2Nlc3NlZF9maWxlKGlvX2RlbGVnYXRlXywgInBhdGgiLCAmdHlwZW5hbWVzXykpOworICBFWFBFQ1RfVFJVRShQYXJzZXI6OlBhcnNlKCJwYXRoIiwgaW9fZGVsZWdhdGVfLCB0eXBlbmFtZXNfLCAvKmlzX3ByZXByb2Nlc3NlZD0qL3RydWUpKTsKICAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoImEuRm9vIikuaXNfcmVzb2x2ZWQpOwogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiYi5JQmFyIikuaXNfcmVzb2x2ZWQpOwogfQpAQCAtNjg2LDcgKzc5Niw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInBhdGgiLCBzaW1wbGVfY29udGVudCk7CiAKICAgRVhQRUNUX0ZBTFNFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJhLkZvbyIpLmlzX3Jlc29sdmVkKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VfcHJlcHJvY2Vzc2VkX2ZpbGUoaW9fZGVsZWdhdGVfLCAicGF0aCIsICZ0eXBlbmFtZXNfKSk7CisgIEVYUEVDVF9UUlVFKFBhcnNlcjo6UGFyc2UoInBhdGgiLCBpb19kZWxlZ2F0ZV8sIHR5cGVuYW1lc18sIC8qaXNfcHJlcHJvY2Vzc2VkPSovdHJ1ZSkpOwogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiYS5Gb28iKS5pc19yZXNvbHZlZCk7CiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJiLklCYXIiKS5pc19yZXNvbHZlZCk7CiB9CkBAIC03MDUsOCArODE1LDggQEAKICAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoIm9uZS5JQmFyIikuaXNfcmVzb2x2ZWQpOwogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiYW5vdGhlci5JQmFyIikuaXNfcmVzb2x2ZWQpOwogICAvLyBCdXQgaWYgd2UgcmVxdWVzdCBqdXN0ICJJQmFyIiB3ZSBzaG91bGQgZ2V0IG91ciBpbXBvcnRlZCBvbmUuCi0gIEFpZGxUeXBlU3BlY2lmaWVyIGFtYmlndW91c190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIklCYXIiLCBmYWxzZSwgbnVsbHB0ciwge30pOwotICBhbWJpZ3VvdXNfdHlwZS5SZXNvbHZlKHR5cGVuYW1lc18pOworICBBaWRsVHlwZVNwZWNpZmllciBhbWJpZ3VvdXNfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJJQmFyIiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwge30pOworICBhbWJpZ3VvdXNfdHlwZS5SZXNvbHZlKHR5cGVuYW1lc18sIHBhcnNlX3Jlc3VsdCk7CiAgIEVYUEVDVF9FUSgib25lLklCYXIiLCBhbWJpZ3VvdXNfdHlwZS5HZXROYW1lKCkpOwogfQogCkBAIC03MjcsOCArODM3LDggQEAKICAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoIm9uZS5JQmFyIikuaXNfcmVzb2x2ZWQpOwogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiYW5vdGhlci5JQmFyIikuaXNfcmVzb2x2ZWQpOwogICAvLyBCdXQgaWYgd2UgcmVxdWVzdCBqdXN0ICJJQmFyIiB3ZSBzaG91bGQgZ2V0IG91ciBpbXBvcnRlZCBvbmUuCi0gIEFpZGxUeXBlU3BlY2lmaWVyIGFtYmlndW91c190eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIklCYXIiLCBmYWxzZSwgbnVsbHB0ciwge30pOwotICBhbWJpZ3VvdXNfdHlwZS5SZXNvbHZlKHR5cGVuYW1lc18pOworICBBaWRsVHlwZVNwZWNpZmllciBhbWJpZ3VvdXNfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJJQmFyIiwgLyphcnJheT0qL3N0ZDo6bnVsbG9wdCwgbnVsbHB0ciwge30pOworICBhbWJpZ3VvdXNfdHlwZS5SZXNvbHZlKHR5cGVuYW1lc18sIHBhcnNlX3Jlc3VsdCk7CiAgIEVYUEVDVF9FUSgib25lLklCYXIiLCBhbWJpZ3VvdXNfdHlwZS5HZXROYW1lKCkpOwogfQogCkBAIC03MzgsMTggKzg0OCwxNjUgQEAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygib25lL0lCYXIuYWlkbCIsICJwYWNrYWdlIG9uZTsgaW1wb3J0IHAuT3V0ZXI7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJQmFyIHt9Iik7CiAKLSAgdmVjdG9yPHN0cmluZz4gYXJncyB7Ci0gICAgImFpZGwiLAotICAgICItLXByZXByb2Nlc3MiLAotICAgICJwcmVwcm9jZXNzZWQiLAotICAgICJwL091dGVyLmFpZGwiLAotICAgICJvbmUvSUJhci5haWRsIn07CisgIHZlY3RvcjxzdHJpbmc+IGFyZ3N7ImFpZGwiLCAiLS1wcmVwcm9jZXNzIiwgInByZXByb2Nlc3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIi1JLiIsICAicC9PdXRlci5haWRsIiwgIm9uZS9JQmFyLmFpZGwifTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKLSAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpwcmVwcm9jZXNzX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKDo6YW5kcm9pZDo6YWlkbDo6UHJlcHJvY2VzcyhvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAotICBzdHJpbmcgb3V0cHV0OwotICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJwcmVwcm9jZXNzZWQiLCAmb3V0cHV0KSk7Ci0gIEVYUEVDVF9FUSgicGFyY2VsYWJsZSBwLk91dGVyLklubmVyO1xuaW50ZXJmYWNlIG9uZS5JQmFyO1xuIiwgb3V0cHV0KTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBleHBlY3RlZCA9IHt7InByZXByb2Nlc3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIHAuT3V0ZXIuSW5uZXI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2Ugb25lLklCYXIge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIn19OworICBFWFBFQ1RfVEhBVChpb19kZWxlZ2F0ZV8uT3V0cHV0RmlsZXMoKSwgdGVzdGluZzo6RXEoZXhwZWN0ZWQpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBQcmVwcm9jZXNzVmFyaW91c1RoaW5ncykgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJmb28vYmFyL0lGb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZm9vLmJhcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaW50IGZvbygpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY29uc3QgaW50IEZPTyA9IGZvby5iYXIuQmFyLkJBUiArIDE7IC8vIHNob3VsZCBiZSA0NFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiZm9vL2Jhci9CYXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZm9vLmJhcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBCYXIge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY29uc3QgaW50IEJBUiA9IGltcG9ydGVkLkZvby5GT08gKyAxOyAvLyBzaG91bGQgYmUgNDNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGltcG9ydGVkLkZvbyBmb287XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJmb28vYmFyL0dlbi5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb28uYmFyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEdlbjxUPiB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJmb28vYmFyL0VudW0uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZm9vLmJhcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSBFbnVtIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZPTyA9IDMsIEJBUiA9IEZPTyArIDMsIC8vIHNob3VsZCBiZSAzLCA2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJzdWIvaW1wb3J0ZWQvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGltcG9ydGVkO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjb25zdCBpbnQgRk9PID0gNDI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpOworCisgIHZlY3RvcjxzdHJpbmc+IGFyZ3MgPSB7CisgICAgICAiYWlkbCIsCisgICAgICAiLS1wcmVwcm9jZXNzIiwKKyAgICAgICJwcmVwcm9jZXNzZWQiLAorICAgICAgIi1Jc3ViIiwKKyAgICAgICItSS4iLAorICAgICAgImZvby9iYXIvSUZvby5haWRsIiwKKyAgICAgICJmb28vYmFyL0Jhci5haWRsIiwKKyAgICAgICJmb28vYmFyL0dlbi5haWRsIiwKKyAgICAgICJmb28vYmFyL0VudW0uYWlkbCIsCisgIH07CisgIEFTU0VSVF9UUlVFKFByZXByb2Nlc3MoT3B0aW9uczo6RnJvbShhcmdzKSwgaW9fZGVsZWdhdGVfKSk7CisgIHN0ZDo6c3RyaW5nIHByZXByb2Nlc3NlZCA9CisgICAgICAiaW50ZXJmYWNlIGZvby5iYXIuSUZvbyB7XG4iCisgICAgICAiICBjb25zdCBpbnQgRk9PID0gNDQ7XG4iCisgICAgICAifVxuIgorICAgICAgInBhcmNlbGFibGUgZm9vLmJhci5CYXIge1xuIgorICAgICAgIiAgY29uc3QgaW50IEJBUiA9IDQzO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwYXJjZWxhYmxlIGZvby5iYXIuR2VuPFQ+IHtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiZW51bSBmb28uYmFyLkVudW0ge1xuIgorICAgICAgIiAgRk9PID0gMyxcbiIKKyAgICAgICIgIEJBUiA9IDYsXG4iCisgICAgICAifVxuIjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBleHBlY3RlZCA9IHt7InByZXByb2Nlc3NlZCIsIHByZXByb2Nlc3NlZH19OworICBFWFBFQ1RfVEhBVChpb19kZWxlZ2F0ZV8uT3V0cHV0RmlsZXMoKSwgdGVzdGluZzo6RXEoZXhwZWN0ZWQpKTsKKworICAvLyB1c2UgcHJlcHJvY2Vzc2VkCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgRm9vIHsgY29uc3QgaW50IHkgPSBmb28uYmFyLkJhci5CQVI7IH0iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicHJlcHJvY2Vzc2VkIiwgcHJlcHJvY2Vzc2VkKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyBqYXZhIC1vIG91dCBhL0Zvby5haWRsIC1wcHJlcHJvY2Vzc2VkIik7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgc3RyaW5nIGNvZGU7CisgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9hL0Zvby5qYXZhIiwgJmNvZGUpKTsKKyAgRVhQRUNUX1RIQVQoY29kZSwgdGVzdGluZzo6SGFzU3Vic3RyKCJwdWJsaWMgc3RhdGljIGZpbmFsIGludCB5ID0gNDM7IikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEFsbG93TXVsdGlwbGVVbnN0cnVjdHVyZWROZXN0ZWRQYXJjZWxhYmxlc0luQVNpbmdsZURvY3VtZW50KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgeC5PdXRlcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKGluIE91dGVyLklubmVyMSBpbjEsIGluIE91dGVyLklubmVyMiBpbjIpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImltcG9ydGVkL3gvT3V0ZXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgeDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBPdXRlci5Jbm5lcjE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgT3V0ZXIuSW5uZXIyO1xuIik7CisgIGF1dG8gb3B0ID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSWltcG9ydGVkIC0tbGFuZz1qYXZhIHAvSUZvby5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdCwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwKKyAgICAgICBTdHVic1NvdXJjZUlzR2VuZXJhdGVkRnJvbUR1cGxpY2F0ZURlZmluaXRpb25XaXRoRnJhbWV3b3JrQWlkbF9GcmFtZXdvcmtBaWRsTGF0ZXIpIHsKKyAgLy8gTWFpbiBkb2MoRm9vLmFpZGwpIGlzIGxvYWRlZAorICAvLyBBbmQgdGhlbiBmcmFtZXdvcmsuYWlkbCBpcyBsb2FkZWQgYXMgcHJlcHJvY2Vzc2VkLiAoY29uZmxpY3QpCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInNkay9mcmFtZXdvcmsuYWlkbCIsICJwYXJjZWxhYmxlIHguRm9vLklubmVyO1xuIik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIngvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHg7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vLklubmVyO1xuIik7CisgIGF1dG8gb3B0ID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtcHNkay9mcmFtZXdvcmsuYWlkbCAtSS4geC9Gb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHQsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsCisgICAgICAgU3R1YnNTb3VyY2VJc0dlbmVyYXRlZEZyb21EdXBsaWNhdGVEZWZpbml0aW9uV2l0aEZyYW1ld29ya0FpZGxfRnJhbWV3b3JrQWlkbEZpcnN0KSB7CisgIC8vIE1haW4gZG9jKElCYXIuYWlkbCkgaXMgbG9hZGVkIGZpcnN0LgorICAvLyBGcmFtZXdvcmsuYWlkbCBpcyBsb2FkZWQgYXMgcHJlcHJvY2Vzc2VkLgorICAvLyBBbmQgdGhlbiBpbXBvcnQoRm9vLmFpZGwpIGlzIGxvYWRlZC4gKGNvbmZsaWN0KQorICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJzZGsvZnJhbWV3b3JrLmFpZGwiLCAicGFyY2VsYWJsZSB4LkZvby5Jbm5lcjtcbiIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJ4L0lCYXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgeDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHguRm9vO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoaW4gRm9vLklubmVyIGlubmVyKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJ4L0Zvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSB4O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEZvby5Jbm5lcjtcbiIpOworICBhdXRvIG9wdCA9IE9wdGlvbnM6OkZyb20oImFpZGwgLXBzZGsvZnJhbWV3b3JrLmFpZGwgLUkuIHgvSUJhci5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdCwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUHJlcHJvY2Vzc2VkRmlsZUNhbnREZWNsYXJlUGFja2FnZSkgeworICBzdHJpbmcgc2ltcGxlX2NvbnRlbnQgPSAicGFja2FnZSB4eHg7IHBhcmNlbGFibGUgYS5Gb287IjsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicGF0aCIsIHNpbXBsZV9jb250ZW50KTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoUGFyc2VyOjpQYXJzZSgicGF0aCIsIGlvX2RlbGVnYXRlXywgdHlwZW5hbWVzXywgLyppc19wcmVwcm9jZXNzZWQ9Ki90cnVlKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiUHJlcHJvY2Vzc2VkIGZpbGUgY2FuJ3QgZGVjbGFyZSBwYWNrYWdlLiIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RRdWFsaWZpZWRUeXBlTmFtZVVubGVzc1ByZXByb2Nlc3NlZCkgeworICBzdHJpbmcgc2ltcGxlX2NvbnRlbnQgPSAicGFyY2VsYWJsZSBhLkZvbyB7fSI7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInBhdGgiLCBzaW1wbGVfY29udGVudCk7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlcjo6UGFyc2UoInBhdGgiLCBpb19kZWxlZ2F0ZV8sIHR5cGVuYW1lc18sIC8qaXNfcHJlcHJvY2Vzc2VkPSovZmFsc2UpKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJUeXBlIG5hbWUgY2FuJ3QgYmUgcXVhbGlmaWVkIikpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFByZXByb2Nlc3NlZENhbkRlY2xhcmVKYXZhU3R5bGVCdWlsdGluVHlwZXMpIHsKKyAgc3RyaW5nIGNvbnRlbnRzID0gUiIoCisgICAgaW50ZXJmYWNlIGFuZHJvaWQub3MuSUJpbmRlcjsKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOworICAgIHBhcmNlbGFibGUgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKKyAgKSI7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInBhdGgiLCBjb250ZW50cyk7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoUGFyc2VyOjpQYXJzZSgicGF0aCIsIGlvX2RlbGVnYXRlXywgdHlwZW5hbWVzXywgLyppc19wcmVwcm9jZXNzZWQ9Ki90cnVlKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKIH0KIAogVEVTVF9QKEFpZGxUZXN0LCBTdXBwb3J0RGVwcmVjYXRlZCkgewpAQCAtNzY0LDcgKzEwMjEsNyBAQAogCiAgICAgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSArICIgIiArIGZpbGVuYW1lICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLS1vdXQ9b3V0IC0taGVhZGVyX291dD1vdXQiKTsKLSAgICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgICAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICAgIGZvciAoY29uc3QgYXV0byYgW2xhbmcsIHRlc3RfY2FzZV0gOiBleHBlY3RhdGlvbnMpIHsKICAgICAgIGlmIChsYW5nICE9IEdldExhbmd1YWdlKCkpIGNvbnRpbnVlOwogICAgICAgc3RyaW5nIG91dHB1dDsKQEAgLTg5Niw4ICsxMTUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICB7T3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEsIHsib3V0L0Zvby5qYXZhIiwgIkBEZXByZWNhdGVkIn19LAogICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6Q1BQLCB7Im91dC9Gb28uaCIsICJfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkIn19LAogICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6TkRLLCB7Im91dC9haWRsL0Zvby5oIiwgIl9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQifX0sCi0gICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE3Nzg2MDQyMykgc3VwcG9ydCAiZGVwcmVjYXRlZCIgaW4gUnVzdCBlbnVtCi0gICAgICAgICAgICAgICAgICAgICAgLy8ge09wdGlvbnM6Okxhbmd1YWdlOjpSVVNULCB7Im91dC9Gb28ucnMiLCAiI1tkZXByZWNhdGVkIn19LAorICAgICAgICAgICAgICAgICAgICAgIHtPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCwgeyJvdXQvRm9vLnJzIiwgIiNbZGVwcmVjYXRlZCJ9fSwKICAgICAgICAgICAgICAgICAgIH0pOwogfQogCkBAIC05MTQsMTcgKzExNzAsMjMgQEAKIH0KIAogVEVTVF9QKEFpZGxUZXN0LCBQYXJzZUNvbXBvdW5kUGFyY2VsYWJsZUZyb21QcmVwcm9jZXNzKSB7Ci0gIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInByZXByb2Nlc3NlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgcC5PdXRlci5Jbm5lcjsiKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicHJlcHJvY2Vzc2VkIiwgInBhcmNlbGFibGUgcC5PdXRlci5Jbm5lciBjcHBfaGVhZGVyIFwiaW5uZXIuaFwiOyIpOwogICBwcmVwcm9jZXNzZWRfZmlsZXNfLnB1c2hfYmFjaygicHJlcHJvY2Vzc2VkIik7CiAgIGF1dG8gcGFyc2VfcmVzdWx0ID0gUGFyc2UoInAvSUZvby5haWRsIiwgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyB2b2lkIGYoaW4gSW5uZXIgYyk7IH0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCkpOwotICAvLyBUT0RPKHdpbGV5KTogVGhpcyBzaG91bGQgYWN0dWFsbHkgcmV0dXJuIG51bGxwdHIgYmVjYXVzZSB3ZSByZXF1aXJlCi0gIC8vICAgICAgICAgICAgICB0aGUgb3V0ZXIgY2xhc3MgbmFtZS4gIEhvd2V2ZXIsIGZvciBsZWdhY3kgcmVhc29ucywKLSAgLy8gICAgICAgICAgICAgIHRoaXMgYmVoYXZpb3IgbXVzdCBiZSBtYWludGFpbmVkLiAgYi8xNzQxNTY5MgorICAvLyBSZXF1aXJlIGxlZ2FjeSBiZWhhdmlvciAtIGlubmVyIGNsYXNzIG5hbWUgY2FuIGJlIHVzZWQgd2l0aG91dCBvdXRlciBjbGFzcyBuYW1lLgogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFyc2VfcmVzdWx0KTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0LCBBcGlNYXBwaW5nQWNjZXB0c1Vuc3RydWN0dXJlZFBhcmNlbGFibGVzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvRm9vLmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbzsiKTsKKworICBPcHRpb25zIG9wdGlvbnMxID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWFwaW1hcHBpbmcgbWFwcGluZy50eHQgcC9Gb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUSgwLCBhaWRsX2VudHJ5KG9wdGlvbnMxLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBGYWlsT25QYXJjZWxhYmxlKSB7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9mb29fc3RkZXJyID0KICAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6MS4yMi0yNzogUmVmdXNpbmcgdG8gZ2VuZXJhdGUgY29kZSB3aXRoIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlcy4gIgpAQCAtOTM1LDEzICsxMTk3LDEzIEBACiAgIC8vIEJ5IGRlZmF1bHQsIHdlIHNob3VsZG4ndCBmYWlsIG9uIHBhcmNlbGFibGUuCiAgIE9wdGlvbnMgb3B0aW9uczEgPSBPcHRpb25zOjpGcm9tKCJhaWRsIHAvSUZvby5haWRsIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMxLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMxLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAogICAvLyAtYiBjb25zaWRlcnMgdGhpcyBhbiBlcnJvcgogICBPcHRpb25zIG9wdGlvbnMyID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtYiBwL0lGb28uYWlkbCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zMiwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9uczIsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZm9vX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX2Jhcl9zdGRlcnIgPQpAQCAtOTUzLDE5ICsxMjE1LDMxIEBACiAgIC8vIFdpdGggJy1iJyBvcHRpb24sIGEgcGFyY2VsYWJsZSBhbmQgYW4gaW50ZXJmYWNlIHNob3VsZCBmYWlsLgogICBPcHRpb25zIG9wdGlvbnMzID0gT3B0aW9uczo6RnJvbSgiYWlkbCBwL0lCYXIuYWlkbCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zMywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zMywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAgIE9wdGlvbnMgb3B0aW9uczQgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1iIHAvSUJhci5haWRsIik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnM0LCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zNCwgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9iYXJfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIAorVEVTVF9QKEFpZGxUZXN0LCBJbXBvcnRpbmdKYXZhU3R5bGVCdWlsdGluVHlwZXNJc0FsbG93ZWQpIHsKKyAgc3RyaW5nIGNvbnRlbnRzID0gUiIoCisgICAgaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKyAgICBpbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOworICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgIHZvaWQgZm9vKGluIElCaW5kZXIgYik7CisgICAgfQorICApIjsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJJRm9vLmFpZGwiLCBjb250ZW50cywgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworfQorCiBURVNUX1AoQWlkbFRlc3QsIFN0cnVjdHVyZWRGYWlsT25VbnN0cnVjdHVyZWRQYXJjZWxhYmxlKSB7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQotICAgICAgIkVSUk9SOiAuL28vV2hvS25vd3NXaGF0LmFpZGw6MS4yMi0zNTogby5XaG9Lbm93c1doYXQgaXMgbm90IHN0cnVjdHVyZWQsIGJ1dCB0aGlzIGlzIGEgIgorICAgICAgIkVSUk9SOiBvL1dob0tub3dzV2hhdC5haWRsOjEuMjItMzU6IG8uV2hvS25vd3NXaGF0IGlzIG5vdCBzdHJ1Y3R1cmVkLCBidXQgdGhpcyBpcyBhICIKICAgICAgICJzdHJ1Y3R1cmVkIGludGVyZmFjZS5cbiI7Ci0gIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm8vV2hvS25vd3NXaGF0LmFpZGwiLCAicGFja2FnZSBvOyBwYXJjZWxhYmxlIFdob0tub3dzV2hhdDsiKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiby9XaG9Lbm93c1doYXQuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgbzsgcGFyY2VsYWJsZSBXaG9Lbm93c1doYXQgY3BwX2hlYWRlciBcIndob19rbm93cy5oXCI7Iik7CiAgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CiAgIEFpZGxFcnJvciBlcnJvcjsKICAgQ2FwdHVyZVN0ZGVycigpOwpAQCAtOTk1LDEwICsxMjY5LDQ2IEBACiAgIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgSW52YWxpZENvbnN0U3RyaW5nKSB7CisgIEFpZGxFcnJvciBlcnJvcjsKKyAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9CisgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNDctNjA6IEZvdW5kIGludmFsaWQgY2hhcmFjdGVyICdcXCcgYXQgaW5kZXggNCBpbiBzdHJpbmcgY29uc3RhbnQgIgorICAgICAgIidcInRlc3RcXFwidGVzdFwiJ1xuIjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFIiKHBhY2thZ2UgcDsKKyAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcgc29tZVZhciA9ICJ0ZXN0XCJ0ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpLCAmZXJyb3IpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CisgIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7Cit9CisKK1RFU1RfUChBaWRsVGVzdCwgUmVqZWN0VW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZXNJbk5ES2FuZFJ1c3QpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiby9Gb28uYWlkbCIsICJwYWNrYWdlIG87IHBhcmNlbGFibGUgRm9vIGNwcF9oZWFkZXIgXCJjcHAvRm9vLmhcIjsiKTsKKyAgY29uc3QgYXV0byBvcHRpb25zID0KKyAgICAgIE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkgKyAiIC1vIG91dCAtaCBvdXQgLUkuIG8vRm9vLmFpZGwiKTsKKyAgY29uc3QgYm9vbCByZWplY3RfdW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGVzID0KKyAgICAgIEdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESyB8fCBHZXRMYW5ndWFnZSgpID09IE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUOworICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfZXJyID0gcmVqZWN0X3Vuc3RydWN0dXJlZF9wYXJjZWxhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlJlZnVzaW5nIHRvIGdlbmVyYXRlIGNvZGUgd2l0aCB1bnN0cnVjdHVyZWQgcGFyY2VsYWJsZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXyksICFyZWplY3RfdW5zdHJ1Y3R1cmVkX3BhcmNlbGFibGVzKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKGV4cGVjdGVkX2VycikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIENvc250YW50VmFsdWVUeXBlKSB7CisgIHVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+IG51bXtBaWRsQ29uc3RhbnRWYWx1ZTo6SW50ZWdyYWwoQUlETF9MT0NBVElPTl9IRVJFLCAiMSIpfTsKKyAgRVhQRUNUX0VRKG51bS0+R2V0VHlwZSgpLCBBaWRsQ29uc3RhbnRWYWx1ZTo6VHlwZTo6SU5UOCk7Cit9CisKIFRFU1RfUChBaWRsVGVzdCwgRmFpbE9uVG9vQmlnQ29uc3RhbnQpIHsKICAgQWlkbEVycm9yIGVycm9yOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KLSAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6My40OC01MjogSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgYW4gaW50MzIgbGl0ZXJhbDogYnl0ZVxuIjsKKyAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6My40OC01MjogSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgYW4gaW50MzIgbGl0ZXJhbDogYnl0ZSAoMjU2KVxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIiKHBhY2thZ2UgcDsKQEAgLTEwMTUsNyArMTMyNSw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvRm9vLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEZvbyB7IGNvbnN0IGludCB5ID0gdHJ1ZTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nIGphdmEgLW8gb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogICBzdHJpbmcgY29kZTsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cygib3V0L2EvRm9vLmphdmEiLCAmY29kZSkpOwpAQCAtMTA0NSwxMSArMTM1NSwxMSBAQAogfQogCiBURVNUX0YoQWlkbFRlc3QsIEFpZGxDb25zdGFudENoYXJhY3RlckRlZmF1bHQpIHsKLSAgQWlkbFR5cGVTcGVjaWZpZXIgY2hhcl90eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImNoYXIiLCBmYWxzZSwgbnVsbHB0ciwge30pOwotICBhdXRvIGRlZmF1bHRfdmFsdWUgPSB1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPihBaWRsQ29uc3RhbnRWYWx1ZTo6RGVmYXVsdChjaGFyX3R5cGUpKTsKLSAgRVhQRUNUX0VRKCInXFwwJyIsIGRlZmF1bHRfdmFsdWUtPlZhbHVlU3RyaW5nKGNoYXJfdHlwZSwgY3BwOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7Ci0gIEVYUEVDVF9FUSgiJ1xcMCciLCBkZWZhdWx0X3ZhbHVlLT5WYWx1ZVN0cmluZyhjaGFyX3R5cGUsIG5kazo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOwotICBFWFBFQ1RfRVEoIidcXDAnIiwgZGVmYXVsdF92YWx1ZS0+VmFsdWVTdHJpbmcoY2hhcl90eXBlLCBqYXZhOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7CisgIGF1dG8gY2hhcl90eXBlID0gdHlwZW5hbWVzXy5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgImNoYXIiLCBmYWxzZSk7CisgIGF1dG8gZGVmYXVsdF92YWx1ZSA9IHVuaXF1ZV9wdHI8QWlkbENvbnN0YW50VmFsdWU+KEFpZGxDb25zdGFudFZhbHVlOjpEZWZhdWx0KCpjaGFyX3R5cGUpKTsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIGRlZmF1bHRfdmFsdWUtPlZhbHVlU3RyaW5nKCpjaGFyX3R5cGUsIGNwcDo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworICBFWFBFQ1RfRVEoIidcXDAnIiwgZGVmYXVsdF92YWx1ZS0+VmFsdWVTdHJpbmcoKmNoYXJfdHlwZSwgbmRrOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7CisgIEVYUEVDVF9FUSgiJ1xcMCciLCBkZWZhdWx0X3ZhbHVlLT5WYWx1ZVN0cmluZygqY2hhcl90eXBlLCBqYXZhOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7CiB9CiAKIFRFU1RfUChBaWRsVGVzdCwgRmFpbE9uTWFueURlZmluZWRUeXBlcykgewpAQCAtMTE3MSwxMCArMTQ4MSw0NyBAQAogICBFWFBFQ1RfRVEoIi0xIiwgY3BwX2NvbnN0YW50c1swXS0+VmFsdWVTdHJpbmcoY3BwOjpDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7CiB9CiAKLVRFU1RfUChBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRQYXJjZWxhYmxlcykgewotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKAotICAgICAgInAvT3V0ZXIuYWlkbCIsCi0gICAgICAicGFja2FnZSBwOyBwYXJjZWxhYmxlIE91dGVyLklubmVyIGNwcF9oZWFkZXIgXCJiYXovaGVhZGVyXCI7Iik7CitURVNUX0YoQWlkbFRlc3QsIEJ5dGVBbmRCeXRlQXJyYXlEaWZmZXJJbkNwcCkgeworICBhdXRvIHR5cGUgPSBQYXJzZSgicC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgIFIiKAorICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgcDsKKyAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlIEZvbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGEgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0gey0xLCAxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBudWxsYWJsZSBieXRlW10gYyA9IHstMSwgMX07CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApIiwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCk7CisgIEFTU0VSVF9ORShudWxscHRyLCB0eXBlKTsKKyAgYXV0byYgZmllbGRzID0gdHlwZS0+R2V0RmllbGRzKCk7CisgIEFTU0VSVF9FUSgzdWwsIGZpZWxkcy5zaXplKCkpOworICBFWFBFQ1RfRVEoIi0xIiwgZmllbGRzWzBdLT5WYWx1ZVN0cmluZyhjcHA6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKKyAgRVhQRUNUX0VRKCJ7dWludDhfdCgtMSksIDF9IiwgZmllbGRzWzFdLT5WYWx1ZVN0cmluZyhjcHA6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKKyAgRVhQRUNUX0VRKCJ7e3VpbnQ4X3QoLTEpLCAxfX0iLCBmaWVsZHNbMl0tPlZhbHVlU3RyaW5nKGNwcDo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEJ5dGVBbmRCeXRlQXJyYXlEaWZmZXJJbk5kaykgeworICBhdXRvIHR5cGUgPSBQYXJzZSgicC9Gb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgIFIiKAorICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgcDsKKyAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlIEZvbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGEgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0gey0xLCAxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBudWxsYWJsZSBieXRlW10gYyA9IHstMSwgMX07CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApIiwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESyk7CisgIEFTU0VSVF9ORShudWxscHRyLCB0eXBlKTsKKyAgYXV0byYgZmllbGRzID0gdHlwZS0+R2V0RmllbGRzKCk7CisgIEFTU0VSVF9FUSgzdWwsIGZpZWxkcy5zaXplKCkpOworICBFWFBFQ1RfRVEoIi0xIiwgZmllbGRzWzBdLT5WYWx1ZVN0cmluZyhuZGs6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKKyAgRVhQRUNUX0VRKCJ7dWludDhfdCgtMSksIDF9IiwgZmllbGRzWzFdLT5WYWx1ZVN0cmluZyhuZGs6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3IpKTsKKyAgRVhQRUNUX0VRKCJ7e3VpbnQ4X3QoLTEpLCAxfX0iLCBmaWVsZHNbMl0tPlZhbHVlU3RyaW5nKG5kazo6Q29uc3RhbnRWYWx1ZURlY29yYXRvcikpOworfQorCitURVNUX1AoQWlkbFRlc3QsIFVuZGVyc3RhbmRzTmVzdGVkVW5zdHJ1Y3R1cmVkUGFyY2VsYWJsZXMpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9PdXRlci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBwYXJjZWxhYmxlIE91dGVyLklubmVyIGNwcF9oZWFkZXIgXCJiYXovaGVhZGVyXCI7Iik7CiAgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CiAgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKICAgY29uc3Qgc3RyaW5nIGlucHV0ID0gInBhY2thZ2UgcDsgaW1wb3J0IHAuT3V0ZXI7IGludGVyZmFjZSBJRm9vIgpAQCAtMTE4NSwxMCArMTUzMiw0ODIgQEAKIAogICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5PdXRlci5Jbm5lciIpLmlzX3Jlc29sdmVkKTsKICAgLy8gQysrIHVzZXMgIjo6IiBpbnN0ZWFkIG9mICIuIiB0byByZWZlciB0byBhIGlubmVyIGNsYXNzLgotICBBaWRsVHlwZVNwZWNpZmllciBuZXN0ZWRfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJwLk91dGVyLklubmVyIiwgZmFsc2UsIG51bGxwdHIsIHt9KTsKKyAgQWlkbFR5cGVTcGVjaWZpZXIgbmVzdGVkX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAicC5PdXRlci5Jbm5lciIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHt9KTsKICAgRVhQRUNUX0VRKCI6OnA6Ok91dGVyOjpJbm5lciIsIGNwcDo6Q3BwTmFtZU9mKG5lc3RlZF90eXBlLCB0eXBlbmFtZXNfKSk7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRVbnN0cnVjdHVyZWRQYXJjZWxhYmxlc1dpdGhvdXRJbXBvcnRzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvT3V0ZXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBPdXRlci5Jbm5lciBjcHBfaGVhZGVyIFwiYmF6L2hlYWRlclwiOyIpOworICBpbXBvcnRfcGF0aHNfLmVtcGxhY2UoIiIpOworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9ICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsgcC5PdXRlci5Jbm5lciBnZXQoKTsgfSI7CisKKyAgYXV0byBwYXJzZV9yZXN1bHQgPSBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYXJzZV9yZXN1bHQpOworCisgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLk91dGVyLklubmVyIikuaXNfcmVzb2x2ZWQpOworICAvLyBDKysgdXNlcyAiOjoiIGluc3RlYWQgb2YgIi4iIHRvIHJlZmVyIHRvIGEgaW5uZXIgY2xhc3MuCisgIEFpZGxUeXBlU3BlY2lmaWVyIG5lc3RlZF90eXBlKEFJRExfTE9DQVRJT05fSEVSRSwgInAuT3V0ZXIuSW5uZXIiLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB7fSk7CisgIEVYUEVDVF9FUSgiOjpwOjpPdXRlcjo6SW5uZXIiLCBjcHA6OkNwcE5hbWVPZihuZXN0ZWRfdHlwZSwgdHlwZW5hbWVzXykpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFVuZGVyc3RhbmRzTmVzdGVkVHlwZXMpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JT3V0ZXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElPdXRlciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcGFyY2VsYWJsZSBJbm5lciB7fVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAiaW1wb3J0IHAuSU91dGVyO1xuIgorICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKKyAgICAgICIgIElPdXRlci5Jbm5lciBnZXQoKTtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKworICBFWFBFQ1RfVFJVRSh0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5JT3V0ZXIuSW5uZXIiKS5pc19yZXNvbHZlZCk7CisgIC8vIEMrKyB1c2VzICI6OiIgaW5zdGVhZCBvZiAiLiIgdG8gcmVmZXIgdG8gYSBpbm5lciBjbGFzcy4KKyAgQWlkbFR5cGVTcGVjaWZpZXIgbmVzdGVkX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAicC5JT3V0ZXIuSW5uZXIiLCAvKmFycmF5PSovc3RkOjpudWxsb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB7fSk7CisgIEVYUEVDVF9FUSgiOjpwOjpJT3V0ZXI6OklubmVyIiwgY3BwOjpDcHBOYW1lT2YobmVzdGVkX3R5cGUsIHR5cGVuYW1lc18pKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBEZWZpbmVkVHlwZUtub3dzSXRzUGFyZW50U2NvcGUpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlIElubmVyIHtcbiIKKyAgICAgICIgICAgZW51bSBFbnVtIHsgQSB9XG4iCisgICAgICAiICB9XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisKKyAgYXV0byBlbnVtX3R5cGUgPSB0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgicC5JRm9vLklubmVyLkVudW0iKTsKKyAgYXV0byBpbm5lcl90eXBlID0gdHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuSUZvby5Jbm5lciIpOworICBhdXRvIGlmb29fdHlwZSA9IHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLklGb28iKTsKKyAgRVhQRUNUX1RSVUUoZW51bV90eXBlLmlzX3Jlc29sdmVkKTsKKyAgRVhQRUNUX1RSVUUoaW5uZXJfdHlwZS5pc19yZXNvbHZlZCk7CisgIEVYUEVDVF9UUlVFKGlmb29fdHlwZS5pc19yZXNvbHZlZCk7CisgIC8vIEdldFBhcmVudFR5cGUoKQorICBFWFBFQ1RfRVEoaW5uZXJfdHlwZS5kZWZpbmVkX3R5cGUsIGVudW1fdHlwZS5kZWZpbmVkX3R5cGUtPkdldFBhcmVudFR5cGUoKSk7CisgIEVYUEVDVF9FUShpZm9vX3R5cGUuZGVmaW5lZF90eXBlLCBpbm5lcl90eXBlLmRlZmluZWRfdHlwZS0+R2V0UGFyZW50VHlwZSgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGlmb29fdHlwZS5kZWZpbmVkX3R5cGUtPkdldFBhcmVudFR5cGUoKSk7CisgIC8vIEdldFJvb3RUeXBlKCkKKyAgRVhQRUNUX0VRKGlmb29fdHlwZS5kZWZpbmVkX3R5cGUsIGVudW1fdHlwZS5kZWZpbmVkX3R5cGUtPkdldFJvb3RUeXBlKCkpOworICBFWFBFQ1RfRVEoaWZvb190eXBlLmRlZmluZWRfdHlwZSwgaW5uZXJfdHlwZS5kZWZpbmVkX3R5cGUtPkdldFJvb3RUeXBlKCkpOworICBFWFBFQ1RfRVEoaWZvb190eXBlLmRlZmluZWRfdHlwZSwgaWZvb190eXBlLmRlZmluZWRfdHlwZS0+R2V0Um9vdFR5cGUoKSk7CisgIC8vIEdldERvY3VtZW50KCkKKyAgYXV0byBtYWluX2RvY3VtZW50ID0gJnR5cGVuYW1lc18uTWFpbkRvY3VtZW50KCk7CisgIEVYUEVDVF9FUShtYWluX2RvY3VtZW50LCAmZW51bV90eXBlLmRlZmluZWRfdHlwZS0+R2V0RG9jdW1lbnQoKSk7CisgIEVYUEVDVF9FUShtYWluX2RvY3VtZW50LCAmaW5uZXJfdHlwZS5kZWZpbmVkX3R5cGUtPkdldERvY3VtZW50KCkpOworICBFWFBFQ1RfRVEobWFpbl9kb2N1bWVudCwgJmlmb29fdHlwZS5kZWZpbmVkX3R5cGUtPkdldERvY3VtZW50KCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFVuZGVyc3RhbmRzTmVzdGVkVHlwZXNWaWFGdWxseVF1YWxpZmllZE5hbWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JT3V0ZXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElPdXRlciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcGFyY2VsYWJsZSBJbm5lciB7fVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGltcG9ydF9wYXRoc18uZW1wbGFjZSgiIik7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgIiAgcC5JT3V0ZXIuSW5uZXIgZ2V0KCk7XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisKKyAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuSU91dGVyLklubmVyIikuaXNfcmVzb2x2ZWQpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEluY2x1ZGVQYXJlbnRzUmF3SGVhZGVyRm9yTmVzdGVkSW50ZXJmYWNlKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJwL091dGVyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIE91dGVyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludGVyZmFjZSBJSW5uZXIge31cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKworICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworICBhdXRvIHJlc29sdmVkID0gdHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuT3V0ZXIuSUlubmVyIik7CisgIEFTU0VSVF9UUlVFKHJlc29sdmVkLmRlZmluZWRfdHlwZSk7CisgIEVYUEVDVF9FUShjcHA6OkhlYWRlckZpbGUoKnJlc29sdmVkLmRlZmluZWRfdHlwZSwgY3BwOjpDbGFzc05hbWVzOjpDTElFTlQpLCAicC9PdXRlci5oIik7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRUeXBlc1ZpYUZ1bGx5UXVhbGlmaWVkSW1wb3J0KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSU91dGVyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJT3V0ZXIge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHBhcmNlbGFibGUgSW5uZXIge31cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBpbXBvcnRfcGF0aHNfLmVtcGxhY2UoIiIpOworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImltcG9ydCBwLklPdXRlci5Jbm5lcjsiCisgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgIiAgSW5uZXIgZ2V0KCk7XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisKKyAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuSU91dGVyLklubmVyIikuaXNfcmVzb2x2ZWQpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFVuZGVyc3RhbmRzTmVzdGVkVHlwZXNJblRoZVNhbWVTY29wZSkgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGUgUmVzdWx0IHt9XG4iCisgICAgICAiICBSZXN1bHQgZ2V0KCk7XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisKKyAgRVhQRUNUX1RSVUUodHlwZW5hbWVzXy5SZXNvbHZlVHlwZW5hbWUoInAuSUZvby5SZXN1bHQiKS5pc19yZXNvbHZlZCk7Cit9CisKKy8vIEZpbmRpbmcgdGhlIHR5cGUgb2YgbmVzdGVkIG5hbWVkIG1lbWJlci4KK3N0cnVjdCBUeXBlRmluZGVyIDogQWlkbFZpc2l0b3IgeworICBzdHJpbmcgbmFtZTsKKyAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIqIHR5cGUgPSBudWxscHRyOworICBUeXBlRmluZGVyKHN0ZDo6c3RyaW5nIG5hbWUpIDogbmFtZShuYW1lKSB7fQorICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxWYXJpYWJsZURlY2xhcmF0aW9uJiB2KSBvdmVycmlkZSB7CisgICAgaWYgKHYuR2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgIHR5cGUgPSAmdi5HZXRUeXBlKCk7CisgICAgfQorICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbE1ldGhvZCYgbSkgb3ZlcnJpZGUgeworICAgIGlmIChtLkdldE5hbWUoKSA9PSBuYW1lKSB7CisgICAgICB0eXBlID0gJm0uR2V0VHlwZSgpOworICAgIH0KKyAgfQorICBzdGF0aWMgc3RyaW5nIEdldChjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICAgIFR5cGVGaW5kZXIgdihuYW1lKTsKKyAgICBWaXNpdFRvcERvd24odiwgdHlwZSk7CisgICAgcmV0dXJuIHYudHlwZSA/IHYudHlwZS0+U2lnbmF0dXJlKCkgOiAiKG51bGwpIjsKKyAgfTsKK307CisKK1RFU1RfRihBaWRsVGVzdCwgVW5kZXJzdGFuZHNOZXN0ZWRUeXBlc1ZpYVF1YWxpZmllZEluVGhlU2FtZVNjb3BlKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInEvSUJhci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBxO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcGFyY2VsYWJsZSBCYXoge31cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBpbXBvcnRfcGF0aHNfLmVtcGxhY2UoIiIpOworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0lGb28uYWlkbCI7CisgIGNvbnN0IHN0cmluZyBpbnB1dCA9CisgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgImltcG9ydCBxLklCYXI7XG4iCisgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgIiAgcGFyY2VsYWJsZSBOZXN0ZWQge1xuIgorICAgICAgIiAgICBCYXogdDE7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBwYXJjZWxhYmxlIEJheiB7IH1cbiIKKyAgICAgICIgIElCYXIuQmF6IHQyKCk7XG4iCisgICAgICAiICBCYXogdDMoKTtcbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBhdXRvIGZvbyA9IFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIGZvbyk7CisKKyAgRVhQRUNUX0VRKFR5cGVGaW5kZXI6OkdldCgqZm9vLCAidDEiKSwgInAuSUZvby5CYXoiKTsKKyAgRVhQRUNUX0VRKFR5cGVGaW5kZXI6OkdldCgqZm9vLCAidDIiKSwgInEuSUJhci5CYXoiKTsKKyAgRVhQRUNUX0VRKFR5cGVGaW5kZXI6OkdldCgqZm9vLCAidDMiKSwgInAuSUZvby5CYXoiKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBOZXN0ZWRUeXBlUmVzb2x1dGlvbldpdGhOb1BhY2thZ2UpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAiRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGUgQmFyIHtcbiIKKyAgICAgICIgICAgZW51bSBCYXogeyBCQVogfVxuIgorICAgICAgIiAgICBCYXogYmF6ID0gQmF6LkJBWjtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIEJhciBiYXI7XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBmb28gPSBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7CisgIEFTU0VSVF9ORShudWxscHRyLCBmb28pOworCisgIEVYUEVDVF9FUShUeXBlRmluZGVyOjpHZXQoKmZvbywgImJhciIpLCAiRm9vLkJhciIpOworICBFWFBFQ1RfRVEoVHlwZUZpbmRlcjo6R2V0KCpmb28sICJiYXoiKSwgIkZvby5CYXIuQmF6Iik7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0c05lc3RlZFR5cGVzV2l0aFBhcmVudHNOYW1lKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJwYXJjZWxhYmxlIEZvbyB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlIEZvbyB7fVxuIgorICAgICAgIn0iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIk5lc3RlZCB0eXBlICdGb28nIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGl0cyBwYXJlbnQuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdFVuc3RydWN0dXJlZFBhcmNlbGFibGVBc05lc3RlZFR5cGVzKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgIiAgcGFyY2VsYWJsZSBCYXIgY3BwX2hlYWRlciBcIkJhci5oXCI7XG4iCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiVW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzIHNob3VsZCBiZSBhdCB0aGUgcm9vdCBzY29wZSIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RHZW5lcmljVHlwZVdpdGhOZXN0ZWRUeXBlcykgeworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJwL0Zvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAicGFyY2VsYWJsZSBGb288VD4ge1xuIgorICAgICAgIiAgcGFyY2VsYWJsZSBCYXIge31cbiIKKyAgICAgICJ9IjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJHZW5lcmljIHR5cGVzIGNhbid0IGhhdmUgbmVzdGVkIHR5cGVzLiIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBIYW5kbGVTeW50YXhFcnJvcnNJbk5lc3RlZERlY2wpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlO1xuIiAgLy8gbWlzc2luZyBpZGVudGlmaWVyCisgICAgICAifSI7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiZXhwZWN0aW5nIGlkZW50aWZpZXIiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0c05lc3RlZFR5cGVzV2l0aER1cGxpY2F0ZU5hbWVzKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbnRlcmZhY2UgRm9vIHtcbiIKKyAgICAgICIgIHBhcmNlbGFibGUgQmFyIHt9XG4iCisgICAgICAiICBwYXJjZWxhYmxlIEJhciB7fVxuIgorICAgICAgIn0iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBQYXJzZShpbnB1dF9wYXRoLCBpbnB1dCwgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIlJlZGVmaW5pdGlvbiBvZiAnQmFyJyIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBUeXBlUmVzb2x1dGlvbldpdGhNdWx0aXBsZUxldmVsc09mTmVzdGluZykgeworICBzdHJ1Y3QgRmFpbHVyZSB7CisgICAgc3RyaW5nIGVycjsKKyAgfTsKKyAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICBzdHJpbmcgdHlwZTsKKyAgICB2YXJpYW50PHN0cmluZywgRmFpbHVyZT4gZXhwZWN0ZWQ7ICAvLyBzdWNjZXNzPDA+IG9yIGZhaWx1cmU8MT4KKyAgfTsKKyAgdmVjdG9yPFRlc3RDYXNlPiBjYXNlcyA9IHsKKyAgICAgIHsiZm9vLkEiLCAiZm9vLkEifSwKKyAgICAgIHsiZm9vLkEuQiIsICJmb28uQS5CIn0sCisgICAgICB7IkBudWxsYWJsZShoZWFwPXRydWUpIEEiLCAiZm9vLkEuQi5BIn0sCisgICAgICAvLyBJbiB0aGUgc2NvcGUgb2YgZm9vLkEuQi5BLCBCIGlzIHJlc29sdmVkIHRvIEEuQi5BLkIgZmlyc3QuCisgICAgICB7IkIuQSIsIEZhaWx1cmV7IkZhaWxlZCB0byByZXNvbHZlICdCLkEnIn19LAorICAgICAgeyJCIiwgImZvby5BLkIuQS5CIn0sCisgICAgICB7IkEuQiIsICJmb28uQS5CLkEuQiJ9LAorICB9OworICBjb25zdCBzdHJpbmcgaW5wdXRfcGF0aCA9ICJmb28vQS5haWRsIjsKKyAgZm9yIChhdXRvJiBbdHlwZSwgZXhwZWN0ZWRdIDogY2FzZXMpIHsKKyAgICBBaWRsVHlwZW5hbWVzIHR5cGVuYW1lczsKKyAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgY29uc3Qgc3RyaW5nIGlucHV0ID0KKyAgICAgICAgInBhY2thZ2UgZm9vO1xuIgorICAgICAgICAicGFyY2VsYWJsZSBBIHtcbiIKKyAgICAgICAgIiAgcGFyY2VsYWJsZSBCIHtcbiIKKyAgICAgICAgIiAgICBwYXJjZWxhYmxlIEEge1xuIgorICAgICAgICAiICAgICAgcGFyY2VsYWJsZSBCIHtcbiIKKyAgICAgICAgIiAgICAgIH1cbiIKKyAgICAgICAgIiAgICAgICIgKyB0eXBlICsgIiBtO1xuIgorICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgIiAgfVxuIgorICAgICAgICAifSI7CisgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgQ2FwdHVyZVN0ZGVycigpOworICAgIGF1dG8gZm9vID0gUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lcywgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCk7CisgICAgaWYgKGF1dG8gZmFpbHVyZSA9IHN0ZDo6Z2V0X2lmPEZhaWx1cmU+KCZleHBlY3RlZCk7IGZhaWx1cmUpIHsKKyAgICAgIEFTU0VSVF9FUShudWxscHRyLCBmb28pOworICAgICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKGZhaWx1cmUtPmVycikpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworICAgICAgQVNTRVJUX05FKG51bGxwdHIsIGZvbyk7CisgICAgICBFWFBFQ1RfRVEoVHlwZUZpbmRlcjo6R2V0KCpmb28sICJtIiksIHN0ZDo6Z2V0PHN0cmluZz4oZXhwZWN0ZWQpKTsKKyAgICB9CisgIH0KK30KKworVEVTVF9GKEFpZGxUZXN0LCBIZWFkZXJGb3JOZXN0ZWRUeXBlU2hvdWxkUG9pbnRUb1RvcE1vc3RQYXJlbnQpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPQorICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICJpbnRlcmZhY2UgSUZvbyB7XG4iCisgICAgICAiICBwYXJjZWxhYmxlIFJlc3VsdCB7fVxuIgorICAgICAgIn0iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIGF1dG8gZm9vID0gUGFyc2UoaW5wdXRfcGF0aCwgaW5wdXQsIHR5cGVuYW1lc18sIE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApOworICBBU1NFUlRfTkUobnVsbHB0ciwgZm9vKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKworICBhdXRvIHJlc3VsdCA9IHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLklGb28uUmVzdWx0IikuZGVmaW5lZF90eXBlOworICBBU1NFUlRfTkUobnVsbHB0ciwgcmVzdWx0KTsKKyAgRVhQRUNUX0VRKCJwL0lGb28uaCIsIGNwcDo6Q3BwSGVhZGVyRm9yVHlwZSgqcmVzdWx0KSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVvcmRlck5lc3RlZFR5cGVzRm9yQ3BwT3V0cHV0KSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvSUZvby5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0gUiIoCisgICAgcGFja2FnZSBwOworICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgIC8vIHBhcnRpYWwgb3JkZXJpbmdzIGZvciBbQSwgRCwgR106CisgICAgICAvLyAgIEQgLSBBCisgICAgICAvLyAgIEEgLSBHCisgICAgICBwYXJjZWxhYmxlIEEgeworICAgICAgICAvLyBwYXJ0aWFsIG9yZGVyaW5ncyBmb3IgW0IsIENdOgorICAgICAgICAvLyAgIEMgLSBCCisgICAgICAgIHBhcmNlbGFibGUgQiB7CisgICAgICAgICAgQyBjOworICAgICAgICAgIEQuRSBkOworICAgICAgICB9CisgICAgICAgIHBhcmNlbGFibGUgQyB7fQorICAgICAgfQorICAgICAgcGFyY2VsYWJsZSBEIHsKKyAgICAgICAgLy8gcGFydGlhbCBvcmRlcmluZ3MgZm9yIFtFLCBGXToKKyAgICAgICAgLy8gICBGIC0gRQorICAgICAgICBwYXJjZWxhYmxlIEUgeworICAgICAgICAgIEYgZjsKKyAgICAgICAgfQorICAgICAgICBwYXJjZWxhYmxlIEYge30KKyAgICAgIH0KKyAgICAgIHBhcmNlbGFibGUgRyB7CisgICAgICAgIEEuQiBiOworICAgICAgfQorICAgIH0KKyAgKSI7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nIGNwcCAtSS4gLW9vdXQgLWhvdXQgcC9JRm9vLmFpZGwiKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhpbnB1dF9wYXRoLCBpbnB1dCk7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgIiIpOworCisgIHN0cmluZyBjb2RlOworICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJvdXQvcC9JRm9vLmgiLCAmY29kZSkpOworICAvLyBjaGVjayBwYXJ0aWFsIG9yZGVyaW5nczogYSBzaG91bGQgY29tZXMgYmVmb3JlIGIKKyAgRVhQRUNUX0xFKGNvZGUuZmluZCgiY2xhc3MgRCIpLCBjb2RlLmZpbmQoImNsYXNzIEEiKSk7CisgIEVYUEVDVF9MRShjb2RlLmZpbmQoImNsYXNzIEEiKSwgY29kZS5maW5kKCJjbGFzcyBHIikpOworICBFWFBFQ1RfTEUoY29kZS5maW5kKCJjbGFzcyBDIiksIGNvZGUuZmluZCgiY2xhc3MgQiIpKTsKKyAgRVhQRUNUX0xFKGNvZGUuZmluZCgiY2xhc3MgRiIpLCBjb2RlLmZpbmQoImNsYXNzIEUiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0c05lc3RlZFR5cGVzV2l0aEN5Y2xpY0RlcHMpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X3BhdGggPSAicC9JRm9vLmFpZGwiOworICBjb25zdCBzdHJpbmcgaW5wdXQgPSBSIigKKyAgICBwYWNrYWdlIHA7CisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgLy8gQ3ljbGVzOgorICAgICAgLy8gICBEIC0gQQorICAgICAgLy8gICBBIC0gRworICAgICAgLy8gICBHIC0gRAorICAgICAgcGFyY2VsYWJsZSBBIHsKKyAgICAgICAgcGFyY2VsYWJsZSBCIHsKKyAgICAgICAgICBDIGM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBhcmNlbGFibGUgQyB7CisgICAgICAgIHBhcmNlbGFibGUgRCB7CisgICAgICAgICAgRSBlOworICAgICAgICB9CisgICAgICB9CisgICAgICBwYXJjZWxhYmxlIEUgeworICAgICAgICBwYXJjZWxhYmxlIEYgeworICAgICAgICAgIEEgYTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgKSI7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nIGNwcCAtSS4gLW9vdXQgLWhvdXQgcC9JRm9vLmFpZGwiKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhpbnB1dF9wYXRoLCBpbnB1dCk7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJJRm9vIGhhcyBuZXN0ZWQgdHlwZXMgd2l0aCBjeWNsaWMgcmVmZXJlbmNlcy4iKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQ3BwTmFtZU9mX0dlbmVyaWNUeXBlKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9wYXRoID0gInAvV3JhcHBlci5haWRsIjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0gInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBXcmFwcGVyPFQ+IHt9IjsKKworICBhdXRvIHBhcnNlX3Jlc3VsdCA9IFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBPcHRpb25zOjpMYW5ndWFnZTo6Q1BQKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhcnNlX3Jlc3VsdCk7CisKKyAgYXV0byB0eXBlID0gW10oc3RkOjpzdHJpbmcgbmFtZSwgYXV0byYmLi4uIHR5cGVfcGFyYW1zKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+IHsKKyAgICBhdXRvIHBhcmFtcyA9IG5ldyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+PjsKKyAgICAoLi4uLCBwYXJhbXMtPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUodHlwZV9wYXJhbXMpKSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QWlkbFR5cGVTcGVjaWZpZXI+KEFJRExfTE9DQVRJT05fSEVSRSwgbmFtZSwgc3RkOjpudWxsb3B0LCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRze30pOworICB9OworCisgIGF1dG8gc2V0X251bGxhYmxlID0gW10oc3RkOjp1bmlxdWVfcHRyPEFpZGxUeXBlU3BlY2lmaWVyPiYmIHR5cGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFubm90YXRpb24+PiBhbm5vdGF0aW9uczsKKyAgICBhbm5vdGF0aW9ucy5lbXBsYWNlX2JhY2soc3RkOjp1bmlxdWVfcHRyPEFpZGxBbm5vdGF0aW9uPigKKyAgICAgICAgQWlkbEFubm90YXRpb246OlBhcnNlKEFJRExfTE9DQVRJT05fSEVSRSwgIm51bGxhYmxlIiwge30sIHt9KSkpOworICAgIHR5cGUtPkFubm90YXRlKHN0ZDo6bW92ZShhbm5vdGF0aW9ucykpOworICAgIHJldHVybiBzdGQ6Om1vdmUodHlwZSk7CisgIH07CisKKyAgYXV0byBzZXRfYXJyYXkgPSBbXShzdGQ6OnVuaXF1ZV9wdHI8QWlkbFR5cGVTcGVjaWZpZXI+JiYgdHlwZSkgeworICAgICh2b2lkKXR5cGUtPk1ha2VBcnJheShEeW5hbWljQXJyYXl7fSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZSh0eXBlKTsKKyAgfTsKKworICBhdXRvIHcgPSB0eXBlKCJwLldyYXBwZXIiLCB0eXBlKCJTdHJpbmciKSk7CisgIEVYUEVDVF9FUSgiOjpwOjpXcmFwcGVyPDo6YW5kcm9pZDo6U3RyaW5nMTY+IiwgY3BwOjpDcHBOYW1lT2YoKncsIHR5cGVuYW1lc18pKTsKKworICBhdXRvIG51bGxhYmxlX3cgPSBzZXRfbnVsbGFibGUodHlwZSgicC5XcmFwcGVyIiwgdHlwZSgiU3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKCI6OnN0ZDo6b3B0aW9uYWw8OjpwOjpXcmFwcGVyPDo6YW5kcm9pZDo6U3RyaW5nMTY+PiIsCisgICAgICAgICAgICBjcHA6OkNwcE5hbWVPZigqbnVsbGFibGVfdywgdHlwZW5hbWVzXykpOworCisgIGF1dG8gYXJyYXlfdyA9IHNldF9hcnJheSh0eXBlKCJwLldyYXBwZXIiLCB0eXBlKCJTdHJpbmciKSkpOworICBFWFBFQ1RfRVEoIjo6c3RkOjp2ZWN0b3I8OjpwOjpXcmFwcGVyPDo6YW5kcm9pZDo6U3RyaW5nMTY+PiIsCisgICAgICAgICAgICBjcHA6OkNwcE5hbWVPZigqYXJyYXlfdywgdHlwZW5hbWVzXykpOworCisgIGF1dG8gbnVsbGFibGVfYXJyYXlfdyA9IHNldF9udWxsYWJsZShzZXRfYXJyYXkodHlwZSgicC5XcmFwcGVyIiwgdHlwZSgiU3RyaW5nIikpKSk7CisgIEVYUEVDVF9FUSgiOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6cDo6V3JhcHBlcjw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+PiIsCisgICAgICAgICAgICBjcHA6OkNwcE5hbWVPZigqbnVsbGFibGVfYXJyYXlfdywgdHlwZW5hbWVzXykpOworCisgIGF1dG8gbGlzdF93ID0gdHlwZSgiTGlzdCIsIHR5cGUoInAuV3JhcHBlciIsIHR5cGUoIlN0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiOjpzdGQ6OnZlY3Rvcjw6OnA6OldyYXBwZXI8OjphbmRyb2lkOjpTdHJpbmcxNj4+IiwKKyAgICAgICAgICAgIGNwcDo6Q3BwTmFtZU9mKCpsaXN0X3csIHR5cGVuYW1lc18pKTsKKworICBhdXRvIG51bGxhYmxlX2xpc3RfdyA9IHNldF9udWxsYWJsZSh0eXBlKCJMaXN0IiwgdHlwZSgicC5XcmFwcGVyIiwgdHlwZSgiU3RyaW5nIikpKSk7CisgIEVYUEVDVF9FUSgiOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6cDo6V3JhcHBlcjw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+PiIsCisgICAgICAgICAgICBjcHA6OkNwcE5hbWVPZigqbnVsbGFibGVfbGlzdF93LCB0eXBlbmFtZXNfKSk7Cit9CisKIFRFU1RfUChBaWRsVGVzdCwgVW5kZXJzdGFuZHNOYXRpdmVQYXJjZWxhYmxlcykgewogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKAogICAgICAgInAvQmFyLmFpZGwiLApAQCAtMTE5OSwxMCArMjAxOCwxMCBAQAogICBhdXRvIHBhcnNlX3Jlc3VsdCA9IFBhcnNlKGlucHV0X3BhdGgsIGlucHV0LCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIHBhcnNlX3Jlc3VsdCk7CiAgIEVYUEVDVF9UUlVFKHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJwLkJhciIpLmlzX3Jlc29sdmVkKTsKLSAgQWlkbFR5cGVTcGVjaWZpZXIgbmF0aXZlX3R5cGUoQUlETF9MT0NBVElPTl9IRVJFLCAicC5CYXIiLCBmYWxzZSwgbnVsbHB0ciwge30pOwotICBuYXRpdmVfdHlwZS5SZXNvbHZlKHR5cGVuYW1lc18pOworICBBaWRsVHlwZVNwZWNpZmllciBuYXRpdmVfdHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJwLkJhciIsIC8qYXJyYXk9Ki9zdGQ6Om51bGxvcHQsIG51bGxwdHIsIHt9KTsKKyAgbmF0aXZlX3R5cGUuUmVzb2x2ZSh0eXBlbmFtZXNfLCBwYXJzZV9yZXN1bHQpOwogCi0gIEVYUEVDVF9FUSgicC5CYXIiLCBqYXZhOjpJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YobmF0aXZlX3R5cGUsIHR5cGVuYW1lc18pKTsKKyAgRVhQRUNUX0VRKCJwLkJhciIsIGphdmE6Okluc3RhbnRpYWJsZUphdmFTaWduYXR1cmVPZihuYXRpdmVfdHlwZSkpOwogICAvLyBDKysgdW5kZXJzdGFuZHMgQysrIHNwZWNpZmljIHN0dWZmCiAgIEVYUEVDVF9FUSgiOjpwOjpCYXIiLCBjcHA6OkNwcE5hbWVPZihuYXRpdmVfdHlwZSwgdHlwZW5hbWVzXykpOwogICBzZXQ8c3RyaW5nPiBoZWFkZXJzOwpAQCAtMTIyMiw3ICsyMDQxLDcgQEAKICAgICAicC9JRm9vLmFpZGwifTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLCAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgc3RyaW5nIGFjdHVhbF9kZXBfZmlsZV9jb250ZW50czsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cyhvcHRpb25zLkRlcGVuZGVuY3lGaWxlKCksICZhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMpKTsKICAgRVhQRUNUX0VRKGFjdHVhbF9kZXBfZmlsZV9jb250ZW50cywga0V4cGVjdGVkRGVwRmlsZUNvbnRlbnRzKTsKQEAgLTEyNDAsNyArMjA1OSw3IEBACiAgICAgInAvSUZvby5haWRsIn07CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oYXJncyk7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMob3B0aW9ucy5JbnB1dEZpbGVzKCkuZnJvbnQoKSwgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28ge30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIHN0cmluZyBhY3R1YWxfZGVwX2ZpbGVfY29udGVudHM7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMob3B0aW9ucy5EZXBlbmRlbmN5RmlsZSgpLCAmYWN0dWFsX2RlcF9maWxlX2NvbnRlbnRzKSk7CiAgIEVYUEVDVF9FUShhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMsIGtFeHBlY3RlZE5pbmphRGVwRmlsZUNvbnRlbnRzKTsKQEAgLTEyNTksNyArMjA3OCw3IEBACiAgICAgInAvRm9vLmFpZGwifTsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbzsiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIHN0cmluZyBhY3R1YWxfZGVwX2ZpbGVfY29udGVudHM7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMob3B0aW9ucy5EZXBlbmRlbmN5RmlsZSgpLCAmYWN0dWFsX2RlcF9maWxlX2NvbnRlbnRzKSk7CiAgIEVYUEVDVF9FUShhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMsIGtFeHBlY3RlZFBhcmNlbGFibGVEZWNsYXJhdGlvbkRlcEZpbGVDb250ZW50cyk7CkBAIC0xMjc0LDcgKzIwOTMsNyBAQAogICAgICJwL0Zvby5haWRsIn07CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oYXJncyk7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMob3B0aW9ucy5JbnB1dEZpbGVzKCkuZnJvbnQoKSwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBGb28ge2ludCBhO30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIHN0cmluZyBhY3R1YWxfZGVwX2ZpbGVfY29udGVudHM7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMob3B0aW9ucy5EZXBlbmRlbmN5RmlsZSgpLCAmYWN0dWFsX2RlcF9maWxlX2NvbnRlbnRzKSk7CiAgIEVYUEVDVF9FUShhY3R1YWxfZGVwX2ZpbGVfY29udGVudHMsIGtFeHBlY3RlZFN0cnVjdHVyZWRQYXJjZWxhYmxlRGVwRmlsZUNvbnRlbnRzKTsKQEAgLTEyODgsMTkgKzIxMDcsMTYgQEAKICAgICAicC9Gb28uYWlkbCJ9OwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGFyZ3MpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKG9wdGlvbnMuSW5wdXRGaWxlcygpLmZyb250KCksICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgRm9vOyIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgc3RyaW5nIG91dHB1dF9maWxlX2NvbnRlbnRzOwogICBFWFBFQ1RfRkFMU0UoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cyhvcHRpb25zLk91dHB1dEZpbGUoKSwgJm91dHB1dF9maWxlX2NvbnRlbnRzKSk7CiB9CiAKIFRFU1RfUChBaWRsVGVzdCwgUmVqZWN0c0xpc3RBcnJheSkgewotICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0gIkVSUk9SOiBhL0Zvby5haWRsOjIuMS03OiBMaXN0W10gaXMgbm90IHN1cHBvcnRlZC5cbiI7Ci0gIGNvbnN0IHN0cmluZyBsaXN0X2FycmF5X3BhcmNlbGFibGUgPQotICAgICAgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBGb28ge1xuIgotICAgICAgIiAgTGlzdFtdIGxpc3RzOyB9IjsKKyAgY29uc3Qgc3RyaW5nIGlucHV0ID0gInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBGb28geyBMaXN0PFN0cmluZz5bXSBsaXN0czsgfSI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJhL0Zvby5haWRsIiwgbGlzdF9hcnJheV9wYXJjZWxhYmxlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvRm9vLmFpZGwiLCBpbnB1dCwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkFycmF5cyBvZiBMaXN0IGFyZSBub3Qgc3VwcG9ydGVkIikpOwogfQogCiBURVNUX1AoQWlkbFRlc3QsIFJlamVjdHNQcmltaXRpdmVMaXN0SW5TdGFibGVBaWRsKSB7CkBAIC0xMzQyLDE3ICsyMTU4LDEwIEBACiAgICAgICAiICBQYXJjZWxhYmxlSG9sZGVyIGV4dGVuc2lvbjtcbiIKICAgICAgICIgIFBhcmNlbGFibGVIb2xkZXIgZXh0ZW5zaW9uMjtcbiIKICAgICAgICJ9IjsKLSAgaWYgKEdldExhbmd1YWdlKCkgPT0gT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpIHsKLSAgICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoImEvRGF0YS5haWRsIiwgZXh0ZW5kYWJsZV9wYXJjZWxhYmxlLCB0eXBlbmFtZXNfLCBHZXRMYW5ndWFnZSgpKSk7Ci0gICAgRVhQRUNUX0VRKAotICAgICAgICAiRVJST1I6IGEvRGF0YS5haWRsOjIuMS0xOTogVGhlIFJ1c3QgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IFBhcmNlbGFibGVIb2xkZXIgIgotICAgICAgICAieWV0LlxuIiwKLSAgICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJhL0RhdGEuYWlkbCIsIGV4dGVuZGFibGVfcGFyY2VsYWJsZSwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOwotICAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Ci0gIH0KKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJhL0RhdGEuYWlkbCIsIGV4dGVuZGFibGVfcGFyY2VsYWJsZSwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQorCiBURVNUX1AoQWlkbFRlc3QsIFBhcmNlbGFibGVIb2xkZXJBc1JldHVyblR5cGUpIHsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBzdHJpbmcgcGFyY2VsYWJsZWhvbGRlcl9yZXR1cm5faW50ZXJmYWNlID0KQEAgLTEzNjIsMTQgKzIxNzEsNiBAQAogICBFWFBFQ1RfRVEobnVsbHB0ciwKICAgICAgICAgICAgIFBhcnNlKCJhL0lGb28uYWlkbCIsIHBhcmNlbGFibGVob2xkZXJfcmV0dXJuX2ludGVyZmFjZSwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOwogCi0gIGlmIChHZXRMYW5ndWFnZSgpID09IE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUKSB7Ci0gICAgRVhQRUNUX0VRKAotICAgICAgICAiRVJST1I6IGEvSUZvby5haWRsOjIuMTktMjM6IFBhcmNlbGFibGVIb2xkZXIgY2Fubm90IGJlIGEgcmV0dXJuIHR5cGVcbiIKLSAgICAgICAgIkVSUk9SOiBhL0lGb28uYWlkbDoyLjEtMTk6IFRoZSBSdXN0IGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBQYXJjZWxhYmxlSG9sZGVyICIKLSAgICAgICAgInlldC5cbiIsCi0gICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOwotICAgIHJldHVybjsKLSAgfQogICBFWFBFQ1RfRVEoIkVSUk9SOiBhL0lGb28uYWlkbDoyLjE5LTIzOiBQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBhIHJldHVybiB0eXBlXG4iLAogICAgICAgICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CkBAIC0xMzgzLDE0ICsyMTg0LDYgQEAKICAgRVhQRUNUX0VRKG51bGxwdHIsCiAgICAgICAgICAgICBQYXJzZSgiYS9JRm9vLmFpZGwiLCBleHRlbmRhYmxlX3BhcmNlbGFibGVfYXJnX2ludGVyZmFjZSwgdHlwZW5hbWVzXywgR2V0TGFuZ3VhZ2UoKSkpOwogCi0gIGlmIChHZXRMYW5ndWFnZSgpID09IE9wdGlvbnM6Okxhbmd1YWdlOjpSVVNUKSB7Ci0gICAgRVhQRUNUX0VRKAotICAgICAgICAiRVJST1I6IGEvSUZvby5haWRsOjIuMzEtMzQ6IFBhcmNlbGFibGVIb2xkZXIgY2Fubm90IGJlIGFuIGFyZ3VtZW50IHR5cGVcbiIKLSAgICAgICAgIkVSUk9SOiBhL0lGb28uYWlkbDoyLjE0LTMxOiBUaGUgUnVzdCBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgUGFyY2VsYWJsZUhvbGRlciAiCi0gICAgICAgICJ5ZXQuXG4iLAotICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKLSAgICByZXR1cm47Ci0gIH0KICAgRVhQRUNUX0VRKCJFUlJPUjogYS9JRm9vLmFpZGw6Mi4zMS0zNDogUGFyY2VsYWJsZUhvbGRlciBjYW5ub3QgYmUgYW4gYXJndW1lbnQgdHlwZVxuIiwKICAgICAgICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQpAQCAtMTQwMCwxNSArMjE5Myw3IEBACiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0gIkVSUk9SOiBGb28uYWlkbDoxLjI3LTQ0OiBQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBudWxsYWJsZS5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwotICBpZiAoR2V0TGFuZ3VhZ2UoKSA9PSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVCkgewotICAgIEVYUEVDVF9FUSgKLSAgICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjI3LTQ0OiBQYXJjZWxhYmxlSG9sZGVyIGNhbm5vdCBiZSBudWxsYWJsZS5cbiIKLSAgICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjI3LTQ0OiBUaGUgUnVzdCBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgUGFyY2VsYWJsZUhvbGRlciAiCi0gICAgICAgICJ5ZXQuXG4iLAotICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKLSAgICByZXR1cm47Ci0gIH0KKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTE0MTYsNyArMjIwMSw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgInBhcmNlbGFibGUgRm9vIHsgY29uc3QgaW50IEJJVCA9IDB4MSA8PCAzOyB9Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0xNDI0LDcgKzIyMDksNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsICJ1bmlvbiBGb28geyBjb25zdCBpbnQgQklUID0gMHgxIDw8IDM7IGludCBuOyB9Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0xNDM2LDcgKzIyMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgSUZvby5haWRsIC0tbGFuZz1qYXZhIC1vIG91dCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogICBzdHJpbmcgY29kZTsKICAgRVhQRUNUX1RSVUUoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cygib3V0L0lGb28uamF2YSIsICZjb2RlKSk7CkBAIC0xNDQ3LDYgKzIyMzIsNyBAQAogVEVTVF9GKEFpZGxUZXN0LCBBcGlEdW1wKSB7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCiAgICAgICAiZm9vL2Jhci9JRm9vLmFpZGwiLAorICAgICAgIi8vIGNvbW1lbnRcbiIKICAgICAgICJwYWNrYWdlIGZvby5iYXI7XG4iCiAgICAgICAiaW1wb3J0IGZvby5iYXIuRGF0YTtcbiIKICAgICAgICIvLyBjb21tZW50ZWQgLyogQGhpZGUgKi9cbiIKQEAgLTE0NTYsNiArMjI0Miw3IEBACiAgICAgICAiICAgIGludCBmb28ob3V0IGludFtdIGEsIFN0cmluZyBiLCBib29sZWFuIGMsIGlub3V0IExpc3Q8U3RyaW5nPiBkKTtcbiIKICAgICAgICIgICAgaW50IGZvbzIoQHV0ZjhJbkNwcCBTdHJpbmcgeCwgaW5vdXQgTGlzdDxTdHJpbmc+IHkpO1xuIgogICAgICAgIiAgICBJRm9vIGZvbzMoSUZvbyBmb28pO1xuIgorICAgICAgIiAgICB2b2lkIGZvbzQoaW4gaW50WzJdWzNdIGZpeGVkQXJyYXkpO1xuIgogICAgICAgIiAgICBEYXRhIGdldERhdGEoKTtcbiIKICAgICAgICIgICAgLy8gQGhpZGUgbm90IGFwcGxpZWRcbiIKICAgICAgICIgICAgLyoqIGJsYWhibGFoXG4iCkBAIC0xNDY2LDYgKzIyNTMsNyBAQAogICAgICAgIiAgICBjb25zdCBTdHJpbmcgU1RSID0gXCJIZWxsb1wiO1xuIgogICAgICAgIn1cbiIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJmb28vYmFyL0RhdGEuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vIGNvbW1lbnRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb28uYmFyO1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgZm9vLmJhci5JRm9vO1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvKiBAaGlkZSovXG4iCkBAIC0xNDg3LDcgKzIyNzUsNyBAQAogICBBU1NFUlRfVFJVRShyZXN1bHQpOwogICBzdHJpbmcgYWN0dWFsOwogICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJkdW1wL2Zvby9iYXIvSUZvby5haWRsIiwgJmFjdHVhbCkpOwotICBFWFBFQ1RfRVEoc3RyaW5nKGtQcmVhbWJsZSkuYXBwZW5kKFIiKHBhY2thZ2UgZm9vLmJhcjsKKyAgRVhQRUNUX0VRKHN0cmluZygiLy8gY29tbWVudFxuIikuYXBwZW5kKHN0cmluZyhrUHJlYW1ibGUpKS5hcHBlbmQoUiIocGFja2FnZSBmb28uYmFyOwogaW50ZXJmYWNlIElGb28gewogICAvKioKICAgICogQGhpZGUKQEAgLTE0OTYsNiArMjI4NCw3IEBACiAgIGludCBmb28ob3V0IGludFtdIGEsIFN0cmluZyBiLCBib29sZWFuIGMsIGlub3V0IExpc3Q8U3RyaW5nPiBkKTsKICAgaW50IGZvbzIoQHV0ZjhJbkNwcCBTdHJpbmcgeCwgaW5vdXQgTGlzdDxTdHJpbmc+IHkpOwogICBmb28uYmFyLklGb28gZm9vMyhmb28uYmFyLklGb28gZm9vKTsKKyAgdm9pZCBmb280KGluIGludFsyXVszXSBmaXhlZEFycmF5KTsKICAgZm9vLmJhci5EYXRhIGdldERhdGEoKTsKICAgLyoqCiAgICAqIEBkZXByZWNhdGVkIHJlYXNvbiB3aHkuLi4KQEAgLTE1MDcsNyArMjI5Niw3IEBACiAgICAgICAgICAgICBhY3R1YWwpOwogCiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoImR1bXAvZm9vL2Jhci9EYXRhLmFpZGwiLCAmYWN0dWFsKSk7Ci0gIEVYUEVDVF9FUShzdHJpbmcoa1ByZWFtYmxlKS5hcHBlbmQoUiIocGFja2FnZSBmb28uYmFyOworICBFWFBFQ1RfRVEoc3RyaW5nKCIvLyBjb21tZW50XG4iKS5hcHBlbmQoc3RyaW5nKGtQcmVhbWJsZSkpLmFwcGVuZChSIihwYWNrYWdlIGZvby5iYXI7CiAvKiBAaGlkZSAqLwogcGFyY2VsYWJsZSBEYXRhIHsKICAgaW50IHggPSAxMDsKQEAgLTE2NTcsNiArMjQ0NiwxNyBAQAogICAgICAgICAgICAgYWN0dWFsKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0LCBJbXBvcnRlZERvY3VtZW50SGFzRHVwbGljYXRlRGVmaW5pdGlvbnMpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiSUZvby5haWRsIiwgImludGVyZmFjZSBJRm9vOyBpbnRlcmZhY2UgSUZvbztcbiIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJCYXIuYWlkbCIsICJlbnVtIEJhciB7IENPTlNUID0gSUZvby5OT05FIH1cbiIpOworCisgIHZlY3RvcjxzdHJpbmc+IGFyZ3MgPSB7ImFpZGwiLCAiLS1kdW1wYXBpIiwgIi1JLiIsICItbyBvdXQiLCAiQmFyLmFpZGwifTsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbShhcmdzKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoZHVtcF9hcGkob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQ2FuJ3QgZmluZCBOT05FIGluIElGb28iKSk7Cit9CisKIFRFU1RfRihBaWRsVGVzdCwgQ2hlY2tOdW1HZW5lcmljVHlwZVNlY2lmaWVyKSB7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9saXN0X3N0ZGVyciA9CiAgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjEuMzctNDE6IExpc3QgY2FuIG9ubHkgaGF2ZSBvbmUgdHlwZSBwYXJhbWV0ZXIsIGJ1dCBnb3Q6ICIKQEAgLTE2NjgsNDQgKzI0NjgsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2b2lkIGZvbyhMaXN0PFN0cmluZywgU3RyaW5nPiBhKTt9Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfbGlzdF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMob3B0aW9ucy5JbnB1dEZpbGVzKCkuZnJvbnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2b2lkIGZvbyhNYXA8U3RyaW5nPiBhKTt9Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfbWFwX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgQ2hlY2tUeXBlUGFyYW1ldGVySW5NYXBUeXBlKSB7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQogICAgICAgIkVSUk9SOiBwL0lGb28uYWlkbDoxLjI4LTMxOiBUaGUgdHlwZSBvZiBrZXkgaW4gbWFwIG11c3QgYmUgU3RyaW5nLCBidXQgaXQgaXMgJ3AuQmFyJ1xuIjsKLSAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSBwIHAvSUZvby5haWRsIik7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgLiBwL0lGb28uYWlkbCIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0Jhci5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBCYXIgeyBTdHJpbmcgczsgfSIpOwogCiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXA8U3RyaW5nLCBCYXI+IGZvbygpO30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXA8U3RyaW5nLCBwLkJhcj4gZm9vKCk7fSIpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcDxCYXIsIEJhcj4gZm9vKCk7fSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXA8cC5CYXIsIHAuQmFyPiBmb28oKTt9Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lGb28uYWlkbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFwPFN0cmluZywgU3RyaW5nPiBmb28oKTt9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXA8U3RyaW5nLCBQYXJjZWxGaWxlRGVzY3JpcHRvcj4gZm9vKCk7fSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBXcm9uZ0dlbmVyaWNUeXBlKSB7CkBAIC0xNzE1LDQ3ICsyNTE1LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nPFN0cmluZz4gZm9vKCk7IH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIFVzZXJEZWZpbmVkVW5zdHJ1Y3R1cmVkR2VuZXJpY1BhcmNlbGFibGVUeXBlKSB7Ci0gIE9wdGlvbnMgb3B0aW9uc0ZvclBhcmNlbGFibGUgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIHAgcC9CYXIuYWlkbCIpOworICBPcHRpb25zIG9wdGlvbnNGb3JQYXJjZWxhYmxlID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSAuIHAvQmFyLmFpZGwiKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9CYXIuYWlkbCIsICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgQmFyPFQsIFQ+OyIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zRm9yUGFyY2VsYWJsZSwgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9uc0ZvclBhcmNlbGFibGUsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIkVSUk9SOiBwL0Jhci5haWRsOjEuMjItMjY6IEV2ZXJ5IHR5cGUgcGFyYW1ldGVyIHNob3VsZCBiZSB1bmlxdWUuXG4iLAogICAgICAgICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKLSAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSBwIHAvSUZvby5haWRsIik7CisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgLiBwL0lGb28uYWlkbCIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0Jhci5haWRsIiwgInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBCYXI7Iik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvbyB7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXI8U3RyaW5nLCBTdHJpbmc+IGZvbygpO30iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicC5CYXI8U3RyaW5nLCBTdHJpbmc+IGZvbygpO30iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIEVYUEVDVF9FUSgiRVJST1I6IHAvSUZvby5haWRsOjEuMjgtMzE6IHAuQmFyIGlzIG5vdCBhIGdlbmVyaWMgdHlwZS5cbiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoInAuQmFyIGlzIG5vdCBhIGdlbmVyaWMgdHlwZSIpKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9CYXIuYWlkbCIsICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgQmFyPFQ+OyIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKLSAgRVhQRUNUX0VRKCJFUlJPUjogcC9JRm9vLmFpZGw6MS4yOC0zMTogcC5CYXIgbXVzdCBoYXZlIDEgdHlwZSBwYXJhbWV0ZXJzLCBidXQgZ290IDJcbiIsCi0gICAgICAgICAgICBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJwLkJhciBtdXN0IGhhdmUgMSB0eXBlIHBhcmFtZXRlcnMsIGJ1dCBnb3QgMiIpKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9CYXIuYWlkbCIsICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgQmFyPFQsIFY+OyIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhcjxTdHJpbmcsIFBhcmNlbEZpbGVEZXNjcmlwdG9yPiBmb28oKTt9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicC5CYXI8U3RyaW5nLCBQYXJjZWxGaWxlRGVzY3JpcHRvcj4gZm9vKCk7fSIpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhcjxpbnQsIGxvbmc+IGZvbygpO30iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicC5CYXI8aW50LCBsb25nPiBmb28oKTt9Iik7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhcjxpbnRbXSwgbG9uZ1tdPiBmb28oKTt9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInAuQmFyPGludFtdLCBsb25nW10+IGZvbygpO30iKTsKIAotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBGYWlsT25NdWx0aXBsZVR5cGVzSW5TaW5nbGVGaWxlKSB7CkBAIC0xNzczLDcgKzI1NzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRGF0YTEgeyBpbnQgYTsgaW50IGI7fVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRGF0YTIgeyBpbnQgYTsgaW50IGI7fVxuIik7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLApAQCAtMTc4MSw3ICsyNTgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbzEgeyBpbnQgZm9vKCk7IH1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbzIgeyBpbnQgZm9vKCk7IH1cbiIpOwogICAgIENhcHR1cmVTdGRlcnIoKTsKLSAgICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIAogICAgIGV4cGVjdGVkX3N0ZGVyciA9ICJFUlJPUjogZm9vL2Jhci9Gb28uYWlkbDozLjExLTE3OiBZb3UgbXVzdCBkZWNsYXJlIG9ubHkgb25lIHR5cGUgcGVyIGZpbGUuXG4iOwpAQCAtMTc5MCw3ICsyNTg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIERhdGExIHsgaW50IGE7IGludCBiO31cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIERhdGEyIHsgaW50IGE7IGludCBiO31cbiIpOwogICAgIENhcHR1cmVTdGRlcnIoKTsKLSAgICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKICAgfQogfQpAQCAtMTgxNyw3ICsyNjE2LDcgQEAKICAgICAgICAgImltcG9ydCBmb28uYmFyLklGb287XG4iCiAgICAgICAgICJwYXJjZWxhYmxlIERhdGEgeyBJRm9vIGZvbzsgfVxuIik7CiAKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgc3RyaW5nIGNvbnRlbnQ7CiAgIGZvciAoY29uc3QgYXV0byBmaWxlIDogewpAQCAtMTg0Miw3ICsyNjQxLDcgQEAKICAgICAgICAgImltcG9ydCBmb28uYmFyLklGb287XG4iCiAgICAgICAgICJwYXJjZWxhYmxlIERhdGEgeyBJRm9vIGZvbzsgfVxuIik7CiAKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgc3RyaW5nIGNvbnRlbnQ7CiAgIGZvciAoY29uc3QgYXV0byBmaWxlIDogewpAQCAtMTg3MCw3ICsyNjY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IGZvby5iYXIuSUZvbztcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBEYXRhIHsgSUZvbyBmb287IH1cbiIpOwogCi0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIHN0cmluZyBjb250ZW50OwogICBmb3IgKGNvbnN0IGF1dG8gZmlsZSA6IHsib3V0L2Zvby9iYXIvSUZvby5ycyIsICJvdXQvZm9vL2Jhci9EYXRhLnJzIn0pIHsKQEAgLTE4ODksNyArMjY4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGdldEludGVyZmFjZVZlcnNpb24oKTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTE5MDMsNyArMjcwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9vbGVhbiBnZXRJbnRlcmZhY2VWZXJzaW9uKCk7IH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0xOTE2LDE0ICsyNzE1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsgaW50ZXJmYWNlIElGb28geyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGdldFRyYW5zYWN0aW9uTmFtZShpbnQgY29kZSk7IH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIC8vIHRoaXMgaXMgbm90IGEgbWV0YSBpbnRlcmZhY2UgbWV0aG9kIGFzIGl0IGRpZmZlcnMgdHlwZSBhcmd1bWVudHMKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zLklucHV0RmlsZXMoKS5mcm9udCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9vIHsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBnZXRUcmFuc2FjdGlvbk5hbWUoKTsgfSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBDaGVja0FwaUZvckVxdWFsaXR5KSB7CkBAIC0xOTY5LDYgKzI3NjgsMTcgQEAKICAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpjaGVja19hcGkob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiB9CiAKK1RFU1RfRihBaWRsVGVzdCwgQ2hlY2tBcGlfRW51bUZpZWxkc0Zyb21JbXBvcnRlZCkgeworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tY2hlY2thcGkgb2xkIG5ldyAtSSBpbXBvcnQiKTsKKworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJvbGQvcC9Gb28uYWlkbCIsICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgRm9veyBvdGhlci5FbnVtIGU7IH0iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygibmV3L3AvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgRm9veyBvdGhlci5FbnVtIGUgPSBvdGhlci5FbnVtLkZPTzsgfSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJpbXBvcnQvb3RoZXIvRW51bS5haWRsIiwgInBhY2thZ2Ugb3RoZXI7IGVudW0gRW51bSB7IEZPTyB9Iik7CisKKyAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpjaGVja19hcGkob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Cit9CisKIFRFU1RfRihBaWRsVGVzdCwgQ2hlY2tBcGlFcXVhbF9FbnVtRmllbGRzV2l0aERlZmF1bHRWYWx1ZXMpIHsKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWNoZWNrYXBpPWVxdWFsIG9sZCBuZXciKTsKICAgY29uc3Qgc3RyaW5nIGZvb19kZWZpbml0aW9uID0gInBhY2thZ2UgcDsgcGFyY2VsYWJsZSBGb297IHAuRW51bSBlID0gcC5FbnVtLkZPTzsgfSI7CkBAIC0yMDE3LDcgKzI4MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKGludCBhKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXooaW4gTGlzdDxJRm9vPiBhcmcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJheihpbiBMaXN0PFN0cmluZz4gYXJnKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKICAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpjaGVja19hcGkob3B0aW9uc18sIGlvX2RlbGVnYXRlXykpOwogfQpAQCAtMjIzOCw2ICszMDQ4LDM3IEBACiAgIEVYUEVDVF9UUlVFKDo6YW5kcm9pZDo6YWlkbDo6Y2hlY2tfYXBpKG9wdGlvbnNfLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0Q29tcGF0aWJsZUNoYW5nZXMsIE5ld05lc3RlZFR5cGVzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm9sZC9wL0RhdGEuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBEYXRhIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgbjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJuZXcvcC9EYXRhLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRGF0YSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgZW51bSBOZXdFbnVtIHsgTiA9IDMgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludCBuO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIE5ld0VudW0gZSA9IE5ld0VudW0uTjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBFWFBFQ1RfVFJVRSg6OmFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zXywgaW9fZGVsZWdhdGVfKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdENvbXBhdGlibGVDaGFuZ2VzLCBOZXdKYXZhU3VwcHJlc3NMaW50KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIm9sZC9wL0lGb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgcDsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9vIHsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oaW50IGEpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJuZXcvcC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJASmF2YVN1cHByZXNzTGludCh7XCJOZXdBcGlcIn0pIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvbyB7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKGludCBhKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgRVhQRUNUX1RSVUUoOjphbmRyb2lkOjphaWRsOjpjaGVja19hcGkob3B0aW9uc18sIGlvX2RlbGVnYXRlXykpOworfQorCiBjbGFzcyBBaWRsVGVzdEluY29tcGF0aWJsZUNoYW5nZXMgOiBwdWJsaWMgQWlkbFRlc3QgewogIHByb3RlY3RlZDoKICAgT3B0aW9ucyBvcHRpb25zXyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1jaGVja2FwaSBvbGQgbmV3Iik7CkBAIC0yNzQ2LDM2ICszNTg3LDEwNSBAQAogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0SW5jb21wYXRpYmxlQ2hhbmdlcywgSW5jb21wYXRpYmxlQ2hhbmdlc0luTmVzdGVkVHlwZSkgeworICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KKyAgICAgICJFUlJPUjogbmV3L3AvRm9vLmFpZGw6MS4zMy0zNzogTnVtYmVyIG9mIGZpZWxkcyBpbiBwLkZvbyBpcyByZWR1Y2VkIGZyb20gMiB0byAxLlxuIjsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygib2xkL3AvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRlcmZhY2UgSUJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB2b2lkIGZvbygpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygibmV3L3AvRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRlcmZhY2UgSUJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB2b2lkIGZvbyhpbnQgbik7IiAgLy8gaW5jb21wYXRpYmxlOiBzaWduYXR1cmUgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRSg6OmFuZHJvaWQ6OmFpZGw6OmNoZWNrX2FwaShvcHRpb25zXywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiUmVtb3ZlZCBvciBjaGFuZ2VkIG1ldGhvZDogcC5Gb28uSUJhci5mb28oKSIpKTsKK30KKwogVEVTVF9QKEFpZGxUZXN0LCBSZWplY3ROb25GaXhlZFNpemVGcm9tRml4ZWRTaXplKSB7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjM2LTM4OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6Mi44LTEwOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKICAgICAgICJhLlxuIgotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjQ0LTQ2OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKLSAgICAgICJiLlxuIgotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjU1LTU3OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6My42LTg6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgYi5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6NC45LTExOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKICAgICAgICJjLlxuIgotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjgwLTgyOiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkICIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6NS4yMy0yNTogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCiAgICAgICAiZC5cbiIKLSAgICAgICJFUlJPUjogRm9vLmFpZGw6MS45Mi05NDogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiRVJST1I6IEZvby5haWRsOjYuMTAtMTI6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgogICAgICAgImUuXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuMTA5LTExMTogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCi0gICAgICAiZi5cbiI7CisgICAgICAiRVJST1I6IEZvby5haWRsOjcuMTUtMTc6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgImYuXG4iCisgICAgICAiRVJST1I6IEZvby5haWRsOjkuMjMtMzM6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgIm51bGxhYmxlMS5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6MTAuMzQtNDQ6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgIm51bGxhYmxlMi5cbiI7CiAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiRm9vLmFpZGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJARml4ZWRTaXplIHBhcmNlbGFibGUgRm9vIHsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludFtdIGE7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEJhciBiOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTdHJpbmcgYzsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZDsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgSUJpbmRlciBlOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBMaXN0PFN0cmluZz4gZjsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50IGlzRml4ZWRTaXplOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEZpeGVkU2l6ZSBwYXJjZWxhYmxlIEZvbyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50W10gYTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBCYXIgYjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTdHJpbmcgYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJjZWxGaWxlRGVzY3JpcHRvciBkO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIElCaW5kZXIgZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBMaXN0PFN0cmluZz4gZjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgaXNGaXhlZFNpemU7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQG51bGxhYmxlIE90aGVyRml4ZWQgbnVsbGFibGUxO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEBudWxsYWJsZShoZWFwPXRydWUpIE90aGVyRml4ZWQgbnVsbGFibGUyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGZsb2F0WzE2XSBmbG9hdHM7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiQmFyLmFpZGwiLCAicGFyY2VsYWJsZSBCYXIgeyBpbnQgYTsgfSIpOworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJPdGhlckZpeGVkLmFpZGwiLCAiQEZpeGVkU2l6ZSBwYXJjZWxhYmxlIE90aGVyRml4ZWQgeyBpbnQgYTsgfSIpOwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC1JIC4gLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogCiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBSZWplY3ROb25GaXhlZFNpemVGcm9tRml4ZWRTaXplX1VuaW9uKSB7CisgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQorICAgICAgIkVSUk9SOiBGb28uYWlkbDoyLjgtMTA6IFRoZSBARml4ZWRTaXplIHBhcmNlbGFibGUgJ0ZvbycgaGFzIGEgbm9uLWZpeGVkIHNpemUgZmllbGQgbmFtZWQgIgorICAgICAgImEuXG4iCisgICAgICAiRVJST1I6IEZvby5haWRsOjMuNi04OiBUaGUgQEZpeGVkU2l6ZSBwYXJjZWxhYmxlICdGb28nIGhhcyBhIG5vbi1maXhlZCBzaXplIGZpZWxkIG5hbWVkIGIuXG4iCisgICAgICAiRVJST1I6IEZvby5haWRsOjQuOS0xMTogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiYy5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6NS4yMy0yNTogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiZC5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6Ni4xMC0xMjogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiZS5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6Ny4xNS0xNzogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAiZi5cbiIKKyAgICAgICJFUlJPUjogRm9vLmFpZGw6OS4yMy0zMzogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAibnVsbGFibGUxLlxuIgorICAgICAgIkVSUk9SOiBGb28uYWlkbDoxMC4zNC00NDogVGhlIEBGaXhlZFNpemUgcGFyY2VsYWJsZSAnRm9vJyBoYXMgYSBub24tZml4ZWQgc2l6ZSBmaWVsZCBuYW1lZCAiCisgICAgICAibnVsbGFibGUyLlxuIjsKKworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBGaXhlZFNpemUgdW5pb24gRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRbXSBhID0ge307XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQmFyIGI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU3RyaW5nIGM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBJQmluZGVyIGU7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgTGlzdDxTdHJpbmc+IGY7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50IGlzRml4ZWRTaXplO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEBudWxsYWJsZSBPdGhlckZpeGVkIG51bGxhYmxlMTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBAbnVsbGFibGUoaGVhcD10cnVlKSBPdGhlckZpeGVkIG51bGxhYmxlMjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBmbG9hdFsxNl0gZmxvYXRzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgInBhcmNlbGFibGUgQmFyIHsgaW50IGE7IH0iKTsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiT3RoZXJGaXhlZC5haWRsIiwgIkBGaXhlZFNpemUgcGFyY2VsYWJsZSBPdGhlckZpeGVkIHsgaW50IGE7IH0iKTsKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtSSAuIC0tbGFuZz0iICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0yNzg4LDcgKzM2OTgsNyBAQAogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC1JIC4gLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogCiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0yODA0LDcgKzM3MTQsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJkaXIyL3EvSUJhci5haWRsIiwgInBhY2thZ2UgcTsgaW50ZXJmYWNlIElCYXJ7fSIpOwogCiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMjgzMSw3ICszNzQxLDcgQEAKICAgLy8gdXNlIHdpdGhvdXQgaW1wb3J0CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBpbnRlcmZhY2UgSUZvb3sgdm9pZCBmb28oaW4gUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpO30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgLy8gY2FwdHVyZSBvdXRwdXQgZmlsZXMKICAgbWFwPHN0cmluZywgc3RyaW5nPiBvdXRwdXRzID0gaW9fZGVsZWdhdGVfLk91dHB1dEZpbGVzKCk7CkBAIC0yODQwLDcgKzM3NTAsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKAogICAgICAgInAvSUZvby5haWRsIiwKICAgICAgICJwYWNrYWdlIHA7IGludGVyZmFjZSBJRm9veyB2b2lkIGZvbyhpbiBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKTt9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICAvLyBvdXRwdXQgZmlsZXMgc2hvdWxkIGJlIHRoZSBzYW1lCiAgIEVYUEVDVF9FUShvdXRwdXRzLCBpb19kZWxlZ2F0ZV8uT3V0cHV0RmlsZXMoKSk7CiAKQEAgLTI4NTEsNyArMzc2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9veyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCk7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICAvLyBvdXRwdXQgZmlsZXMgc2hvdWxkIGJlIHRoZSBzYW1lCiAgIEVYUEVDVF9FUShvdXRwdXRzLCBpb19kZWxlZ2F0ZV8uT3V0cHV0RmlsZXMoKSk7CiB9CkBAIC0yODY0LDcgKzM3NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvb3siCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28ob3V0IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKLSAgRVhQRUNUX0VRKDEsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoImNhbid0IGJlIGFuIG91dCBwYXJhbWV0ZXIiKSk7CiB9CiAKQEAgLTI4NzYsNyArMzc4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9veyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGZvbyhQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCk7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7Ci0gIEVYUEVDVF9FUSgxLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKICAgICAgICAgICAgICAgSGFzU3Vic3RyKCJQYXJjZWxGaWxlRGVzY3JpcHRvciBjYW4gYmUgYW4gaW4gb3IgaW5vdXQgcGFyYW1ldGVyLiIpKTsKIH0KQEAgLTI4ODgsNyArMzc5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oKSA9IDA7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoKSA9IDE7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgTWFudWFsSWRzV2l0aE1ldGFUcmFuc2FjdGlvbnMpIHsKQEAgLTI4OTgsNyArMzgwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oKSA9IDA7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoKSA9IDE7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgRmFpbE9uRHVwbGljYXRlZElkcykgewpAQCAtMjkxMSw3ICszODIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcigpID0gMztcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTI5MjcsNyArMzgzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBiYXIoKSA9IDE2Nzc3MTE1O1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMjk0MSwxNSArMzg1MSwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgYmFyKCk7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCitURVNUX0YoQWlkbFRlc3QsIEFzc2lnbmVkSWRzKSB7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIFBhcnNlKCJJRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9vIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgZm9vKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGJhcigpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50ZXJmYWNlIElOZXN0ZWQge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB2b2lkIGZvbygpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB2b2lkIGJhcigpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWVzXywgT3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEpKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgYXV0byBmb28gPSB0eXBlbmFtZXNfLlJlc29sdmVUeXBlbmFtZSgiSUZvbyIpLmRlZmluZWRfdHlwZTsKKyAgQVNTRVJUX0VRKDJ1LCBmb28tPkdldE1ldGhvZHMoKS5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgZm9vLT5HZXRNZXRob2RzKClbMF0tPkdldElkKCkpOworICBFWFBFQ1RfRVEoMSwgZm9vLT5HZXRNZXRob2RzKClbMV0tPkdldElkKCkpOworICBhdXRvIG5lc3RlZCA9IHR5cGVuYW1lc18uUmVzb2x2ZVR5cGVuYW1lKCJJRm9vLklOZXN0ZWQiKS5kZWZpbmVkX3R5cGU7CisgIEFTU0VSVF9FUSgydSwgbmVzdGVkLT5HZXRNZXRob2RzKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG5lc3RlZC0+R2V0TWV0aG9kcygpWzBdLT5HZXRJZCgpKTsKKyAgRVhQRUNUX0VRKDEsIG5lc3RlZC0+R2V0TWV0aG9kcygpWzFdLT5HZXRJZCgpKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBBbGxvd0R1cGxpY2F0ZWRJbXBvcnRQYXRocykgewogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1JIGRpciAtSSBkaXIgSUZvby5haWRsIik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImRpci9JQmFyLmFpZGwiLCAiaW50ZXJmYWNlIElCYXJ7fSIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJJRm9vLmFpZGwiLCAiaW1wb3J0IElCYXI7IGludGVyZmFjZSBJRm9ve30iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgRmFpbE9uQW1iaWd1b3VzSW1wb3J0cykgewpAQCAtMjk2NCw3ICszODk3LDcgQEAKICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiZGlyMi9JQmFyLmFpZGwiLCAiaW50ZXJmYWNlIElCYXJ7fSIpOwogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJJRm9vLmFpZGwiLCAiaW1wb3J0IElCYXI7IGludGVyZmFjZSBJRm9ve30iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0yOTc4LDcgKzM5MTEsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL2IvSVF1eC5haWRsIiwgInBhY2thZ2UgYS5iOyBpbnRlcmZhY2UgSVF1eCB7IHZvaWQgZm9vKCk7IH0iKTsKIAogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1uZGsgYS9iL0lGb28uYWlkbCAtSSAuIC1vIG91dCAtaCBvdXQvaW5jbHVkZSIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBzdHJpbmcgb3V0cHV0OwogICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJvdXQvaW5jbHVkZS9haWRsL2EvYi9JRm9vLmgiLCAmb3V0cHV0KSk7CkBAIC0zMDA4LDcgKzM5NDEsNyBAQAogICAgIH0pLS0iKTsKIAogICBPcHRpb25zIGphdmFfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgLiAtLWxhbmc9amF2YSAtbyBvdXQgYS9JRm9vLmFpZGwgYS9NeUVudW0uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgc3RyaW5nIGphdmFfb3V0OwogICBFWFBFQ1RfVFJVRShpb19kZWxlZ2F0ZV8uR2V0V3JpdHRlbkNvbnRlbnRzKCJvdXQvYS9JRm9vLmphdmEiLCAmamF2YV9vdXQpKTsKQEAgLTMwMjksMTQgKzM5NjIsMTQgQEAKICAgLy8gT3RoZXIgYmFja2VuZHMgc2hvdWxkbid0IGJlIGJvdGhlcmVkCiAgIE9wdGlvbnMgY3BwX29wdGlvbnMgPQogICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCAtSSAuIC0tbGFuZz1jcHAgLW8gb3V0IC1oIG91dCBhL0lGb28uYWlkbCBhL015RW51bS5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChjcHBfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChjcHBfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAKICAgT3B0aW9ucyBuZGtfb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIC4gLS1sYW5nPW5kayAtbyBvdXQgLWggb3V0IGEvSUZvby5haWRsIGEvTXlFbnVtLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG5ka19vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG5ka19vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBPcHRpb25zIHJ1c3Rfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgLiAtLWxhbmc9cnVzdCAtbyBvdXQgYS9JRm9vLmFpZGwgYS9NeUVudW0uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwocnVzdF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKHJ1c3Rfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgUGFyc2VSdXN0RGVyaXZlKSB7CkBAIC0zMDQ3LDcgKzM5ODAsNyBAQAogICAgIH0pIik7CiAKICAgT3B0aW9ucyBydXN0X29wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1ydXN0IC1vIG91dCBhL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChydXN0X29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwocnVzdF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBzdHJpbmcgcnVzdF9vdXQ7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9hL0Zvby5ycyIsICZydXN0X291dCkpOwpAQCAtMzA1NSwxMyArMzk4OCwxNDcgQEAKIAogICAvLyBPdGhlciBiYWNrZW5kcyBzaG91bGRuJ3QgYmUgYm90aGVyZWQKICAgT3B0aW9ucyBjcHBfb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWNwcCAtbyBvdXQgLWggb3V0IGEvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGNwcF9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIAogICBPcHRpb25zIG5ka19vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9bmRrIC1vIG91dCAtaCBvdXQgYS9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwobmRrX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwobmRrX29wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogCiAgIE9wdGlvbnMgamF2YV9vcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwoamF2YV9vcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKGphdmFfb3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRW1wdHlFbmZvcmNlQW5ub3RhdGlvbikgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsIFIiKHBhY2thZ2UgYTsKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbigpCisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiVW5hYmxlIHRvIHBhcnNlIEBFbmZvcmNlUGVybWlzc2lvbiBhbm5vdGF0aW9uIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEludGVyZmFjZUVuZm9yY2VDb25kaXRpb24pIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICB2b2lkIFByb3RlY3RlZCgpOworICAgIH0pIik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9JRm9vLmFpZGwiKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEVuZm9yY2VDb25kaXRpb25BbnkpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgaW50ZXJmYWNlIElGb28geworICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW55T2Y9eyJJTlRFUk5FVCIsICJSRUFEX1BIT05FX1NUQVRFIn0pCisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRW5mb3JjZUNvbmRpdGlvbkFsbCkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsIFIiKHBhY2thZ2UgYTsKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbGxPZj17IklOVEVSTkVUIiwgIlJFQURfUEhPTkVfU1RBVEUifSkKKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBJbnRlcmZhY2VBbmRNZXRob2RFbmZvcmNlQ29uZGl0aW9uKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJTWVNURU1fVUlEIikKKyAgICAgICAgdm9pZCBQcm90ZWN0ZWQoKTsKKyAgICB9KSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLW8gb3V0IGEvSUZvby5haWRsIik7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBOb1Blcm1pc3Npb25JbnRlcmZhY2VFbmZvcmNlTWV0aG9kKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIEBSZXF1aXJlc05vUGVybWlzc2lvbgorICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiVGhlIGludGVyZmFjZSBJRm9vIGlzIGFubm90YXRlZCBhcyByZXF1aXJpbmcgbm8gcGVybWlzc2lvbiIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBNYW51YWxQZXJtaXNzaW9uSW50ZXJmYWNlRW5mb3JjZU1ldGhvZCkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0lGb28uYWlkbCIsIFIiKHBhY2thZ2UgYTsKKyAgICBAUGVybWlzc2lvbk1hbnVhbGx5RW5mb3JjZWQKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgICAgICB2b2lkIFByb3RlY3RlZCgpOworICAgIH0pIik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtbyBvdXQgYS9JRm9vLmFpZGwiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVCgKKyAgICAgIEdldENhcHR1cmVkU3RkZXJyKCksCisgICAgICBIYXNTdWJzdHIoIlRoZSBpbnRlcmZhY2UgSUZvbyBpcyBhbm5vdGF0ZWQgYXMgbWFudWFsbHkgaW1wbGVtZW50aW5nIHBlcm1pc3Npb24gY2hlY2tzIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEVuZm9yY2VJbnRlcmZhY2VOb1Blcm1pc3Npb25zTWV0aG9kKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQFJlcXVpcmVzTm9QZXJtaXNzaW9uCisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiVGhlIGludGVyZmFjZSBJRm9vIGVuZm9yY2VzIHBlcm1pc3Npb25zIHVzaW5nIGFubm90YXRpb25zIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEVuZm9yY2VJbnRlcmZhY2VNYW51YWxQZXJtaXNzaW9uTWV0aG9kKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvSUZvby5haWRsIiwgUiIocGFja2FnZSBhOworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIGludGVyZmFjZSBJRm9vIHsKKyAgICAgICAgQFBlcm1pc3Npb25NYW51YWxseUVuZm9yY2VkCisgICAgICAgIHZvaWQgUHJvdGVjdGVkKCk7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiVGhlIGludGVyZmFjZSBJRm9vIGVuZm9yY2VzIHBlcm1pc3Npb25zIHVzaW5nIGFubm90YXRpb25zIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEphdmFTdXBwcmVzc0xpbnQpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9JRm9vLmFpZGwiLCBSIihwYWNrYWdlIGE7CisgICAgQEphdmFTdXBwcmVzc0xpbnQoeyJOZXdBcGkifSkKKyAgICBpbnRlcmZhY2UgSUZvbyB7CisgICAgfSkiKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBhL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKEdldENhcHR1cmVkU3RkZXJyKCksICIiKTsKKyAgc3RyaW5nIGNvZGU7CisgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9hL0lGb28uamF2YSIsICZjb2RlKSk7CisgIEVYUEVDVF9USEFUKGNvZGUsIEhhc1N1YnN0cigiQGFuZHJvaWQuYW5ub3RhdGlvbi5TdXBwcmVzc0xpbnQodmFsdWUgPSB7XCJOZXdBcGlcIn0pIikpOwogfQogCiBjbGFzcyBBaWRsT3V0cHV0UGF0aFRlc3QgOiBwdWJsaWMgQWlkbFRlc3QgewpAQCAtMzA3Miw3ICs0MTM5LDcgQEAKICAgfQogCiAgIHZvaWQgVGVzdChjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfcGF0aCkgewotICAgIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZQogICAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoZXhwZWN0ZWRfb3V0cHV0X3BhdGgsIG51bGxwdHIpKTsKICAgfQpAQCAtMzEwMSw3ICs0MTY4LDcgQEAKIFRFU1RfUChBaWRsVGVzdCwgRmFpbE9uT3V0T2ZCb3VuZHNJbnQzMk1heENvbnN0SW50KSB7CiAgIEFpZGxFcnJvciBlcnJvcjsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNTgtNjk6IEludmFsaWQgdHlwZSBzcGVjaWZpZXIgZm9yIGFuIGludDY0IGxpdGVyYWw6IGludFxuIjsKKyAgICAgICJFUlJPUjogcC9JRm9vLmFpZGw6My41OC02OTogSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgYW4gaW50NjQgbGl0ZXJhbDogaW50ICgyMTQ3NDgzNjUwKVxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIiKHBhY2thZ2UgcDsKQEAgLTMxMTcsNyArNDE4NCw4IEBACiBURVNUX1AoQWlkbFRlc3QsIEZhaWxPbk91dE9mQm91bmRzSW50MzJNaW5Db25zdEludCkgewogICBBaWRsRXJyb3IgZXJyb3I7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQotICAgICAgIkVSUk9SOiBwL0lGb28uYWlkbDozLjU4LTYwOiBJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciBhbiBpbnQ2NCBsaXRlcmFsOiBpbnRcbiI7CisgICAgICAiRVJST1I6IHAvSUZvby5haWRsOjMuNTgtNjA6IEludmFsaWQgdHlwZSBzcGVjaWZpZXIgZm9yIGFuIGludDY0IGxpdGVyYWw6IGludCAiCisgICAgICAiKC0yMTQ3NDgzNjUwKVxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvSUZvby5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIiKHBhY2thZ2UgcDsKQEAgLTMxNjUsNyArNDIzMyw3IEBACiBURVNUX1AoQWlkbFRlc3QsIEZhaWxPbk91dE9mQm91bmRzQXV0b2ZpbGxlZEVudW0pIHsKICAgQWlkbEVycm9yIGVycm9yOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KLSAgICAgICJFUlJPUjogcC9UZXN0RW51bS5haWRsOjUuMS0zNjogSW52YWxpZCB0eXBlIHNwZWNpZmllciBmb3IgYW4gaW50MzIgbGl0ZXJhbDogYnl0ZVxuIgorICAgICAgIkVSUk9SOiBwL1Rlc3RFbnVtLmFpZGw6NS4xLTM2OiBJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciBhbiBpbnQzMiBsaXRlcmFsOiBieXRlIChGT08rMSlcbiIKICAgICAgICJFUlJPUjogcC9UZXN0RW51bS5haWRsOjUuMS0zNjogRW51bWVyYXRvciB0eXBlIGRpZmZlcnMgZnJvbSBlbnVtIGJhY2tpbmcgdHlwZS5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKICAgRVhQRUNUX0VRKG51bGxwdHIsIFBhcnNlKCJwL1Rlc3RFbnVtLmFpZGwiLApAQCAtMzE4MSw2ICs0MjQ5LDI1IEBACiAgIEVYUEVDVF9FUShBaWRsRXJyb3I6OkJBRF9UWVBFLCBlcnJvcik7CiB9CiAKK1RFU1RfUChBaWRsVGVzdCwgRmFpbE9uVW5zdXBwb3J0ZWRCYWNraW5nVHlwZSkgeworICBBaWRsRXJyb3IgZXJyb3I7CisgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQorICAgICAgIkVSUk9SOiBwL1Rlc3RFbnVtLmFpZGw6My4zNS00NDogSW52YWxpZCBiYWNraW5nIHR5cGU6IGJvb2xlYW4uIEJhY2tpbmcgdHlwZSBtdXN0IGJlIG9uZSBvZjogIgorICAgICAgImJ5dGUsIGludCwgbG9uZ1xuIjsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgUGFyc2UoInAvVGVzdEVudW0uYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSIihwYWNrYWdlIHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQmFja2luZyh0eXBlPSJib29sZWFuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gVGVzdEVudW0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT08gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVIgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lc18sIEdldExhbmd1YWdlKCksICZlcnJvcikpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKKyAgRVhQRUNUX0VRKEFpZGxFcnJvcjo6QkFEX1RZUEUsIGVycm9yKTsKK30KKwogVEVTVF9QKEFpZGxUZXN0LCBVbnN1cHBvcnRlZEJhY2tpbmdBbm5vdGF0aW9uUGFyYW0pIHsKICAgQWlkbEVycm9yIGVycm9yOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KQEAgLTMyMTUsNyArNDMwMiw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhei5haWRsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEphdmFPbmx5SW1tdXRhYmxlIEBKYXZhT25seVN0YWJsZVBhcmNlbGFibGUgcGFyY2VsYWJsZSBCYXo7Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLUkgLiBGb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RNdXRhYmxlUGFyY2VsYWJsZUZyb21KYXZhT25seUltbXV0YWJsZVBhcmNlbGFibGUpIHsKQEAgLTMyMjYsNyArNDMxMyw3IEBACiAgICAgICAibmFtZWQgJ2JhcicuXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgRm9vLmFpZGwgLUkgLiIpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMyMzUsNyArNDMyMiw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgImVudW0gQmFyIHsgRk9PIH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIEZvby5haWRsIC1JIC4iKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMyNDcsNyArNDMzNCw3IEBACiAgICAgICAibmFtZWQgJ2JhcicuXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgRm9vLmFpZGwgLUkgLiIpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMyNTksNyArNDM0Niw3IEBACiAgICAgICAib25seSBiZSBhbiBpbiBwYXJhbWV0ZXIuXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgSUJhci5haWRsIC1JIC4iKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZXJyb3IsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zMjcxLDcgKzQzNTgsNyBAQAogICAgICAgIm9ubHkgYmUgYW4gaW4gcGFyYW1ldGVyLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIElCYXIuYWlkbCAtSSAuIik7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9yLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMzI4Miw3ICs0MzY5LDcgQEAKICAgICAgICJFUlJPUjogRm9vLmFpZGw6MS40Ny00OTogJ0ZvbycgaGFzIGR1cGxpY2F0ZSBmaWVsZCBuYW1lICdBJyBhZnRlciBjYXBpdGFsaXppbmcgdGhlIGZpcnN0ICIKICAgICAgICJsZXR0ZXJcbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc3RkZXJyLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKIH0KIApAQCAtMzMyNiw3ICs0NDEzLDcgQEAKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSk7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTMzMzcsNyArNDQyNCw3IEBACiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC0tbGFuZz0iICsgdG9fc3RyaW5nKE9wdGlvbnM6Okxhbmd1YWdlOjpDUFApICsgIiAtbyBvdXQgLWggb3V0Iik7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgc3RyaW5nIGNvZGU7CkBAIC0zMzU2LDcgKzQ0NDMsNyBAQAogICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCBGb28uYWlkbCAtLWxhbmc9IiArIHRvX3N0cmluZyhPcHRpb25zOjpMYW5ndWFnZTo6TkRLKSArICIgLW8gb3V0IC1oIG91dCIpOwogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0gIiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogCiAgIHN0cmluZyBjb2RlOwpAQCAtMzM3Niw3ICs0NDYzLDcgQEAKICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Zvby5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPSAiIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiAKICAgc3RyaW5nIGNvZGU7CkBAIC0zMzg2LDE1ICs0NDczLDc4IEBACiAgICAgICAgICAgICAgICAgICAiYS5CYXo8YS5CYXI8YS5CYXI8amF2YS5sYW5nLlN0cmluZ1tdPj5bXSxhLkJhcjxqYXZhLmxhbmcuU3RyaW5nPj4gYmFyc3M7IikpOwogfQogCi1URVNUX0YoQWlkbFRlc3QsIERvdWJsZUFycmF5RXJyb3IpIHsKK1RFU1RfRihBaWRsVGVzdCwgQWNjZXB0TXVsdGlEaW1lbnNpb25hbEZpeGVkU2l6ZUFycmF5KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEJhciB7IFN0cmluZ1syXVszXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1uZGsiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgQWNjZXB0QmluYXJ5U2l6ZUFycmF5KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoCisgICAgICAiYS9CYXIuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgQmFyIHsgY29uc3QgaW50IENPTlNUID0gMzsgU3RyaW5nW0NPTlNUICsgMV0gYTsgfSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9bmRrIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEFjY2VwdFJlZlNpemVBcnJheSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKAorICAgICAgImEvQmFyLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEJhciB7IGNvbnN0IGludCBDT05TVCA9IDM7IFN0cmluZ1tDT05TVF0gYTsgfSIpOworCisgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9bmRrIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEFycmF5T2ZGaXhlZFNpemVBcnJheSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Jhci5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBCYXIgeyBTdHJpbmdbMl1bXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RGaXhlZFNpemVBcnJheU9mRHluYW1pY0FycmF5KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEJhciB7IFN0cmluZ1tdWzNdIGE7IH0iKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIGEvQmFyLmFpZGwgLUkgLiAtbyBvdXQgLS1sYW5nPWphdmEiKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEFycmF5T2ZBcnJheSkgewogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Jhci5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBCYXIgeyBTdHJpbmdbXVtdIGE7IH0iKTsKIAogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIGEvQmFyLmFpZGwgLUkgLiAtbyBvdXQgLS1sYW5nPWphdmEiKTsKLSAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9Ci0gICAgICAiRVJST1I6IGEvQmFyLmFpZGw6MS4yOC0zNzogQ2FuIG9ubHkgaGF2ZSBvbmUgZGltZW5zaW9uYWwgYXJyYXlzLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIikpOworfQorCitURVNUX0YoQWlkbFRlc3QsIFJlamVjdEludmFsaWRBcnJheVNpemVfTmVnYXRpdmUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9CYXIuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgQmFyIHsgU3RyaW5nWy0xXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJBcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUmVqZWN0SW52YWxpZEFycmF5U2l6ZV9Xcm9uZ1R5cGUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9CYXIuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgQmFyIHsgU3RyaW5nW1wiM1wiXSBhOyB9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJBcnJheSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKSk7CiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgRG91YmxlR2VuZXJpY0Vycm9yKSB7CkBAIC0zNDA1LDcgKzQ1NTUsNyBAQAogICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfc3RkZXJyID0KICAgICAgICJFUlJPUjogYS9CYXIuYWlkbDoxLjI4LTMzOiBDYW4gb25seSBzcGVjaWZ5IG9uZSBzZXQgb2YgdHlwZSBwYXJhbWV0ZXJzLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNDE0LDcgKzQ1NjQsNyBAQAogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9amF2YSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJzwnIikpOwogfQogCkBAIC0zNDI0LDcgKzQ1NzQsNyBAQAogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9amF2YSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCJBbm5vdGF0aW9ucyBmb3IgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLiIpKTsKIH0KIApAQCAtMzQzNCwxMSArNDU4NCw2NSBAQAogCiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgYS9CYXIuYWlkbCAtSSAuIC1vIG91dCAtLWxhbmc9amF2YSIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKICAgICAgICAgICAgICAgdGVzdGluZzo6SGFzU3Vic3RyKCJBbm5vdGF0aW9ucyBmb3IgdHlwZSBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuIikpOwogfQogCitURVNUX0YoQWlkbFRlc3QsIERlZmF1bHRTaG91bGRNYXRjaFdpdGhGaXhlZFNpemVBcnJheSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL0Jhci5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBhO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJjZWxhYmxlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50WzJdWzNdIGEgPSB7ezEsMiwzfSwgezQsNSw2fX07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKworICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIGEvQmFyLmFpZGwgLUkgLiAtbyBvdXQgLS1sYW5nPW5kayIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheVdpdGhXcm9uZ1R5cGVEZWZhdWx0VmFsdWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9CYXIuYWlkbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgYTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyY2VsYWJsZSBCYXIge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGludFsyXVszXSBhID0ge3tcIjFcIixcIjJcIixcIjNcIn0sIHs0LDUsNn19O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgSGFzU3Vic3RyKCJJbnZhbGlkIHR5cGUgc3BlY2lmaWVyIGZvciBhIGxpdGVyYWwgc3RyaW5nOiBpbnQiKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlXaXRoTW9yZUVsZW1lbnRzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRbMl1bM10gYSA9IHt7MSwyLDMsNH0sIHs0LDUsNn19O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJFeHBlY3RlZCBhbiBhcnJheSBvZiAzIGVsZW1lbnRzLCBidXQgZm91bmQgb25lIHdpdGggNCBlbGVtZW50cyIpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheVdpdGhGZXdlckVsZW1lbnRzKSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvQmFyLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmNlbGFibGUgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnRbMl1bM10gYSA9IHt9O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCBhL0Jhci5haWRsIC1JIC4gLW8gb3V0IC0tbGFuZz1qYXZhIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJFeHBlY3RlZCBhbiBhcnJheSBvZiAyIGVsZW1lbnRzLCBidXQgZm91bmQgb25lIHdpdGggMCBlbGVtZW50cyIpKTsKK30KKwogc3RydWN0IEdlbmVyaWNBaWRsVGVzdCA6IDo6dGVzdGluZzo6VGVzdCB7CiAgIEZha2VJb0RlbGVnYXRlIGlvX2RlbGVnYXRlXzsKICAgdm9pZCBDb21waWxlKHN0cmluZyBjbWQpIHsKQEAgLTM0NDksNyArNDY1Myw3IEBACiAKICAgICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKGNtZCk7CiAgICAgQ2FwdHVyZVN0ZGVycigpOwotICAgIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgICAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKICAgfQogfTsKQEAgLTM0NzgsNyArNDY4Miw3IEBACiAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9zdGRlcnIgPQogICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjExLTE1OiBFdmVyeSB0eXBlIHBhcmFtZXRlciBzaG91bGQgYmUgdW5pcXVlLlxuIjsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfTkUoMCwgOjphbmRyb2lkOjphaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9FUShleHBlY3RlZF9zdGRlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNDg3LDcgKzQ2OTEsNyBAQAogICBPcHRpb25zIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIEZvby5haWRsIC0tbGFuZz0iICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpKTsKICAgY29uc3Qgc3RyaW5nIGV4cGVjdGVkX3N0ZGVyciA9ICJFUlJPUjogRm9vLmFpZGw6MS4yMi0yNDogRmFpbGVkIHRvIHJlc29sdmUgJ1QnXG4iOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9ORSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGV4cGVjdGVkX3N0ZGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTM0OTUsNyArNDY5OSw3IEBACiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgImVudW0gRm9vIHsgRk9PID0gKDEgPDwgMSkgLyogY29tbWVudCAqLyB8IDB4MCB9Iik7CiAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgRm9vLmFpZGwgLS1sYW5nPSIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCA6OmFuZHJvaWQ6OmFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTEyLDcgKzQ3MTYsNyBAQAogICAgICAgInByb2hpYml0ZWQgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByZWNvZ25pemFibGUgaW4gIgogICAgICAgInRoZSByZWNlaXZpbmcgc2lkZS4gQ29uc2lkZXIgc3dpdGNoaW5nIHRvIGFuIGFycmF5IG9yIGEgZ2VuZXJpYyBMaXN0L01hcC5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRFcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTI5LDcgKzQ3MzMsNyBAQAogICAgICAgInByb2hpYml0ZWQgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByZWNvZ25pemFibGUgaW4gIgogICAgICAgInRoZSByZWNlaXZpbmcgc2lkZS4gQ29uc2lkZXIgc3dpdGNoaW5nIHRvIGFuIGFycmF5IG9yIGEgZ2VuZXJpYyBMaXN0L01hcC5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRFcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTQ4LDcgKzQ3NTIsNyBAQAogICAgICAgInByb2hpYml0ZWQgYmVjYXVzZSBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByZWNvZ25pemFibGUgaW4gIgogICAgICAgInRoZSByZWNlaXZpbmcgc2lkZS4gQ29uc2lkZXIgc3dpdGNoaW5nIHRvIGFuIGFycmF5IG9yIGEgZ2VuZXJpYyBMaXN0L01hcC5cbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX05FKDAsIDo6YW5kcm9pZDo6YWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWRFcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCkBAIC0zNTYyLDcgKzQ3NjYsNyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIGphdmEgLW8gb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIGF1dG8gZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKICAgRVhQRUNUX0VRKCIiLCBlcnIpOwogCkBAIC0zNTgxLDEzICs0Nzg1LDEzIEBACiB9KSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgYSAtLWxhbmcgY3BwIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoIiIsIGVycik7CiAKICAgc3RyaW5nIGNvZGU7CiAgIEVYUEVDVF9UUlVFKGlvX2RlbGVnYXRlXy5HZXRXcml0dGVuQ29udGVudHMoIm91dC9wL0Zvby5oIiwgJmNvZGUpKTsKLSAgRVhQRUNUX1RIQVQoY29kZSwgdGVzdGluZzo6SGFzU3Vic3RyKCI6OnA6OkVudW0gZSA9IDo6cDo6RW51bSg6OnA6OkVudW06OkJBUik7IikpOworICBFWFBFQ1RfVEhBVChjb2RlLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIjo6cDo6RW51bSBlID0gOjpwOjpFbnVtOjpCQVI7IikpOwogfQogCiBURVNUX0YoQWlkbFRlc3QsIEVudW1XaXRoRGVmYXVsdHNfTmRrKSB7CkBAIC0zNjAwLDcgKzQ4MDQsNyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIGF1dG8gZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKICAgRVhQRUNUX0VRKCIiLCBlcnIpOwogCkBAIC0zNjIwLDcgKzQ4MjQsNyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIHJ1c3QgLW8gb3V0IC1oIG91dCBhL3AvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDAsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7CiAgIEVYUEVDVF9FUSgiIiwgZXJyKTsKIApAQCAtMzY5MywxOSArNDg5NywzMyBAQAogfSkiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIGphdmEgLW8gb3V0IC1oIG91dCBhL3AvRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoIkVSUk9SOiBhL3AvRm9vLmFpZGw6NS4xMS0yMDogSW52YWxpZCB2YWx1ZSAoRW51bS5GT098RW51bS5CQVIpIGZvciBlbnVtIHAuRW51bVxuIiwKICAgICAgICAgICAgIGVycik7CiB9CiAKK1RFU1RfRihBaWRsVGVzdCwgRW51bURlZmF1bHRTaG91bGRCZUVudW1lcmF0b3JzX1JlamVjdHNOdW1lcmljVmFsdWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiYS9wL0VudW0uYWlkbCIsICJwYWNrYWdlIHA7IGVudW0gRW51bSB7IEZPTyA9IDEsIEJBUiA9IDJ9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvcC9Gb28uYWlkbCIsIFIiKAorcGFja2FnZSBwOworaW1wb3J0IHAuRW51bTsKK3BhcmNlbGFibGUgRm9vIHsKKyAgRW51bSBlID0gMTsKK30pIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtSSBhIC0tbGFuZyBqYXZhIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiSW52YWxpZCB2YWx1ZSAoMSkgZm9yIGVudW0gcC5FbnVtIikpOworfQorCiBURVNUX1AoQWlkbFRlc3QsIERlZmF1bHRXaXRoRW1wdHlBcnJheSkgewogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvRm9vLmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbyB7IHAuQmFyW10gYmFycyA9IHt9OyB9Iik7CiAgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoImEvcC9CYXIuYWlkbCIsICJwYWNrYWdlIHA7IHBhcmNlbGFibGUgQmFyIHsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nICIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkgKyAiIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoIiIsIGVycik7CiB9CkBAIC0zNzE5LDcgKzQ5MzcsNyBAQAogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtbyBvdXQgLWggb3V0IGEvcC9JRm9vLmFpZGwiKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgYXV0byBlcnIgPSBHZXRDYXB0dXJlZFN0ZGVycigpOwogICBFWFBFQ1RfRVEoCiAgICAgICAiRVJST1I6IGEvcC9JRm9vLmFpZGw6My4zMS00MTogVmFsdWUgbXVzdCBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24gYnV0IGNvbnRhaW5zIHJlZmVyZW5jZSB0byAiCkBAIC0zNzM0LDcgKzQ5NTIsNyBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvQmFyLmFpZGwiLCAicGFja2FnZSBwOyBlbnVtIEJhciB7IEZPTywgQkFSIH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMCwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfVFJVRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIGF1dG8gZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKICAgRVhQRUNUX0VRKCIiLCBlcnIpOwogICBzdHJpbmcgY29kZTsKQEAgLTM3NDgsMTIgKzQ5NjYsOSBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvRm9vLmFpZGwiLCAicGFja2FnZSBwOyBlbnVtIEZvbyB7IEEgPSBCLCBCIH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJFUlJPUjogYS9wL0Zvby5haWRsOjEuMjYtMjg6IEZvdW5kIGEgY2lyY3VsYXIgcmVmZXJlbmNlOiBCIC0+IEEgLT4gQlxuIgotICAgICAgIkVSUk9SOiBhL3AvRm9vLmFpZGw6MS4yOS0zMTogRm91bmQgYSBjaXJjdWxhciByZWZlcmVuY2U6IEEgLT4gQiAtPiBBXG4iLAotICAgICAgZXJyKTsKKyAgRVhQRUNUX0VRKCJFUlJPUjogYS9wL0Zvby5haWRsOjEuMjYtMjg6IEZvdW5kIGEgY2lyY3VsYXIgcmVmZXJlbmNlOiBCIC0+IEEgLT4gQlxuIiwgZXJyKTsKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBSZWplY3RzQ2lyY3VsYXJSZWZlcmVuY2luZ0NvbnN0cykgewpAQCAtMzc2MSw3ICs0OTc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEZvbyB7IGNvbnN0IGludCBBID0gQSArIDE7IH0iKTsKICAgQ2FwdHVyZVN0ZGVycigpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC1JIGEgLS1sYW5nIG5kayAtbyBvdXQgLWggb3V0IGEvcC9Gb28uYWlkbCIpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBhdXRvIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7CiAgIEVYUEVDVF9FUSgiRVJST1I6IGEvcC9Gb28uYWlkbDoxLjQyLTQ0OiBGb3VuZCBhIGNpcmN1bGFyIHJlZmVyZW5jZTogQSAtPiBBXG4iLCBlcnIpOwogfQpAQCAtMzc3NCwyMCArNDk4OSw0MCBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJhL3AvQmF6LmFpZGwiLCAicGFja2FnZSBwOyBwYXJjZWxhYmxlIEJheiB7IGNvbnN0IGludCBBID0gMTsgfSIpOwogICBDYXB0dXJlU3RkZXJyKCk7CiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLUkgYSAtLWxhbmcgbmRrIC1vIG91dCAtaCBvdXQgYS9wL0Zvby5haWRsIik7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZGVycigpKTsKK30KKworVEVTVF9QKEFpZGxUZXN0LCBDaXJjdWxhclJlZmVyZW5jZVdpdGhGdWxseVF1YWxpZmllZCkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsICJlbnVtIEZvbyB7IEEgPSBGb28uQSB9Iik7CisgIGF1dG8gb3B0aW9ucyA9CisgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtSSAuIC1vIG91dCAtaCBvdXQgRm9vLmFpZGwiKTsKKyAgY29uc3Qgc3RyaW5nIGVyciA9ICJFUlJPUjogRm9vLmFpZGw6MS4xNS0yMTogRm91bmQgYSBjaXJjdWxhciByZWZlcmVuY2U6IEZvby5BIC0+IEZvby5BXG4iOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUShlcnIsIEdldENhcHR1cmVkU3RkZXJyKCkpOworfQorCitURVNUX1AoQWlkbFRlc3QsIENvbnN0UmVmc0NhblBvaW50VG9UaGVTYW1lVmFsdWUpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygiRm9vLmFpZGwiLCAiZW51bSBGb28geyBBID0gMCB9Iik7CisgIC8vIHRoaXMgZGVtb25zdHJhdGVzIHRoZSBjYXNlIHRoYXQgIkZvby5BIiBjb25zdC1yZWYgbm9kZSBpcyB2aXNpdGVkIHR3aWNlIGJ5IEIgYW5kIEMuCisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkJhci5haWRsIiwgImVudW0gQmFyIHsgQSA9IEZvby5BLCBCID0gQSwgQyA9IEEgfSIpOworICBhdXRvIG9wdGlvbnMgPQorICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmcgIiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSArICIgLUkgLiAtbyBvdXQgLWggb3V0IEJhci5haWRsIik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIiIsIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQogCiBURVNUX1AoQWlkbFRlc3QsIFVua25vd25Db25zdFJlZmVyZW5jZSkgewotICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJGb28uYWlkbCIsICIgcGFyY2VsYWJsZSBGb28geyBVbmtub3duVHlwZSBmaWVsZCA9IFVOS05PV05fUkVGOyB9Iik7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoIkZvby5haWRsIiwgIiBwYXJjZWxhYmxlIEZvbyB7IGludCBmaWVsZCA9IFVOS05PV05fUkVGOyB9Iik7CiAgIGF1dG8gb3B0aW9ucyA9CiAgICAgICBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZyAiICsgdG9fc3RyaW5nKEdldExhbmd1YWdlKCkpICsgIiAtbyBvdXQgLWggb3V0IEZvby5haWRsIik7CiAgIGNvbnN0IHN0cmluZyBlcnIgPQotICAgICAgIkVSUk9SOiBGb28uYWlkbDoxLjE4LTMwOiBGYWlsZWQgdG8gcmVzb2x2ZSAnVW5rbm93blR5cGUnXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuMzgtNTA6IENhbid0IGZpbmQgVU5LTk9XTl9SRUYgaW4gRm9vXG4iCi0gICAgICAiRVJST1I6IEZvby5haWRsOjEuMzgtNTA6IFVua25vd24gcmVmZXJlbmNlICdVTktOT1dOX1JFRidcbiI7CisgICAgICAiRVJST1I6IEZvby5haWRsOjEuMzAtNDI6IENhbid0IGZpbmQgVU5LTk9XTl9SRUYgaW4gRm9vXG4iCisgICAgICAiRVJST1I6IEZvby5haWRsOjEuMzAtNDI6IFVua25vd24gcmVmZXJlbmNlICdVTktOT1dOX1JFRidcbiI7CiAgIENhcHR1cmVTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKDEsIGFpZGw6OmNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKGVyciwgR2V0Q2FwdHVyZWRTdGRlcnIoKSk7CiB9CiAKQEAgLTM4MDUsNyArNTA0MCw3IEBACiAgIGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nICIgKyB0b19zdHJpbmcoR2V0TGFuZ3VhZ2UoKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLVdldmVyeXRoaW5nIC1vIG91dCAtaCBvdXQgcC9Gb28uYWlkbCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgwLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9UUlVFKGNvbXBpbGVfYWlkbChvcHRpb25zLCBpb19kZWxlZ2F0ZV8pKTsKICAgRVhQRUNUX0VRKCJXQVJOSU5HOiBwL0Zvby5haWRsOjEuMS0xMDogSW50ZXJmYWNlIG5hbWVzIHNob3VsZCBzdGFydCB3aXRoIEkuIFstV2ludGVyZmFjZS1uYW1lXVxuIiwKICAgICAgICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQpAQCAtMzgxNSw3ICs1MDUwLDcgQEAKICAgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmcgIiArIHRvX3N0cmluZyhHZXRMYW5ndWFnZSgpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtV2V2ZXJ5dGhpbmcgLVdlcnJvciAtbyBvdXQgLWggb3V0IHAvRm9vLmFpZGwiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfRVEoIkVSUk9SOiBwL0Zvby5haWRsOjEuMS0xMDogSW50ZXJmYWNlIG5hbWVzIHNob3VsZCBzdGFydCB3aXRoIEkuIFstV2ludGVyZmFjZS1uYW1lXVxuIiwKICAgICAgICAgICAgIEdldENhcHR1cmVkU3RkZXJyKCkpOwogfQpAQCAtMzgyOSw3ICs1MDY0LDcgQEAKIAogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKHsiYWlkbC1jcHAiLCBpbnB1dF9maWxlLCBoZWFkZXJfZGlyLCBvdXRwdXRfZmlsZX0pOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9USEFUKAogICAgICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSwKICAgICAgIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoCkBAIC0zODUyLDIyICs1MDg3LDE4IEBACiAgICAgICB7e3siLypcbiIKICAgICAgICAgICIgKiBIZWxsbywgd29ybGQhXG4iCiAgICAgICAgICAiICovIn19LAotICAgICAgICIvKipcbiIKLSAgICAgICAiICogSGVsbG8sIHdvcmxkIVxuIgotICAgICAgICIgKi8ifSwKLSAgICAgIHt7eyIvKiBAaGlkZSAqLyJ9fSwgIi8qKiBAaGlkZSAqLyJ9LAorICAgICAgICIvKiogSGVsbG8sIHdvcmxkISAqL1xuIn0sCisgICAgICB7e3siLyogQGhpZGUgKi8ifX0sICIvKiogQGhpZGUgKi9cbiJ9LAogICAgICAge3t7Ii8qKlxuIgogICAgICAgICAgIiAgIEBwYXJhbSBmb28gLi4uXG4iCiAgICAgICAgICAiKi8ifX0sCi0gICAgICAgIi8qKlxuIgotICAgICAgICIgICBAcGFyYW0gZm9vIC4uLlxuIgotICAgICAgICIqLyJ9LAotICAgICAge3t7Ii8qIEBoaWRlICovIn0sIHsiLyogQGhpZGUgKi8ifX0sICIvKiBAaGlkZSAqLy8qKiBAaGlkZSAqLyJ9LAorICAgICAgICIvKiogQHBhcmFtIGZvbyAuLi4gKi9cbiJ9LAorICAgICAge3t7Ii8qIEBoaWRlICovIn0sIHsiLyogQGhpZGUgKi8ifX0sICIvKiBAaGlkZSAqL1xuLyoqIEBoaWRlICovXG4ifSwKICAgICAgIHt7eyIvKiBAZGVwcmVjYXRlZCBmaXJzdCAqLyJ9LCB7Ii8qIEBkZXByZWNhdGVkIHNlY29uZCAqLyJ9fSwKLSAgICAgICAiLyogQGRlcHJlY2F0ZWQgZmlyc3QgKi8vKiogQGRlcHJlY2F0ZWQgc2Vjb25kICovIn0sCi0gICAgICB7e3siLyogQGRlcHJlY2F0ZWQgKi8ifSwgeyIvKiogQHBhcmFtIGZvbyAqLyJ9fSwgIi8qIEBkZXByZWNhdGVkICovLyoqIEBwYXJhbSBmb28gKi8ifSwKKyAgICAgICAiLyogQGRlcHJlY2F0ZWQgZmlyc3QgKi9cbi8qKiBAZGVwcmVjYXRlZCBzZWNvbmQgKi9cbiJ9LAorICAgICAge3t7Ii8qIEBkZXByZWNhdGVkICovIn0sIHsiLyoqIEBwYXJhbSBmb28gKi8ifX0sICIvKiBAZGVwcmVjYXRlZCAqL1xuLyoqIEBwYXJhbSBmb28gKi9cbiJ9LAogICAgICAgLy8gTGluZSBjb21tZW50cyBhcmUgcHJpbnRlZCBhcyB0aGV5IGFyZQotICAgICAge3t7Ii8qIEBkZXByZWNhdGVkICovIn0sIHsiLy8gbGluZSBjb21tZW50c1xuIn19LCAiLyogQGRlcHJlY2F0ZWQgKi8vLyBsaW5lIGNvbW1lbnRzXG4ifSwKKyAgICAgIHt7eyIvKiBAZGVwcmVjYXRlZCAqLyJ9LCB7Ii8vIGxpbmUgY29tbWVudHNcbiJ9fSwgIi8qIEBkZXByZWNhdGVkICovXG4vLyBsaW5lIGNvbW1lbnRzXG4ifSwKICAgfTsKICAgZm9yIChjb25zdCBhdXRvJiBbaW5wdXQsIGZvcm1hdHRlZF0gOiB0ZXN0Y2FzZXMpIHsKICAgICBFWFBFQ1RfRVEoZm9ybWF0dGVkLCBGb3JtYXRDb21tZW50c0ZvckphdmEoaW5wdXQpKTsKQEAgLTM4ODEsNyArNTExMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKICAgYXV0byBvcHRpb25zID0gT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSBJRm9vLmFpZGwiKTsKICAgQ2FwdHVyZVN0ZGVycigpOwotICBFWFBFQ1RfRVEoMSwgYWlkbDo6Y29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKG9wdGlvbnMsIGlvX2RlbGVnYXRlXykpOwogICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCBIYXNTdWJzdHIoIkBIaWRlIGlzIG5vdCBhdmFpbGFibGUiKSk7CiB9CiAKQEAgLTM4ODksMTM5ICs1MTIwLDMyMiBAQAogICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKAogICAgICAgIklGb28uYWlkbCIsCiAgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgotICAgICAgIiAgdm9pZCBmb28oaW4gQFN1cHByZXNzV2FybmluZ3ModmFsdWU9XCJpbm91dC1wYXJhbWV0ZXJcIikgaW50IHgpO1xuIgorICAgICAgIiAgdm9pZCBmb28oaW4gQFN1cHByZXNzV2FybmluZ3ModmFsdWU9e1wiaW5vdXQtcGFyYW1ldGVyXCJ9KSBpbnQgeCk7XG4iCiAgICAgICAifSIpOwogICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIElGb28uYWlkbCIpOwogICBDYXB0dXJlU3RkZXJyKCk7Ci0gIEVYUEVDVF9FUSgxLCBhaWRsOjpjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CiAgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiQFN1cHByZXNzV2FybmluZ3MgaXMgbm90IGF2YWlsYWJsZSIpKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0LCBWb2lkQ2FudEJlVXNlZEluTWV0aG9kUGFyYW1ldGVyVHlwZSkgeworICBpb19kZWxlZ2F0ZV8uU2V0RmlsZUNvbnRlbnRzKCJwL0lGb28uYWlkbCIsICJpbnRlcmZhY2UgSUZvb3sgdm9pZCBqKHZvaWQgbik7fSIpOworICBhdXRvIG9wdGlvbnMgPSBPcHRpb25zOjpGcm9tKCJhaWRsIC0tbGFuZz1qYXZhIC1vIG91dCBwL0lGb28uYWlkbCIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9GQUxTRShjb21waWxlX2FpZGwob3B0aW9ucywgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3RkZXJyKCksIEhhc1N1YnN0cigiJ3ZvaWQnIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgdGhlIHBhcmFtZXRlciAnbiciKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgSW50ZXJmYWNlVmVjdG9ySXNBdmFpbGFibGVBZnRlclRpcmFtaXN1KSB7CisgIGlvX2RlbGVnYXRlXy5TZXRGaWxlQ29udGVudHMoInAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIElGb297XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdm9pZCBmb28oaW4gSUZvb1tdIG4pO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZvaWQgYmFyKGluIExpc3Q8SUZvbz4gbik7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBFWFBFQ1RfRkFMU0UoY29tcGlsZV9haWRsKAorICAgICAgT3B0aW9uczo6RnJvbSgiYWlkbCAtLWxhbmc9amF2YSAtLW1pbl9zZGtfdmVyc2lvbiAzMCAtbyBvdXQgcC9JRm9vLmFpZGwiKSwgaW9fZGVsZWdhdGVfKSk7CisgIGF1dG8gY2FwdHVyZWRfc3RkZXJyID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKKyAgRVhQRUNUX1RIQVQoY2FwdHVyZWRfc3RkZXJyLCBIYXNTdWJzdHIoIkFycmF5IG9mIGludGVyZmFjZXMgaXMgYXZhaWxhYmxlIHNpbmNlIikpOworICBFWFBFQ1RfVEhBVChjYXB0dXJlZF9zdGRlcnIsIEhhc1N1YnN0cigiTGlzdCBvZiBpbnRlcmZhY2VzIGlzIGF2YWlsYWJsZSBzaW5jZSIpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgY29tcGlsZV9haWRsKE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLS1taW5fc2RrX3ZlcnNpb24gVGlyYW1pc3UgLW8gb3V0IHAvSUZvby5haWRsIiksCisgICAgICAgICAgICAgICAgICAgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUHJvcGFnYXRlQmVmb3JlVGlyYW1pc3UpIHsKKyAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cygicC9JRm9vLmFpZGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvb3tcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBAUHJvcGFnYXRlQWxsb3dCbG9ja2luZyBJQmluZGVyIGZvbygpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9Iik7CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbXBpbGVfYWlkbCgKKyAgICAgIE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLS1taW5fc2RrX3ZlcnNpb24gMzAgLW8gb3V0IHAvSUZvby5haWRsIiksIGlvX2RlbGVnYXRlXykpOworICBhdXRvIGNhcHR1cmVkX3N0ZGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7CisgIEVYUEVDVF9USEFUKGNhcHR1cmVkX3N0ZGVyciwgSGFzU3Vic3RyKCJAUHJvcGFnYXRlQWxsb3dCbG9ja2luZyByZXF1aXJlcyIpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgY29tcGlsZV9haWRsKE9wdGlvbnM6OkZyb20oImFpZGwgLS1sYW5nPWphdmEgLS1taW5fc2RrX3ZlcnNpb24gVGlyYW1pc3UgLW8gb3V0IHAvSUZvby5haWRsIiksCisgICAgICAgICAgICAgICAgICAgaW9fZGVsZWdhdGVfKSk7CisgIEVYUEVDVF9FUShHZXRDYXB0dXJlZFN0ZGVycigpLCAiIik7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgUnVzdE5hbWVPZl9QZmRGaXhlZEFycmF5KSB7CisgIGF1dG8gcGZkID0gdHlwZW5hbWVzXy5NYWtlUmVzb2x2ZWRUeXBlKEFJRExfTE9DQVRJT05fSEVSRSwgIlBhcmNlbEZpbGVEZXNjcmlwdG9yIiwgZmFsc2UpOworICBBU1NFUlRfVFJVRShwZmQtPk1ha2VBcnJheShGaXhlZFNpemVBcnJheXsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsQ29uc3RhbnRWYWx1ZT4oQWlkbENvbnN0YW50VmFsdWU6OkludGVncmFsKEFJRExfTE9DQVRJT05fSEVSRSwgIjIiKSl9KSk7CisgIEFTU0VSVF9UUlVFKHBmZC0+TWFrZUFycmF5KEZpeGVkU2l6ZUFycmF5eworICAgICAgc3RkOjp1bmlxdWVfcHRyPEFpZGxDb25zdGFudFZhbHVlPihBaWRsQ29uc3RhbnRWYWx1ZTo6SW50ZWdyYWwoQUlETF9MT0NBVElPTl9IRVJFLCAiMyIpKX0pKTsKKyAgRVhQRUNUX0VRKAorICAgICAgcnVzdDo6UnVzdE5hbWVPZigqcGZkLCB0eXBlbmFtZXNfLCBydXN0OjpTdG9yYWdlTW9kZTo6UEFSQ0VMQUJMRV9GSUVMRCwgcnVzdDo6TGlmZXRpbWU6Ok5PTkUpLAorICAgICAgIltbT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+OyAzXTsgMl0iKTsKKyAgRVhQRUNUX0VRKAorICAgICAgcnVzdDo6UnVzdE5hbWVPZigqcGZkLCB0eXBlbmFtZXNfLCBydXN0OjpTdG9yYWdlTW9kZTo6REVGQVVMVF9WQUxVRSwgcnVzdDo6TGlmZXRpbWU6Ok5PTkUpLAorICAgICAgIltbT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+OyAzXTsgMl0iKTsKKyAgRVhQRUNUX0VRKAorICAgICAgcnVzdDo6UnVzdE5hbWVPZigqcGZkLCB0eXBlbmFtZXNfLCBydXN0OjpTdG9yYWdlTW9kZTo6SU5fQVJHVU1FTlQsIHJ1c3Q6OkxpZmV0aW1lOjpOT05FKSwKKyAgICAgICImW1tiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yOyAzXTsgMl0iKTsKKyAgRVhQRUNUX0VRKHJ1c3Q6OlJ1c3ROYW1lT2YoKnBmZCwgdHlwZW5hbWVzXywgcnVzdDo6U3RvcmFnZU1vZGU6OlZBTFVFLCBydXN0OjpMaWZldGltZTo6Tk9ORSksCisgICAgICAgICAgICAiW1tiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yOyAzXTsgMl0iKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBSdXN0TmFtZU9mX1BmZER5bmFtaWNBcnJheSkgeworICBhdXRvIHBmZCA9IHR5cGVuYW1lc18uTWFrZVJlc29sdmVkVHlwZShBSURMX0xPQ0FUSU9OX0hFUkUsICJQYXJjZWxGaWxlRGVzY3JpcHRvciIsIHRydWUpOworICBFWFBFQ1RfRVEoCisgICAgICBydXN0OjpSdXN0TmFtZU9mKCpwZmQsIHR5cGVuYW1lc18sIHJ1c3Q6OlN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxELCBydXN0OjpMaWZldGltZTo6Tk9ORSksCisgICAgICAiVmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+Iik7CisgIEVYUEVDVF9FUSgKKyAgICAgIHJ1c3Q6OlJ1c3ROYW1lT2YoKnBmZCwgdHlwZW5hbWVzXywgcnVzdDo6U3RvcmFnZU1vZGU6OkRFRkFVTFRfVkFMVUUsIHJ1c3Q6OkxpZmV0aW1lOjpOT05FKSwKKyAgICAgICJWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiIpOworICAvLyB3ZSB1c2UgVU5TSVpFRF9BUkdVTUVOVCBtb2RlIGZvciBpbnB1dCBhcmd1bWVudCBvZiBkeW5hbWljIGFycmF5CisgIEVYUEVDVF9FUSgKKyAgICAgIHJ1c3Q6OlJ1c3ROYW1lT2YoKnBmZCwgdHlwZW5hbWVzXywgcnVzdDo6U3RvcmFnZU1vZGU6OlVOU0laRURfQVJHVU1FTlQsIHJ1c3Q6OkxpZmV0aW1lOjpOT05FKSwKKyAgICAgICImW2JpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3JdIik7CisgIEVYUEVDVF9FUShydXN0OjpSdXN0TmFtZU9mKCpwZmQsIHR5cGVuYW1lc18sIHJ1c3Q6OlN0b3JhZ2VNb2RlOjpWQUxVRSwgcnVzdDo6TGlmZXRpbWU6Ok5PTkUpLAorICAgICAgICAgICAgIlZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiIpOworfQorCiBzdHJ1Y3QgVHlwZVBhcmFtIHsKICAgc3RyaW5nIGtpbmQ7CiAgIHN0cmluZyBsaXRlcmFsOwogfTsKIAogY29uc3QgVHlwZVBhcmFtIGtUeXBlUGFyYW1zW10gPSB7Ci0gICAgeyJwcmltaXRpdmUiLCAiaW50In0sICAgeyJwcmltaXRpdmVBcnJheSIsICJpbnRbXSJ9LAotICAgIHsiU3RyaW5nIiwgIlN0cmluZyJ9LCAgIHsiU3RyaW5nQXJyYXkiLCAiU3RyaW5nW10ifSwKLSAgICB7IklCaW5kZXIiLCAiSUJpbmRlciJ9LCB7IlBhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIlBhcmNlbEZpbGVEZXNjcmlwdG9yIn0sCi0gICAgeyJwYXJjZWxhYmxlIiwgIkZvbyJ9LCAgeyJlbnVtIiwgImEuRW51bSJ9LAotICAgIHsidW5pb24iLCAiYS5VbmlvbiJ9LCAgIHsiaW50ZXJmYWNlIiwgImEuSUJhciJ9LAorICAgIHsicHJpbWl0aXZlIiwgImludCJ9LAorICAgIHsicHJpbWl0aXZlQXJyYXkiLCAiaW50W10ifSwKKyAgICB7InByaW1pdGl2ZUZpeGVkQXJyYXkiLCAiaW50WzNdIn0sCisgICAgeyJTdHJpbmciLCAiU3RyaW5nIn0sCisgICAgeyJTdHJpbmdBcnJheSIsICJTdHJpbmdbXSJ9LAorICAgIHsiSUJpbmRlciIsICJJQmluZGVyIn0sCisgICAgeyJQYXJjZWxGaWxlRGVzY3JpcHRvciIsICJQYXJjZWxGaWxlRGVzY3JpcHRvciJ9LAorICAgIHsicGFyY2VsYWJsZSIsICJhLkZvbyJ9LAorICAgIHsiZW51bSIsICJhLkVudW0ifSwKKyAgICB7InVuaW9uIiwgImEuVW5pb24ifSwKKyAgICB7ImludGVyZmFjZSIsICJhLklCYXIifSwKIH07CiAKLWNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4ga0xpc3RTdXBwb3J0RXhwZWN0YXRpb25zID0gewotICAgIHsiY3BwX3ByaW1pdGl2ZSIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QgaGF2ZSBhbnkgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVycy4ifSwKLSAgICB7ImphdmFfcHJpbWl0aXZlIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsibmRrX3ByaW1pdGl2ZSIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QgaGF2ZSBhbnkgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVycy4ifSwKLSAgICB7InJ1c3RfcHJpbWl0aXZlIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsiY3BwX3ByaW1pdGl2ZUFycmF5IiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJqYXZhX3ByaW1pdGl2ZUFycmF5IiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJuZGtfcHJpbWl0aXZlQXJyYXkiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7InJ1c3RfcHJpbWl0aXZlQXJyYXkiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7ImNwcF9TdHJpbmciLCAiIn0sCi0gICAgeyJqYXZhX1N0cmluZyIsICIifSwKLSAgICB7Im5ka19TdHJpbmciLCAiIn0sCi0gICAgeyJydXN0X1N0cmluZyIsICIifSwKLSAgICB7ImNwcF9TdHJpbmdBcnJheSIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkLiJ9LAotICAgIHsiamF2YV9TdHJpbmdBcnJheSIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkLiJ9LAotICAgIHsibmRrX1N0cmluZ0FycmF5IiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJydXN0X1N0cmluZ0FycmF5IiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJjcHBfSUJpbmRlciIsICIifSwKLSAgICB7ImphdmFfSUJpbmRlciIsICIifSwKLSAgICB7Im5ka19JQmluZGVyIiwgIkxpc3Q8SUJpbmRlcj4gaXMgbm90IHN1cHBvcnRlZC4gTGlzdCBpbiBOREsgZG9lc24ndCBzdXBwb3J0IElCaW5kZXIuIn0sCi0gICAgeyJydXN0X0lCaW5kZXIiLCAiIn0sCi0gICAgeyJjcHBfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiIn0sCi0gICAgeyJqYXZhX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIiJ9LAotICAgIHsibmRrX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIiJ9LAotICAgIHsicnVzdF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsICIifSwKLSAgICB7ImNwcF9pbnRlcmZhY2UiLCAiTGlzdDxhLklCYXI+IGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJqYXZhX2ludGVyZmFjZSIsICJMaXN0PGEuSUJhcj4gaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7Im5ka19pbnRlcmZhY2UiLCAiTGlzdDxhLklCYXI+IGlzIG5vdCBzdXBwb3J0ZWQuIn0sCi0gICAgeyJydXN0X2ludGVyZmFjZSIsICJMaXN0PGEuSUJhcj4gaXMgbm90IHN1cHBvcnRlZC4ifSwKLSAgICB7ImNwcF9wYXJjZWxhYmxlIiwgIiJ9LAotICAgIHsiamF2YV9wYXJjZWxhYmxlIiwgIiJ9LAotICAgIHsibmRrX3BhcmNlbGFibGUiLCAiIn0sCi0gICAgeyJydXN0X3BhcmNlbGFibGUiLCAiIn0sCi0gICAgeyJjcHBfZW51bSIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QgaGF2ZSBhbnkgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVycy4ifSwKLSAgICB7ImphdmFfZW51bSIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QgaGF2ZSBhbnkgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVycy4ifSwKLSAgICB7Im5ka19lbnVtIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsicnVzdF9lbnVtIiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCBoYXZlIGFueSBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXJzLiJ9LAotICAgIHsiY3BwX3VuaW9uIiwgIiJ9LAotICAgIHsiamF2YV91bmlvbiIsICIifSwKLSAgICB7Im5ka191bmlvbiIsICIifSwKLSAgICB7InJ1c3RfdW5pb24iLCAiIn0sCitzdHJ1Y3QgRXhwZWN0ZWRSZXN1bHQgeworICBzdHJpbmcgZXhwZWN0ZWRfZXJyb3I7CisgIHN0cmluZyBleHBlY3RlZF9lcnJvcl9mb3JfbnVsbGFibGU7CiB9OwogCi1jb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGtBcnJheVN1cHBvcnRFeHBlY3RhdGlvbnMgPSB7Ci0gICAgeyJjcHBfcHJpbWl0aXZlIiwgIiJ9LAotICAgIHsiamF2YV9wcmltaXRpdmUiLCAiIn0sCi0gICAgeyJuZGtfcHJpbWl0aXZlIiwgIiJ9LAotICAgIHsicnVzdF9wcmltaXRpdmUiLCAiIn0sCi0gICAgeyJjcHBfcHJpbWl0aXZlQXJyYXkiLCAiQ2FuIG9ubHkgaGF2ZSBvbmUgZGltZW5zaW9uYWwgYXJyYXlzLiJ9LAotICAgIHsiamF2YV9wcmltaXRpdmVBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJuZGtfcHJpbWl0aXZlQXJyYXkiLCAiQ2FuIG9ubHkgaGF2ZSBvbmUgZGltZW5zaW9uYWwgYXJyYXlzLiJ9LAotICAgIHsicnVzdF9wcmltaXRpdmVBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJjcHBfU3RyaW5nIiwgIiJ9LAotICAgIHsiamF2YV9TdHJpbmciLCAiIn0sCi0gICAgeyJuZGtfU3RyaW5nIiwgIiJ9LAotICAgIHsicnVzdF9TdHJpbmciLCAiIn0sCi0gICAgeyJjcHBfU3RyaW5nQXJyYXkiLCAiQ2FuIG9ubHkgaGF2ZSBvbmUgZGltZW5zaW9uYWwgYXJyYXlzLiJ9LAotICAgIHsiamF2YV9TdHJpbmdBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJuZGtfU3RyaW5nQXJyYXkiLCAiQ2FuIG9ubHkgaGF2ZSBvbmUgZGltZW5zaW9uYWwgYXJyYXlzLiJ9LAotICAgIHsicnVzdF9TdHJpbmdBcnJheSIsICJDYW4gb25seSBoYXZlIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuIn0sCi0gICAgeyJjcHBfSUJpbmRlciIsICIifSwKLSAgICB7ImphdmFfSUJpbmRlciIsICIifSwKLSAgICB7Im5ka19JQmluZGVyIiwgIlRoZSBuZGsgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IGFycmF5IG9mIElCaW5kZXIifSwKLSAgICB7InJ1c3RfSUJpbmRlciIsICJUaGUgcnVzdCBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgYXJyYXkgb2YgSUJpbmRlciJ9LAotICAgIHsiY3BwX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgIiJ9LAotICAgIHsiamF2YV9QYXJjZWxGaWxlRGVzY3JpcHRvciIsICIifSwKLSAgICB7Im5ka19QYXJjZWxGaWxlRGVzY3JpcHRvciIsICIifSwKLSAgICB7InJ1c3RfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCAiIn0sCi0gICAgeyJjcHBfaW50ZXJmYWNlIiwgIkJpbmRlciB0eXBlIGNhbm5vdCBiZSBhbiBhcnJheSJ9LAotICAgIHsiamF2YV9pbnRlcmZhY2UiLCAiQmluZGVyIHR5cGUgY2Fubm90IGJlIGFuIGFycmF5In0sCi0gICAgeyJuZGtfaW50ZXJmYWNlIiwgIkJpbmRlciB0eXBlIGNhbm5vdCBiZSBhbiBhcnJheSJ9LAotICAgIHsicnVzdF9pbnRlcmZhY2UiLCAiQmluZGVyIHR5cGUgY2Fubm90IGJlIGFuIGFycmF5In0sCi0gICAgeyJjcHBfcGFyY2VsYWJsZSIsICIifSwKLSAgICB7ImphdmFfcGFyY2VsYWJsZSIsICIifSwKLSAgICB7Im5ka19wYXJjZWxhYmxlIiwgIiJ9LAotICAgIHsicnVzdF9wYXJjZWxhYmxlIiwgIiJ9LAotICAgIHsiY3BwX2VudW0iLCAiIn0sCi0gICAgeyJqYXZhX2VudW0iLCAiIn0sCi0gICAgeyJuZGtfZW51bSIsICIifSwKLSAgICB7InJ1c3RfZW51bSIsICIifSwKLSAgICB7ImNwcF91bmlvbiIsICIifSwKLSAgICB7ImphdmFfdW5pb24iLCAiIn0sCi0gICAgeyJuZGtfdW5pb24iLCAiIn0sCi0gICAgeyJydXN0X3VuaW9uIiwgIiJ9LAorY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEV4cGVjdGVkUmVzdWx0PiBrTGlzdFN1cHBvcnRFeHBlY3RhdGlvbnMgPSB7CisgICAgeyJjcHBfcHJpbWl0aXZlIiwgeyJBIGdlbmVyaWMgdHlwZSBjYW5ub3QiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90In19LAorICAgIHsiamF2YV9wcmltaXRpdmUiLCB7IkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QifX0sCisgICAgeyJuZGtfcHJpbWl0aXZlIiwgeyJBIGdlbmVyaWMgdHlwZSBjYW5ub3QiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90In19LAorICAgIHsicnVzdF9wcmltaXRpdmUiLCB7IkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCIsICJBIGdlbmVyaWMgdHlwZSBjYW5ub3QifX0sCisgICAgeyJjcHBfcHJpbWl0aXZlQXJyYXkiLCB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7ImphdmFfcHJpbWl0aXZlQXJyYXkiLCB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmVBcnJheSIsIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsicnVzdF9wcmltaXRpdmVBcnJheSIsIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsiY3BwX3ByaW1pdGl2ZUZpeGVkQXJyYXkiLAorICAgICB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7ImphdmFfcHJpbWl0aXZlRml4ZWRBcnJheSIsCisgICAgIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsibmRrX3ByaW1pdGl2ZUZpeGVkQXJyYXkiLAorICAgICB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7InJ1c3RfcHJpbWl0aXZlRml4ZWRBcnJheSIsCisgICAgIHsiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCIsICJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIn19LAorICAgIHsiY3BwX1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsibmRrX1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX1N0cmluZ0FycmF5IiwgeyJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQifX0sCisgICAgeyJqYXZhX1N0cmluZ0FycmF5IiwgeyJMaXN0IG9mIGFycmF5cyBpcyBub3Qgc3VwcG9ydGVkIiwgIkxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQifX0sCisgICAgeyJuZGtfU3RyaW5nQXJyYXkiLCB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7InJ1c3RfU3RyaW5nQXJyYXkiLCB7Ikxpc3Qgb2YgYXJyYXlzIGlzIG5vdCBzdXBwb3J0ZWQiLCAiTGlzdCBvZiBhcnJheXMgaXMgbm90IHN1cHBvcnRlZCJ9fSwKKyAgICB7ImNwcF9JQmluZGVyIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9JQmluZGVyIiwgeyIiLCAiIn19LAorICAgIHsibmRrX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJydXN0X0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJjcHBfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsibmRrX1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9pbnRlcmZhY2UiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19pbnRlcmZhY2UiLCB7IiIsICIifX0sCisgICAgeyJydXN0X2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9wYXJjZWxhYmxlIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9wYXJjZWxhYmxlIiwgeyIiLCAiIn19LAorICAgIHsibmRrX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJydXN0X3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJjcHBfZW51bSIsIHsiQSBnZW5lcmljIHR5cGUgY2Fubm90IiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCJ9fSwKKyAgICB7ImphdmFfZW51bSIsIHsiQSBnZW5lcmljIHR5cGUgY2Fubm90IiwgIkEgZ2VuZXJpYyB0eXBlIGNhbm5vdCJ9fSwKKyAgICB7Im5ka19lbnVtIiwgeyJBIGdlbmVyaWMgdHlwZSBjYW5ub3QiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90In19LAorICAgIHsicnVzdF9lbnVtIiwgeyJBIGdlbmVyaWMgdHlwZSBjYW5ub3QiLCAiQSBnZW5lcmljIHR5cGUgY2Fubm90In19LAorICAgIHsiY3BwX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV91bmlvbiIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka191bmlvbiIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfdW5pb24iLCB7IiIsICIifX0sCiB9OwogCi1jbGFzcyBBaWRsVHlwZVBhcmFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8T3B0aW9uczo6TGFuZ3VhZ2UsIFR5cGVQYXJhbT4+IHsKK2NvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBFeHBlY3RlZFJlc3VsdD4ga0FycmF5U3VwcG9ydEV4cGVjdGF0aW9ucyA9IHsKKyAgICB7ImNwcF9wcmltaXRpdmUiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3ByaW1pdGl2ZSIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmUiLCB7IiIsICIifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9wcmltaXRpdmVBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsiamF2YV9wcmltaXRpdmVBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsibmRrX3ByaW1pdGl2ZUFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZUFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJjcHBfcHJpbWl0aXZlRml4ZWRBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsiamF2YV9wcmltaXRpdmVGaXhlZEFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJuZGtfcHJpbWl0aXZlRml4ZWRBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsicnVzdF9wcmltaXRpdmVGaXhlZEFycmF5IiwKKyAgICAgeyJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiIsCisgICAgICAiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4ifX0sCisgICAgeyJjcHBfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJuZGtfU3RyaW5nIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF9TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJjcHBfU3RyaW5nQXJyYXkiLAorICAgICB7Ik11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIiwKKyAgICAgICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiJ9fSwKKyAgICB7ImphdmFfU3RyaW5nQXJyYXkiLAorICAgICB7Ik11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIiwKKyAgICAgICJNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbXVzdCBiZSBmaXhlZCBzaXplLiJ9fSwKKyAgICB7Im5ka19TdHJpbmdBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsicnVzdF9TdHJpbmdBcnJheSIsCisgICAgIHsiTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG11c3QgYmUgZml4ZWQgc2l6ZS4iLAorICAgICAgIk11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBtdXN0IGJlIGZpeGVkIHNpemUuIn19LAorICAgIHsiY3BwX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJuZGtfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJuZGtfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJydXN0X1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsibmRrX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJuZGtfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9lbnVtIiwgeyIiLCAiIn19LAorICAgIHsiamF2YV9lbnVtIiwgeyIiLCAiIn19LAorICAgIHsibmRrX2VudW0iLCB7IiIsICIifX0sCisgICAgeyJydXN0X2VudW0iLCB7IiIsICIifX0sCisgICAgeyJjcHBfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsibmRrX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF91bmlvbiIsIHsiIiwgIiJ9fSwKK307CisKK2NvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBFeHBlY3RlZFJlc3VsdD4ga0ZpZWxkU3VwcG9ydEV4cGVjdGF0aW9ucyA9IHsKKyAgICB7ImNwcF9wcmltaXRpdmUiLCB7IiIsICJjYW5ub3QgZ2V0IG51bGxhYmxlIGFubm90YXRpb24ifX0sCisgICAgeyJqYXZhX3ByaW1pdGl2ZSIsIHsiIiwgImNhbm5vdCBnZXQgbnVsbGFibGUgYW5ub3RhdGlvbiJ9fSwKKyAgICB7Im5ka19wcmltaXRpdmUiLCB7IiIsICJjYW5ub3QgZ2V0IG51bGxhYmxlIGFubm90YXRpb24ifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZSIsIHsiIiwgImNhbm5vdCBnZXQgbnVsbGFibGUgYW5ub3RhdGlvbiJ9fSwKKyAgICB7ImNwcF9wcmltaXRpdmVBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfcHJpbWl0aXZlQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJuZGtfcHJpbWl0aXZlQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJydXN0X3ByaW1pdGl2ZUFycmF5IiwgeyIiLCAiIn19LAorICAgIHsiY3BwX3ByaW1pdGl2ZUZpeGVkQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3ByaW1pdGl2ZUZpeGVkQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJuZGtfcHJpbWl0aXZlRml4ZWRBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfcHJpbWl0aXZlRml4ZWRBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJqYXZhX1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7Im5ka19TdHJpbmciLCB7IiIsICIifX0sCisgICAgeyJydXN0X1N0cmluZyIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9TdHJpbmdBcnJheSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfU3RyaW5nQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJuZGtfU3RyaW5nQXJyYXkiLCB7IiIsICIifX0sCisgICAgeyJydXN0X1N0cmluZ0FycmF5IiwgeyIiLCAiIn19LAorICAgIHsiY3BwX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX0lCaW5kZXIiLCB7IiIsICIifX0sCisgICAgeyJuZGtfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfSUJpbmRlciIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9QYXJjZWxGaWxlRGVzY3JpcHRvciIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJuZGtfUGFyY2VsRmlsZURlc2NyaXB0b3IiLCB7IiIsICIifX0sCisgICAgeyJydXN0X1BhcmNlbEZpbGVEZXNjcmlwdG9yIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImphdmFfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsibmRrX2ludGVyZmFjZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfaW50ZXJmYWNlIiwgeyIiLCAiIn19LAorICAgIHsiY3BwX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3BhcmNlbGFibGUiLCB7IiIsICIifX0sCisgICAgeyJuZGtfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7InJ1c3RfcGFyY2VsYWJsZSIsIHsiIiwgIiJ9fSwKKyAgICB7ImNwcF9lbnVtIiwgeyIiLCAiY2Fubm90IGdldCBudWxsYWJsZSBhbm5vdGF0aW9uIn19LAorICAgIHsiamF2YV9lbnVtIiwgeyIiLCAiY2Fubm90IGdldCBudWxsYWJsZSBhbm5vdGF0aW9uIn19LAorICAgIHsibmRrX2VudW0iLCB7IiIsICJjYW5ub3QgZ2V0IG51bGxhYmxlIGFubm90YXRpb24ifX0sCisgICAgeyJydXN0X2VudW0iLCB7IiIsICJjYW5ub3QgZ2V0IG51bGxhYmxlIGFubm90YXRpb24ifX0sCisgICAgeyJjcHBfdW5pb24iLCB7IiIsICIifX0sCisgICAgeyJqYXZhX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsibmRrX3VuaW9uIiwgeyIiLCAiIn19LAorICAgIHsicnVzdF91bmlvbiIsIHsiIiwgIiJ9fSwKK307CisKK2NsYXNzIEFpZGxUeXBlUGFyYW1UZXN0CisgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPE9wdGlvbnM6Okxhbmd1YWdlLCBUeXBlUGFyYW0sIGJvb2w+PiB7CiAgcHVibGljOgogICB2b2lkIFJ1bihjb25zdCBzdGQ6OnN0cmluZyYgZ2VuZXJpY190eXBlX2RlY2wsCi0gICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGV4cGVjdGF0aW9ucykgeworICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRXhwZWN0ZWRSZXN1bHQ+JiBleHBlY3RhdGlvbnMpIHsKICAgICBjb25zdCBhdXRvJiBwYXJhbSA9IEdldFBhcmFtKCk7CiAgICAgY29uc3QgYXV0byYgbGFuZyA9IHRvX3N0cmluZyhzdGQ6OmdldDwwPihwYXJhbSkpOwogICAgIGNvbnN0IGF1dG8mIGtpbmQgPSBzdGQ6OmdldDwxPihwYXJhbSkua2luZDsKKyAgICBjb25zdCBib29sIG51bGxhYmxlID0gc3RkOjpnZXQ8Mj4ocGFyYW0pOwogCiAgICAgRmFrZUlvRGVsZWdhdGUgaW87CiAgICAgaW8uU2V0RmlsZUNvbnRlbnRzKCJhL0lCYXIuYWlkbCIsICJwYWNrYWdlIGE7IGludGVyZmFjZSBJQmFyIHsgfSIpOwogICAgIGlvLlNldEZpbGVDb250ZW50cygiYS9FbnVtLmFpZGwiLCAicGFja2FnZSBhOyBlbnVtIEVudW0geyBBIH0iKTsKICAgICBpby5TZXRGaWxlQ29udGVudHMoImEvVW5pb24uYWlkbCIsICJwYWNrYWdlIGE7IHVuaW9uIFVuaW9uIHsgaW50IGE7IH0iKTsKKyAgICBpby5TZXRGaWxlQ29udGVudHMoImEvRm9vLmFpZGwiLCAicGFja2FnZSBhOyBwYXJjZWxhYmxlIEZvbyB7IGludCBhOyB9Iik7CiAgICAgc3RkOjpzdHJpbmcgZGVjbCA9IGZtdDo6Zm9ybWF0KGdlbmVyaWNfdHlwZV9kZWNsLCBzdGQ6OmdldDwxPihwYXJhbSkubGl0ZXJhbCk7Ci0gICAgaW8uU2V0RmlsZUNvbnRlbnRzKCJhL0Zvby5haWRsIiwgInBhY2thZ2UgYTsgcGFyY2VsYWJsZSBGb28geyAiICsgZGVjbCArICIgZjsgfSIpOworICAgIGlmIChudWxsYWJsZSkgeworICAgICAgZGVjbCA9ICJAbnVsbGFibGUgIiArIGRlY2w7CisgICAgfQorICAgIGlvLlNldEZpbGVDb250ZW50cygiYS9UYXJnZXQuYWlkbCIsICJwYWNrYWdlIGE7IHBhcmNlbGFibGUgVGFyZ2V0IHsgIiArIGRlY2wgKyAiIGY7IH0iKTsKIAotICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9Ci0gICAgICAgIE9wdGlvbnM6OkZyb20oZm10Ojpmb3JtYXQoImFpZGwgLUkgLiAtLWxhbmc9e30gYS9Gb28uYWlkbCAtbyBvdXQgLWggb3V0IiwgbGFuZykpOworICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9IE9wdGlvbnM6OkZyb20oZm10Ojpmb3JtYXQoCisgICAgICAgICJhaWRsIC1JIC4gLS1taW5fc2RrX3ZlcnNpb24gY3VycmVudCAtLWxhbmc9e30gYS9UYXJnZXQuYWlkbCAtbyBvdXQgLWggb3V0IiwgbGFuZykpOwogICAgIENhcHR1cmVTdGRlcnIoKTsKICAgICBjb21waWxlX2FpZGwob3B0aW9ucywgaW8pOwogICAgIGF1dG8gaXQgPSBleHBlY3RhdGlvbnMuZmluZChsYW5nICsgIl8iICsga2luZCk7Ci0gICAgRVhQRUNUX1RSVUUoaXQgIT0gZXhwZWN0YXRpb25zLmVuZCgpKTsKKyAgICBBU1NFUlRfVFJVRShpdCAhPSBleHBlY3RhdGlvbnMuZW5kKCkpIDw8ICJtaXNzaW5nIGV4cGVjdGF0aW9uIGZvciAiIDw8IGxhbmcgPDwgIl8iIDw8IGtpbmQ7CiAgICAgY29uc3Qgc3RyaW5nIGVyciA9IEdldENhcHR1cmVkU3RkZXJyKCk7Ci0gICAgaWYgKGl0LT5zZWNvbmQuZW1wdHkoKSkgeworICAgIGNvbnN0IHN0cmluZyBleHBlY3RlZF9lcnJvciA9CisgICAgICAgIG51bGxhYmxlID8gaXQtPnNlY29uZC5leHBlY3RlZF9lcnJvcl9mb3JfbnVsbGFibGUgOiBpdC0+c2Vjb25kLmV4cGVjdGVkX2Vycm9yOworICAgIGlmIChleHBlY3RlZF9lcnJvci5lbXB0eSgpKSB7CiAgICAgICBFWFBFQ1RfRVEoIiIsIGVycik7CiAgICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9USEFUKGVyciwgdGVzdGluZzo6SGFzU3Vic3RyKGl0LT5zZWNvbmQpKTsKKyAgICAgIEVYUEVDVF9USEFUKGVyciwgdGVzdGluZzo6SGFzU3Vic3RyKGV4cGVjdGVkX2Vycm9yKSk7CiAgICAgfQogICB9CiB9OwpAQCAtNDAzMCw5ICs1NDQ0LDEzIEBACiAgICAgQWlkbFRlc3RTdWl0ZSwgQWlkbFR5cGVQYXJhbVRlc3QsCiAgICAgdGVzdGluZzo6Q29tYmluZSh0ZXN0aW5nOjpWYWx1ZXMoT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUCwgT3B0aW9uczo6TGFuZ3VhZ2U6OkpBVkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uczo6TGFuZ3VhZ2U6Ok5ESywgT3B0aW9uczo6TGFuZ3VhZ2U6OlJVU1QpLAotICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzSW4oa1R5cGVQYXJhbXMpKSwKLSAgICBbXShjb25zdCB0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHN0ZDo6dHVwbGU8T3B0aW9uczo6TGFuZ3VhZ2UsIFR5cGVQYXJhbT4+JiBpbmZvKSB7Ci0gICAgICByZXR1cm4gdG9fc3RyaW5nKHN0ZDo6Z2V0PDA+KGluZm8ucGFyYW0pKSArICJfIiArIHN0ZDo6Z2V0PDE+KGluZm8ucGFyYW0pLmtpbmQ7CisgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihrVHlwZVBhcmFtcyksIHRlc3Rpbmc6OlZhbHVlcyh0cnVlLCBmYWxzZSkpLAorICAgIFtdKGNvbnN0IHRlc3Rpbmc6OlRlc3RQYXJhbUluZm88c3RkOjp0dXBsZTxPcHRpb25zOjpMYW5ndWFnZSwgVHlwZVBhcmFtLCBib29sPj4mIGluZm8pIHsKKyAgICAgIHN0cmluZyBuYW1lID0gdG9fc3RyaW5nKHN0ZDo6Z2V0PDA+KGluZm8ucGFyYW0pKSArICJfIiArIHN0ZDo6Z2V0PDE+KGluZm8ucGFyYW0pLmtpbmQ7CisgICAgICBpZiAoc3RkOjpnZXQ8Mj4oaW5mby5wYXJhbSkpIHsKKyAgICAgICAgbmFtZSArPSAiX251bGxhYmxlIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuYW1lOwogICAgIH0pOwogCiBURVNUX1AoQWlkbFR5cGVQYXJhbVRlc3QsIExpc3RTdXBwb3J0ZWRUeXBlcykgewpAQCAtNDA0Myw1ICs1NDYxLDkgQEAKICAgUnVuKCJ7fVtdIiwga0FycmF5U3VwcG9ydEV4cGVjdGF0aW9ucyk7CiB9CiAKK1RFU1RfUChBaWRsVHlwZVBhcmFtVGVzdCwgUGFyY2VsYWJsZUZpZWxkVHlwZXMpIHsKKyAgUnVuKCJ7fSIsIGtGaWVsZFN1cHBvcnRFeHBlY3RhdGlvbnMpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FzdF9jcHAuY3BwIGIvYXN0X2NwcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWYyNGMuLjAwMDAwMDAKLS0tIGEvYXN0X2NwcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhc3RfY3BwLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotCi0jaW5jbHVkZSAiY29kZV93cml0ZXIuaCIKLSNpbmNsdWRlICJsb2dnaW5nLmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjp1bmlxdWVfcHRyOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBjcHAgewotCi1zdGQ6OnN0cmluZyBBc3ROb2RlOjpUb1N0cmluZygpIHsKLSAgc3RkOjpzdHJpbmcgc3RyOwotICBXcml0ZShDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJnN0cikuZ2V0KCkpOwotICByZXR1cm4gc3RyOwotfQotCi1MaXRlcmFsRGVjbDo6TGl0ZXJhbERlY2woY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24pIDogZXhwcmVzc2lvbl8oZXhwcmVzc2lvbikge30KLQotdm9pZCBMaXRlcmFsRGVjbDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCIlcyIsIGV4cHJlc3Npb25fLmNfc3RyKCkpOwotfQotCi1DbGFzc0RlY2w6OkNsYXNzRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdGVtcGxhdGVfcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlcykKLSAgICA6IG5hbWVfKG5hbWUpLCBwYXJlbnRfKHBhcmVudCksIGF0dHJpYnV0ZXNfKGF0dHJpYnV0ZXMpLCB0ZW1wbGF0ZV9wYXJhbXNfKHRlbXBsYXRlX3BhcmFtcykge30KLQotQ2xhc3NEZWNsOjpDbGFzc0RlY2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRlbXBsYXRlX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwdWJsaWNfbWVtYmVycywKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwcml2YXRlX21lbWJlcnMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlcykKLSAgICA6IG5hbWVfKG5hbWUpLAotICAgICAgcGFyZW50XyhwYXJlbnQpLAotICAgICAgYXR0cmlidXRlc18oYXR0cmlidXRlcyksCi0gICAgICB0ZW1wbGF0ZV9wYXJhbXNfKHRlbXBsYXRlX3BhcmFtcyksCi0gICAgICBwdWJsaWNfbWVtYmVyc18oc3RkOjptb3ZlKHB1YmxpY19tZW1iZXJzKSksCi0gICAgICBwcml2YXRlX21lbWJlcnNfKHN0ZDo6bW92ZShwcml2YXRlX21lbWJlcnMpKSB7fQotCi12b2lkIENsYXNzRGVjbDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgaWYgKCF0ZW1wbGF0ZV9wYXJhbXNfLmVtcHR5KCkpCi0gICAgdG8tPldyaXRlKCJ0ZW1wbGF0ZSA8dHlwZW5hbWUgJXM+XG4iLCBiYXNlOjpKb2luKHRlbXBsYXRlX3BhcmFtc18sICIsIHR5cGVuYW1lICIpLmNfc3RyKCkpOwotCi0gIHRvLT5Xcml0ZSgiY2xhc3MiKTsKLSAgaWYgKCFhdHRyaWJ1dGVzXy5lbXB0eSgpKSB7Ci0gICAgdG8tPldyaXRlKCIgJXMiLCBhdHRyaWJ1dGVzXy5jX3N0cigpKTsKLSAgfQotICB0by0+V3JpdGUoIiAlcyAiLCBuYW1lXy5jX3N0cigpKTsKLQotICBpZiAocGFyZW50Xy5sZW5ndGgoKSA+IDApIHRvLT5Xcml0ZSgiOiBwdWJsaWMgJXMgIiwgcGFyZW50Xy5jX3N0cigpKTsKLQotICB0by0+V3JpdGUoIntcbiIpOwotCi0gIGlmICghcHVibGljX21lbWJlcnNfLmVtcHR5KCkpIHRvLT5Xcml0ZSgicHVibGljOlxuIik7Ci0KLSAgdG8tPkluZGVudCgpOwotICBmb3IgKGNvbnN0IGF1dG8mIGRlYyA6IHB1YmxpY19tZW1iZXJzXykKLSAgICBkZWMtPldyaXRlKHRvKTsKLSAgdG8tPkRlZGVudCgpOwotCi0gIGlmICghcHJpdmF0ZV9tZW1iZXJzXy5lbXB0eSgpKSB0by0+V3JpdGUoInByaXZhdGU6XG4iKTsKLQotICB0by0+SW5kZW50KCk7Ci0gIGZvciAoY29uc3QgYXV0byYgZGVjIDogcHJpdmF0ZV9tZW1iZXJzXykKLSAgICBkZWMtPldyaXRlKHRvKTsKLSAgdG8tPkRlZGVudCgpOwotCi0gIHRvLT5Xcml0ZSgifTsgIC8vIGNsYXNzICVzXG4iLCBuYW1lXy5jX3N0cigpKTsKLX0KLQotdm9pZCBDbGFzc0RlY2w6OkFkZFB1YmxpYyhzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IG1lbWJlcikgewotICBwdWJsaWNfbWVtYmVyc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShtZW1iZXIpKTsKLX0KLQotdm9pZCBDbGFzc0RlY2w6OkFkZFByaXZhdGUoc3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBtZW1iZXIpIHsKLSAgcHJpdmF0ZV9tZW1iZXJzXy5wdXNoX2JhY2soc3RkOjptb3ZlKG1lbWJlcikpOwotfQotCi1FbnVtOjpFbnVtRmllbGQ6OkVudW1GaWVsZChjb25zdCBzdHJpbmcmIGssIGNvbnN0IHN0cmluZyYgdiwgY29uc3Qgc3RyaW5nJiBhKQotICAgIDoga2V5KGspLCB2YWx1ZSh2KSwgYXR0cmlidXRlKGEpIHt9Ci0KLUVudW06OkVudW0oY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBzdHJpbmcmIGJhc2VfdHlwZSwgYm9vbCBpc19jbGFzcywKLSAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMpCi0gICAgOiBlbnVtX25hbWVfKG5hbWUpLCB1bmRlcmx5aW5nX3R5cGVfKGJhc2VfdHlwZSksIGF0dHJpYnV0ZXNfKGF0dHJpYnV0ZXMpLCBpc19jbGFzc18oaXNfY2xhc3MpIHt9Ci0KLXZvaWQgRW51bTo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCJlbnVtICIpOwotICBpZiAoaXNfY2xhc3NfKSB7Ci0gICAgdG8tPldyaXRlKCJjbGFzcyAiKTsKLSAgfQotICBpZiAoIWF0dHJpYnV0ZXNfLmVtcHR5KCkpIHsKLSAgICB0by0+V3JpdGUoIiVzICIsIGF0dHJpYnV0ZXNfLmNfc3RyKCkpOwotICB9Ci0gIGlmICh1bmRlcmx5aW5nX3R5cGVfLmVtcHR5KCkpIHsKLSAgICB0by0+V3JpdGUoIiVzIHtcbiIsIGVudW1fbmFtZV8uY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdG8tPldyaXRlKCIlcyA6ICVzIHtcbiIsIGVudW1fbmFtZV8uY19zdHIoKSwgdW5kZXJseWluZ190eXBlXy5jX3N0cigpKTsKLSAgfQotICB0by0+SW5kZW50KCk7Ci0gIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZHNfKSB7Ci0gICAgdG8tPldyaXRlKCIlcyIsIGZpZWxkLmtleS5jX3N0cigpKTsKLSAgICBpZiAoIWZpZWxkLmF0dHJpYnV0ZS5lbXB0eSgpKSB7Ci0gICAgICB0by0+V3JpdGUoIiAlcyIsIGZpZWxkLmF0dHJpYnV0ZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgaWYgKCFmaWVsZC52YWx1ZS5lbXB0eSgpKSB7Ci0gICAgICB0by0+V3JpdGUoIiA9ICVzIiwgZmllbGQudmFsdWUuY19zdHIoKSk7Ci0gICAgfQotICAgIHRvLT5Xcml0ZSgiLFxuIik7Ci0gIH0KLSAgdG8tPkRlZGVudCgpOwotICB0by0+V3JpdGUoIn07XG4iKTsKLX0KLQotdm9pZCBFbnVtOjpBZGRWYWx1ZShjb25zdCBzdHJpbmcmIGtleSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBhdHRyaWJ1dGUpIHsKLSAgZmllbGRzXy5lbXBsYWNlX2JhY2soa2V5LCB2YWx1ZSwgYXR0cmlidXRlKTsKLX0KLQotQXJnTGlzdDo6QXJnTGlzdChjb25zdCBzdGQ6OnN0cmluZyYgc2luZ2xlX2FyZ3VtZW50KQotICAgIDogQXJnTGlzdCh2ZWN0b3I8c3RyaW5nPntzaW5nbGVfYXJndW1lbnR9KSB7fQotCi1BcmdMaXN0OjpBcmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJnX2xpc3QpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBzIDogYXJnX2xpc3QpIHsKLSAgICBhcmd1bWVudHNfLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbEV4cHJlc3Npb24ocykpOwotICB9Ci19Ci0KLUFyZ0xpc3Q6OkFyZ0xpc3Qoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+PiBhcmdfbGlzdCkKLSAgICA6IGFyZ3VtZW50c18oc3RkOjptb3ZlKGFyZ19saXN0KSkge30KLQotQXJnTGlzdDo6QXJnTGlzdChBcmdMaXN0JiYgYXJnX2xpc3QpIG5vZXhjZXB0IDogYXJndW1lbnRzXyhzdGQ6Om1vdmUoYXJnX2xpc3QuYXJndW1lbnRzXykpIHt9Ci0KLXZvaWQgQXJnTGlzdDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCIoIik7Ci0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBmb3IgKGNvbnN0IGF1dG8mIHMgOiBhcmd1bWVudHNfKSB7Ci0gICAgaWYgKCFpc19maXJzdCkgeyB0by0+V3JpdGUoIiwgIik7IH0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHMtPldyaXRlKHRvKTsKLSAgfQotICB0by0+V3JpdGUoIikiKTsKLX0KLQotQ29uc3RydWN0b3JEZWNsOjpDb25zdHJ1Y3RvckRlY2woCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgQXJnTGlzdCYmIGFyZ19saXN0KQotICAgIDogQ29uc3RydWN0b3JEZWNsKG5hbWUsIHN0ZDo6bW92ZShhcmdfbGlzdCksIDB1KSB7fQotCi1Db25zdHJ1Y3RvckRlY2w6OkNvbnN0cnVjdG9yRGVjbCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICBBcmdMaXN0JiYgYXJnX2xpc3QsCi0gICAgdWludDMyX3QgbW9kaWZpZXJzKQotICAgIDogbmFtZV8obmFtZSksCi0gICAgICBhcmd1bWVudHNfKHN0ZDo6bW92ZShhcmdfbGlzdCkpLAotICAgICAgbW9kaWZpZXJzXyhtb2RpZmllcnMpIHt9Ci0KLXZvaWQgQ29uc3RydWN0b3JEZWNsOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICBpZiAobW9kaWZpZXJzXyAmIE1vZGlmaWVyczo6SVNfVklSVFVBTCkKLSAgICB0by0+V3JpdGUoInZpcnR1YWwgIik7Ci0KLSAgaWYgKG1vZGlmaWVyc18gJiBNb2RpZmllcnM6OklTX0VYUExJQ0lUKQotICAgIHRvLT5Xcml0ZSgiZXhwbGljaXQgIik7Ci0KLSAgdG8tPldyaXRlKCIlcyIsIG5hbWVfLmNfc3RyKCkpOwotCi0gIGFyZ3VtZW50c18uV3JpdGUodG8pOwotCi0gIGlmIChtb2RpZmllcnNfICYgTW9kaWZpZXJzOjpJU19ERUZBVUxUKQotICAgIHRvLT5Xcml0ZSgiID0gZGVmYXVsdCIpOwotCi0gIHRvLT5Xcml0ZSgiO1xuIik7Ci19Ci0KLU1hY3JvRGVjbDo6TWFjcm9EZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBBcmdMaXN0JiYgYXJnX2xpc3QpCi0gICAgOiBuYW1lXyhuYW1lKSwKLSAgICAgIGFyZ3VtZW50c18oc3RkOjptb3ZlKGFyZ19saXN0KSkge30KLQotdm9pZCBNYWNyb0RlY2w6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiJXMiLCBuYW1lXy5jX3N0cigpKTsKLSAgYXJndW1lbnRzXy5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiXG4iKTsKLX0KLQotTWV0aG9kRGVjbDo6TWV0aG9kRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBBcmdMaXN0JiYgYXJnX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzKQotICAgIDogTWV0aG9kRGVjbChyZXR1cm5fdHlwZSwgbmFtZSwgc3RkOjptb3ZlKGFyZ19saXN0KSwgMHUsIGF0dHJpYnV0ZXMpIHt9Ci0KLU1ldGhvZERlY2w6Ok1ldGhvZERlY2woY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybl90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgQXJnTGlzdCYmIGFyZ19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb2RpZmllcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzKQotICAgIDogcmV0dXJuX3R5cGVfKHJldHVybl90eXBlKSwKLSAgICAgIG5hbWVfKG5hbWUpLAotICAgICAgYXR0cmlidXRlc18oYXR0cmlidXRlcyksCi0gICAgICBhcmd1bWVudHNfKHN0ZDo6bW92ZShhcmdfbGlzdCkpLAotICAgICAgaXNfY29uc3RfKG1vZGlmaWVycyAmIElTX0NPTlNUKSwKLSAgICAgIGlzX3ZpcnR1YWxfKG1vZGlmaWVycyAmIElTX1ZJUlRVQUwpLAotICAgICAgaXNfb3ZlcnJpZGVfKG1vZGlmaWVycyAmIElTX09WRVJSSURFKSwKLSAgICAgIGlzX3B1cmVfdmlydHVhbF8obW9kaWZpZXJzICYgSVNfUFVSRV9WSVJUVUFMKSwKLSAgICAgIGlzX3N0YXRpY18obW9kaWZpZXJzICYgSVNfU1RBVElDKSwKLSAgICAgIGlzX2ZpbmFsXyhtb2RpZmllcnMgJiBJU19GSU5BTCkge30KLQotdm9pZCBNZXRob2REZWNsOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICBpZiAoaXNfdmlydHVhbF8pCi0gICAgdG8tPldyaXRlKCJ2aXJ0dWFsICIpOwotCi0gIGlmIChpc19zdGF0aWNfKQotICAgIHRvLT5Xcml0ZSgic3RhdGljICIpOwotCi0gIHRvLT5Xcml0ZSgiJXMgJXMiLCByZXR1cm5fdHlwZV8uY19zdHIoKSwgbmFtZV8uY19zdHIoKSk7Ci0KLSAgYXJndW1lbnRzXy5Xcml0ZSh0byk7Ci0KLSAgaWYgKGlzX2NvbnN0XykKLSAgICB0by0+V3JpdGUoIiBjb25zdCIpOwotCi0gIGlmIChpc19vdmVycmlkZV8pCi0gICAgdG8tPldyaXRlKCIgb3ZlcnJpZGUiKTsKLQotICBpZiAoaXNfZmluYWxfKSB0by0+V3JpdGUoIiBmaW5hbCIpOwotCi0gIGlmICghYXR0cmlidXRlc18uZW1wdHkoKSkgdG8tPldyaXRlKCIgJXMiLCBhdHRyaWJ1dGVzXy5jX3N0cigpKTsKLQotICBpZiAoaXNfcHVyZV92aXJ0dWFsXykKLSAgICB0by0+V3JpdGUoIiA9IDAiKTsKLQotICB0by0+V3JpdGUoIjtcbiIpOwotfQotCi12b2lkIFN0YXRlbWVudEJsb2NrOjpBZGRTdGF0ZW1lbnQodW5pcXVlX3B0cjxBc3ROb2RlPiBzdGF0ZW1lbnQpIHsKLSAgc3RhdGVtZW50c18ucHVzaF9iYWNrKHN0ZDo6bW92ZShzdGF0ZW1lbnQpKTsKLX0KLQotdm9pZCBTdGF0ZW1lbnRCbG9jazo6QWRkU3RhdGVtZW50KEFzdE5vZGUqIHN0YXRlbWVudCkgewotICBzdGF0ZW1lbnRzXy5lbXBsYWNlX2JhY2soc3RhdGVtZW50KTsKLX0KLQotdm9pZCBTdGF0ZW1lbnRCbG9jazo6QWRkTGl0ZXJhbChjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbl9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkX3NlbWljb2xvbikgewotICBpZiAoYWRkX3NlbWljb2xvbikgewotICAgIHN0YXRlbWVudHNfLnB1c2hfYmFjayh1bmlxdWVfcHRyPEFzdE5vZGU+KG5ldyBTdGF0ZW1lbnQoZXhwcmVzc2lvbl9zdHIpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdGVtZW50c18ucHVzaF9iYWNrKHVuaXF1ZV9wdHI8QXN0Tm9kZT4oCi0gICAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uX3N0cikpKTsKLSAgfQotfQotCi12b2lkIFN0YXRlbWVudEJsb2NrOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIntcbiIpOwotICB0by0+SW5kZW50KCk7Ci0gIGZvciAoY29uc3QgYXV0byYgc3RhdGVtZW50IDogc3RhdGVtZW50c18pIHsKLSAgICBzdGF0ZW1lbnQtPldyaXRlKHRvKTsKLSAgfQotICB0by0+RGVkZW50KCk7Ci0gIHRvLT5Xcml0ZSgifVxuIik7Ci19Ci0KLUNvbnN0cnVjdG9ySW1wbDo6Q29uc3RydWN0b3JJbXBsKGNvbnN0IHN0cmluZyYgY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ0xpc3QmJiBhcmdfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBpbml0aWFsaXplcl9saXN0KQotICAgICAgOiBjbGFzc19uYW1lXyhjbGFzc19uYW1lKSwKLSAgICAgICAgYXJndW1lbnRzXyhzdGQ6Om1vdmUoYXJnX2xpc3QpKSwKLSAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdF8oaW5pdGlhbGl6ZXJfbGlzdCkge30KLQotU3RhdGVtZW50QmxvY2sqIENvbnN0cnVjdG9ySW1wbDo6R2V0U3RhdGVtZW50QmxvY2soKSB7Ci0gIHJldHVybiAmYm9keV87Ci19Ci0KLXZvaWQgQ29uc3RydWN0b3JJbXBsOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIiVzOjolcyIsIGNsYXNzX25hbWVfLmNfc3RyKCksIGNsYXNzX25hbWVfLmNfc3RyKCkpOwotICBhcmd1bWVudHNfLldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCJcbiIpOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBmb3IgKGNvbnN0IHN0cmluZyYgaSA6IGluaXRpYWxpemVyX2xpc3RfKSB7Ci0gICAgaWYgKGlzX2ZpcnN0KSB7Ci0gICAgICB0by0+V3JpdGUoIiAgICA6ICVzIiwgaS5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgdG8tPldyaXRlKCIsXG4gICAgICAlcyIsIGkuY19zdHIoKSk7Ci0gICAgfQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gIH0KLQotICBib2R5Xy5Xcml0ZSh0byk7Ci19Ci0KLU1ldGhvZEltcGw6Ok1ldGhvZEltcGwoY29uc3Qgc3RyaW5nJiByZXR1cm5fdHlwZSwgY29uc3Qgc3RyaW5nJiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1ldGhvZF9uYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRlbXBsYXRlX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0LCBib29sIGlzX2NvbnN0X21ldGhvZCkKLSAgICA6IHJldHVybl90eXBlXyhyZXR1cm5fdHlwZSksCi0gICAgICBtZXRob2RfbmFtZV8obWV0aG9kX25hbWUpLAotICAgICAgYXJndW1lbnRzXyhzdGQ6Om1vdmUoYXJnX2xpc3QpKSwKLSAgICAgIGlzX2NvbnN0X21ldGhvZF8oaXNfY29uc3RfbWV0aG9kKSwKLSAgICAgIHRlbXBsYXRlX3BhcmFtc18odGVtcGxhdGVfcGFyYW1zKSB7Ci0gIGlmICghY2xhc3NfbmFtZS5lbXB0eSgpKSB7Ci0gICAgaWYgKCF0ZW1wbGF0ZV9wYXJhbXMuZW1wdHkoKSkgewotICAgICAgbWV0aG9kX25hbWVfID0gY2xhc3NfbmFtZSArICI8IiArIGJhc2U6OkpvaW4odGVtcGxhdGVfcGFyYW1zLCAiLCIpICsgIj46OiIgKyBtZXRob2RfbmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgbWV0aG9kX25hbWVfID0gY2xhc3NfbmFtZSArICI6OiIgKyBtZXRob2RfbmFtZTsKLSAgICB9Ci0gIH0KLX0KLQotU3RhdGVtZW50QmxvY2sqIE1ldGhvZEltcGw6OkdldFN0YXRlbWVudEJsb2NrKCkgewotICByZXR1cm4gJnN0YXRlbWVudHNfOwotfQotCi12b2lkIE1ldGhvZEltcGw6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIGlmICghdGVtcGxhdGVfcGFyYW1zXy5lbXB0eSgpKQotICAgIHRvLT5Xcml0ZSgidGVtcGxhdGUgPHR5cGVuYW1lICVzPlxuIiwgYmFzZTo6Sm9pbih0ZW1wbGF0ZV9wYXJhbXNfLCAiLCB0eXBlbmFtZSAiKS5jX3N0cigpKTsKLSAgdG8tPldyaXRlKCIlcyAlcyIsIHJldHVybl90eXBlXy5jX3N0cigpLCBtZXRob2RfbmFtZV8uY19zdHIoKSk7Ci0gIGFyZ3VtZW50c18uV3JpdGUodG8pOwotICB0by0+V3JpdGUoIiVzICIsIChpc19jb25zdF9tZXRob2RfKSA/ICIgY29uc3QiIDogIiIpOwotICBzdGF0ZW1lbnRzXy5Xcml0ZSh0byk7Ci19Ci0KLVN3aXRjaFN0YXRlbWVudDo6U3dpdGNoU3RhdGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBleHByZXNzaW9uKQotICAgIDogc3dpdGNoX2V4cHJlc3Npb25fKGV4cHJlc3Npb24pIHt9Ci0KLVN0YXRlbWVudEJsb2NrKiBTd2l0Y2hTdGF0ZW1lbnQ6OkFkZENhc2UoY29uc3Qgc3RyaW5nJiB2YWx1ZV9leHByZXNzaW9uKSB7Ci0gIGF1dG8gaXQgPSBzdGQ6OmZpbmQoY2FzZV92YWx1ZXNfLmJlZ2luKCksIGNhc2VfdmFsdWVzXy5lbmQoKSwgdmFsdWVfZXhwcmVzc2lvbik7Ci0gIGlmIChpdCAhPSBjYXNlX3ZhbHVlc18uZW5kKCkpIHsKLSAgICBBSURMX0VSUk9SKHZhbHVlX2V4cHJlc3Npb24pIDw8ICJEdXBsaWNhdGUgc3dpdGNoIGNhc2UgbGFiZWxzIjsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBTdGF0ZW1lbnRCbG9jayogcmV0ID0gbmV3IFN0YXRlbWVudEJsb2NrKCk7Ci0gIGNhc2VfdmFsdWVzXy5wdXNoX2JhY2sodmFsdWVfZXhwcmVzc2lvbik7Ci0gIGNhc2VfbG9naWNfLnB1c2hfYmFjayh1bmlxdWVfcHRyPFN0YXRlbWVudEJsb2NrPntyZXR9KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBTd2l0Y2hTdGF0ZW1lbnQ6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgic3dpdGNoICglcykge1xuIiwgc3dpdGNoX2V4cHJlc3Npb25fLmNfc3RyKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhc2VfdmFsdWVzXy5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IHN0cmluZyYgY2FzZV92YWx1ZSA9IGNhc2VfdmFsdWVzX1tpXTsKLSAgICBjb25zdCB1bmlxdWVfcHRyPFN0YXRlbWVudEJsb2NrPiYgc3RhdGVtZW50cyA9IGNhc2VfbG9naWNfW2ldOwotICAgIGlmIChjYXNlX3ZhbHVlLmVtcHR5KCkpIHsKLSAgICAgIHRvLT5Xcml0ZSgiZGVmYXVsdDpcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0by0+V3JpdGUoImNhc2UgJXM6XG4iLCBjYXNlX3ZhbHVlLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdGF0ZW1lbnRzLT5Xcml0ZSh0byk7Ci0gICAgdG8tPldyaXRlKCJicmVhaztcbiIpOwotICB9Ci0gIHRvLT5Xcml0ZSgifVxuIik7Ci19Ci0KLQotQXNzaWdubWVudDo6QXNzaWdubWVudChjb25zdCBzdGQ6OnN0cmluZyYgbGVmdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJpZ2h0KQotICAgIDogQXNzaWdubWVudChsZWZ0LCBuZXcgTGl0ZXJhbEV4cHJlc3Npb257cmlnaHR9KSB7fQotCi1Bc3NpZ25tZW50OjpBc3NpZ25tZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWZ0LCBBc3ROb2RlKiByaWdodCkKLSAgICA6IGxoc18obGVmdCksCi0gICAgICByaHNfKHJpZ2h0KSB7fQotCi12b2lkIEFzc2lnbm1lbnQ6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIHRvLT5Xcml0ZSgiJXMgPSAiLCBsaHNfLmNfc3RyKCkpOwotICByaHNfLT5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiO1xuIik7Ci19Ci0KLU1ldGhvZENhbGw6Ok1ldGhvZENhbGwoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2luZ2xlX2FyZ3VtZW50KQotICAgIDogTWV0aG9kQ2FsbChtZXRob2RfbmFtZSwgQXJnTGlzdHtzaW5nbGVfYXJndW1lbnR9KSB7fQotCi1NZXRob2RDYWxsOjpNZXRob2RDYWxsKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0KQotICAgIDogbWV0aG9kX25hbWVfKG1ldGhvZF9uYW1lKSwKLSAgICAgIGFyZ3VtZW50c197c3RkOjptb3ZlKGFyZ19saXN0KX0ge30KLQotdm9pZCBNZXRob2RDYWxsOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIiVzIiwgbWV0aG9kX25hbWVfLmNfc3RyKCkpOwotICBhcmd1bWVudHNfLldyaXRlKHRvKTsKLX0KLQotSWZTdGF0ZW1lbnQ6OklmU3RhdGVtZW50KEFzdE5vZGUqIGV4cHJlc3Npb24sIGJvb2wgaW52ZXJ0X2V4cHJlc3Npb24pCi0gICAgOiBleHByZXNzaW9uXyhleHByZXNzaW9uKSwKLSAgICAgIGludmVydF9leHByZXNzaW9uXyhpbnZlcnRfZXhwcmVzc2lvbikge30KLQotdm9pZCBJZlN0YXRlbWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgdG8tPldyaXRlKCJpZiAoJXMiLCAoaW52ZXJ0X2V4cHJlc3Npb25fKSA/ICIhKCIgOiAiIik7Ci0gIGV4cHJlc3Npb25fLT5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiKSVzICIsIChpbnZlcnRfZXhwcmVzc2lvbl8pID8gIikiIDogIiIpOwotICBvbl90cnVlXy5Xcml0ZSh0byk7Ci0KLSAgaWYgKCFvbl9mYWxzZV8uRW1wdHkoKSkgewotICAgIHRvLT5Xcml0ZSgiZWxzZSAiKTsKLSAgICBvbl9mYWxzZV8uV3JpdGUodG8pOwotICB9Ci19Ci0KLVN0YXRlbWVudDo6U3RhdGVtZW50KHVuaXF1ZV9wdHI8QXN0Tm9kZT4gZXhwcmVzc2lvbikKLSAgICA6IGV4cHJlc3Npb25fKHN0ZDo6bW92ZShleHByZXNzaW9uKSkge30KLQotU3RhdGVtZW50OjpTdGF0ZW1lbnQoQXN0Tm9kZSogZXhwcmVzc2lvbikgOiBleHByZXNzaW9uXyhleHByZXNzaW9uKSB7fQotCi1TdGF0ZW1lbnQ6OlN0YXRlbWVudChjb25zdCBzdHJpbmcmIGV4cHJlc3Npb24pCi0gICAgOiBleHByZXNzaW9uXyhuZXcgTGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHt9Ci0KLXZvaWQgU3RhdGVtZW50OjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICBleHByZXNzaW9uXy0+V3JpdGUodG8pOwotICB0by0+V3JpdGUoIjtcbiIpOwotfQotCi1Db21wYXJpc29uOjpDb21wYXJpc29uKEFzdE5vZGUqIGxocywgY29uc3Qgc3RyaW5nJiBjb21wYXJpc29uLCBBc3ROb2RlKiByaHMpCi0gICAgOiBsZWZ0XyhsaHMpLAotICAgICAgcmlnaHRfKHJocyksCi0gICAgICBvcGVyYXRvcl8oY29tcGFyaXNvbikge30KLQotdm9pZCBDb21wYXJpc29uOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIigoIik7Ci0gIGxlZnRfLT5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiKSAlcyAoIiwgb3BlcmF0b3JfLmNfc3RyKCkpOwotICByaWdodF8tPldyaXRlKHRvKTsKLSAgdG8tPldyaXRlKCIpKSIpOwotfQotCi1MaXRlcmFsRXhwcmVzc2lvbjo6TGl0ZXJhbEV4cHJlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24pCi0gICAgOiBleHByZXNzaW9uXyhleHByZXNzaW9uKSB7fQotCi12b2lkIExpdGVyYWxFeHByZXNzaW9uOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIiVzIiwgZXhwcmVzc2lvbl8uY19zdHIoKSk7Ci19Ci0KLUNwcE5hbWVzcGFjZTo6Q3BwTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucykKLSAgICA6IGRlY2xhcmF0aW9uc18oc3RkOjptb3ZlKGRlY2xhcmF0aW9ucykpLAotICAgICAgbmFtZV8obmFtZSkge30KLQotQ3BwTmFtZXNwYWNlOjpDcHBOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbikKLSAgICA6IG5hbWVfKG5hbWUpIHsKLSAgZGVjbGFyYXRpb25zXy5wdXNoX2JhY2soc3RkOjptb3ZlKGRlY2xhcmF0aW9uKSk7Ci19Ci1DcHBOYW1lc3BhY2U6OkNwcE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKLSAgICA6IG5hbWVfKG5hbWUpIHt9Ci0KLXZvaWQgQ3BwTmFtZXNwYWNlOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIm5hbWVzcGFjZSAlcyB7XG5cbiIsIG5hbWVfLmNfc3RyKCkpOwotCi0gIGZvciAoY29uc3QgYXV0byYgZGVjIDogZGVjbGFyYXRpb25zXykgewotICAgIGRlYy0+V3JpdGUodG8pOwotICAgIHRvLT5Xcml0ZSgiXG4iKTsKLSAgfQotCi0gIHRvLT5Xcml0ZSgifSAgLy8gbmFtZXNwYWNlICVzXG4iLCBuYW1lXy5jX3N0cigpKTsKLX0KLQotRG9jdW1lbnQ6OkRvY3VtZW50KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5jbHVkZV9saXN0LAotICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsYXJhdGlvbnMpCi0gICAgOiBpbmNsdWRlX2xpc3RfKGluY2x1ZGVfbGlzdCksIGRlY2xhcmF0aW9uc18oc3RkOjptb3ZlKGRlY2xhcmF0aW9ucykpIHt9Ci0KLXZvaWQgRG9jdW1lbnQ6OldyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCB7Ci0gIGZvciAoY29uc3QgYXV0byYgaW5jbHVkZSA6IGluY2x1ZGVfbGlzdF8pIHsKLSAgICB0by0+V3JpdGUoIiNpbmNsdWRlIDwlcz5cbiIsIGluY2x1ZGUuY19zdHIoKSk7Ci0gIH0KLSAgdG8tPldyaXRlKCJcbiIpOwotCi0gIGZvciAoY29uc3QgYXV0byYgZGVjbGFyYXRpb24gOiBkZWNsYXJhdGlvbnNfKSB7Ci0gICAgZGVjbGFyYXRpb24tPldyaXRlKHRvKTsKLSAgfQotfQotCi1DcHBIZWFkZXI6OkNwcEhlYWRlcihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluY2x1ZGVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucykKLSAgICA6IERvY3VtZW50KGluY2x1ZGVfbGlzdCwgc3RkOjptb3ZlKGRlY2xhcmF0aW9ucykpIHt9Ci0KLXZvaWQgQ3BwSGVhZGVyOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIiNwcmFnbWEgb25jZVxuXG4iKTsKLQotICBEb2N1bWVudDo6V3JpdGUodG8pOwotfQotCi1DcHBTb3VyY2U6OkNwcFNvdXJjZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluY2x1ZGVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucykKLSAgICA6IERvY3VtZW50KGluY2x1ZGVfbGlzdCwgc3RkOjptb3ZlKGRlY2xhcmF0aW9ucykpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYXN0X2NwcC5oIGIvYXN0X2NwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUxMDVjLi4wMDAwMDAwCi0tLSBhL2FzdF9jcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotY2xhc3MgQ29kZVdyaXRlcjsKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgY3BwIHsKLQotY2xhc3MgQXN0Tm9kZSB7Ci0gcHVibGljOgotICBBc3ROb2RlKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5Bc3ROb2RlKCkgPSBkZWZhdWx0OwotCi0gIC8vIEFsbCBhc3Qgbm9kZXMgYXJlIG5vbi1jb3B5YWJsZSBhbmQgbm9uLW1vdmFibGUKLSAgQXN0Tm9kZShjb25zdCBBc3ROb2RlJikgPSBkZWxldGU7Ci0gIEFzdE5vZGUoQXN0Tm9kZSYmKSA9IGRlbGV0ZTsKLSAgQXN0Tm9kZSYgb3BlcmF0b3I9KGNvbnN0IEFzdE5vZGUmKSA9IGRlbGV0ZTsKLSAgQXN0Tm9kZSYgb3BlcmF0b3I9KEFzdE5vZGUmJikgPSBkZWxldGU7Ci0KLSAgdmlydHVhbCB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCA9IDA7Ci0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCk7Ci19OyAgLy8gY2xhc3MgQXN0Tm9kZQotCi1jbGFzcyBEZWNsYXJhdGlvbiA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIERlY2xhcmF0aW9uKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5EZWNsYXJhdGlvbigpID0gZGVmYXVsdDsKLX07ICAvLyBjbGFzcyBEZWNsYXJhdGlvbgotCi1jbGFzcyBMaXRlcmFsRGVjbCA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBMaXRlcmFsRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbik7Ci0gIH5MaXRlcmFsRGVjbCgpID0gZGVmYXVsdDsKLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjb25zdCBzdGQ6OnN0cmluZyBleHByZXNzaW9uXzsKLX07ICAvLyBjbGFzcyBMaXRlcmFsRGVjbAotCi1jbGFzcyBDbGFzc0RlY2wgOiBwdWJsaWMgRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgQ2xhc3NEZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyZW50LAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0ZW1wbGF0ZV9wYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzID0gIiIpOwotICBDbGFzc0RlY2woY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJlbnQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRlbXBsYXRlX3BhcmFtcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHB1YmxpY19tZW1iZXJzLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gcHJpdmF0ZV9tZW1iZXJzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZXMgPSAiIik7Ci0gIHZpcnR1YWwgfkNsYXNzRGVjbCgpID0gZGVmYXVsdDsKLQotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEFkZFB1YmxpYyhzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IG1lbWJlcik7Ci0gIHZvaWQgQWRkUHJpdmF0ZShzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IG1lbWJlcik7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgc3RkOjpzdHJpbmcgcGFyZW50XzsKLSAgc3RkOjpzdHJpbmcgYXR0cmlidXRlc187Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZW1wbGF0ZV9wYXJhbXNfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwdWJsaWNfbWVtYmVyc187Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHByaXZhdGVfbWVtYmVyc187Ci19OyAgLy8gY2xhc3MgQ2xhc3NEZWNsCi0KLWNsYXNzIEVudW0gOiBwdWJsaWMgRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgRW51bShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfdHlwZSwgYm9vbCBpc19jbGFzcywKLSAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlcyA9ICIiKTsKLSAgdmlydHVhbCB+RW51bSgpID0gZGVmYXVsdDsKLQotICBib29sIEhhc1ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuICFmaWVsZHNfLmVtcHR5KCk7IH0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBBZGRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZSA9ICIiKTsKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBFbnVtRmllbGQgewotICAgIEVudW1GaWVsZChjb25zdCBzdGQ6OnN0cmluZyYgaywgY29uc3Qgc3RkOjpzdHJpbmcmIHYsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXk7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgdmFsdWU7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgYXR0cmlidXRlOwotICB9OwotCi0gIHN0ZDo6c3RyaW5nIGVudW1fbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIHVuZGVybHlpbmdfdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIGF0dHJpYnV0ZXNfOwotICBib29sIGlzX2NsYXNzXzsKLSAgc3RkOjp2ZWN0b3I8RW51bUZpZWxkPiBmaWVsZHNfOwotfTsgIC8vIGNsYXNzIEVudW0KLQotY2xhc3MgQXJnTGlzdCA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIEFyZ0xpc3QoKSA9IGRlZmF1bHQ7Ci0gIGV4cGxpY2l0IEFyZ0xpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNpbmdsZV9hcmd1bWVudCk7Ci0gIGV4cGxpY2l0IEFyZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdfbGlzdCk7Ci0gIGV4cGxpY2l0IEFyZ0xpc3Qoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+PiBhcmdfbGlzdCk7Ci0gIEFyZ0xpc3QoQXJnTGlzdCYmIGFyZ19saXN0KSBub2V4Y2VwdDsKLSAgdmlydHVhbCB+QXJnTGlzdCgpID0gZGVmYXVsdDsKLQotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBc3ROb2RlPj4gYXJndW1lbnRzXzsKLX07ICAvLyBjbGFzcyBBcmdMaXN0Ci0KLWNsYXNzIENvbnN0cnVjdG9yRGVjbCA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBlbnVtIE1vZGlmaWVycyB7Ci0gICAgSVNfVklSVFVBTCA9IDEgPDwgMCwKLSAgICBJU19ERUZBVUxUID0gMSA8PCAxLAotICAgIElTX0VYUExJQ0lUID0gMSA8PCAyLAotICB9OwotCi0gIENvbnN0cnVjdG9yRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgIEFyZ0xpc3QmJiBhcmdfbGlzdCk7Ci0gIENvbnN0cnVjdG9yRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgIEFyZ0xpc3QmJiBhcmdfbGlzdCwKLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGlmaWVycyk7Ci0KLSAgdmlydHVhbCB+Q29uc3RydWN0b3JEZWNsKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGNvbnN0IEFyZ0xpc3QgYXJndW1lbnRzXzsKLSAgY29uc3QgdWludDMyX3QgbW9kaWZpZXJzXzsKLX07ICAvLyBjbGFzcyBDb25zdHJ1Y3RvckRlY2wKLQotY2xhc3MgTWFjcm9EZWNsIDogcHVibGljIERlY2xhcmF0aW9uIHsKLSBwdWJsaWM6Ci0gIE1hY3JvRGVjbChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgQXJnTGlzdCYmIGFyZ19saXN0KTsKLSAgdmlydHVhbCB+TWFjcm9EZWNsKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGNvbnN0IEFyZ0xpc3QgYXJndW1lbnRzXzsKLX07ICAvLyBjbGFzcyBNYWNyb0RlY2wKLQotY2xhc3MgTWV0aG9kRGVjbCA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBlbnVtIE1vZGlmaWVycyB7Ci0gICAgSVNfQ09OU1QgPSAxIDw8IDAsCi0gICAgSVNfVklSVFVBTCA9IDEgPDwgMSwKLSAgICBJU19PVkVSUklERSA9IDEgPDwgMiwKLSAgICBJU19QVVJFX1ZJUlRVQUwgPSAxIDw8IDMsCi0gICAgSVNfU1RBVElDID0gMSA8PCA0LAotICAgIElTX0ZJTkFMID0gMSA8PCA1LAotICB9OwotCi0gIE1ldGhvZERlY2woY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybl90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgQXJnTGlzdCYmIGFyZ19saXN0LAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzID0gIiIpOwotICBNZXRob2REZWNsKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm5fdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIEFyZ0xpc3QmJiBhcmdfbGlzdCwKLSAgICAgICAgICAgICB1aW50MzJfdCBtb2RpZmllcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVzID0gIiIpOwotICB2aXJ0dWFsIH5NZXRob2REZWNsKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgcmV0dXJuX3R5cGVfOwotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXR0cmlidXRlc187Ci0gIGNvbnN0IEFyZ0xpc3QgYXJndW1lbnRzXzsKLSAgYm9vbCBpc19jb25zdF8gPSBmYWxzZTsKLSAgYm9vbCBpc192aXJ0dWFsXyA9IGZhbHNlOwotICBib29sIGlzX292ZXJyaWRlXyA9IGZhbHNlOwotICBib29sIGlzX3B1cmVfdmlydHVhbF8gPSBmYWxzZTsKLSAgYm9vbCBpc19zdGF0aWNfID0gdHJ1ZTsKLSAgYm9vbCBpc19maW5hbF8gPSBmYWxzZTsKLX07ICAvLyBjbGFzcyBNZXRob2REZWNsCi0KLWNsYXNzIFN0YXRlbWVudEJsb2NrIDogcHVibGljIERlY2xhcmF0aW9uIHsKLSBwdWJsaWM6Ci0gIFN0YXRlbWVudEJsb2NrKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5TdGF0ZW1lbnRCbG9jaygpID0gZGVmYXVsdDsKLQotICB2b2lkIEFkZFN0YXRlbWVudChzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4gc3RhdGVtZW50KTsKLSAgdm9pZCBBZGRTdGF0ZW1lbnQoQXN0Tm9kZSogc3RhdGVtZW50KTsgIC8vIFRha2VzIG93bmVyc2hpcAotICB2b2lkIEFkZExpdGVyYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24sIGJvb2wgYWRkX3NlbWljb2xvbiA9IHRydWUpOwotICBib29sIEVtcHR5KCkgY29uc3QgeyByZXR1cm4gc3RhdGVtZW50c18uZW1wdHkoKTsgfQotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+PiBzdGF0ZW1lbnRzXzsKLX07ICAvLyBjbGFzcyBTdGF0ZW1lbnRCbG9jawotCi1jbGFzcyBDb25zdHJ1Y3RvckltcGwgOiBwdWJsaWMgRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgQ29uc3RydWN0b3JJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0LAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbml0aWFsaXplcl9saXN0KTsKLSAgdmlydHVhbCB+Q29uc3RydWN0b3JJbXBsKCkgPSBkZWZhdWx0OwotCi0gIC8vIENvbnN0cnVjdG9ySW1wbCByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgc3RhdGVtZW50IGJsb2NrLgotICBTdGF0ZW1lbnRCbG9jayogR2V0U3RhdGVtZW50QmxvY2soKTsKLQotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGNsYXNzX25hbWVfOwotICBBcmdMaXN0IGFyZ3VtZW50c187Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbml0aWFsaXplcl9saXN0XzsKLSAgU3RhdGVtZW50QmxvY2sgYm9keV87Ci19OyAgLy8gY2xhc3MgQ29uc3RydWN0b3JJbXBsCi0KLWNsYXNzIE1ldGhvZEltcGwgOiBwdWJsaWMgRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgLy8gUGFzc2luZyBhbiBlbXB0eSBjbGFzcyBuYW1lIGNhdXNlcyB0aGUgbWV0aG9kIHRvIGJlIGRlY2xhcmVkIGFzIGEgbm9ybWFsCi0gIC8vIGZ1bmN0aW9uIChpZS4gbm8gQ2xhc3NOYW1lOjogcXVhbGlmaWVyKS4KLSAgTWV0aG9kSW1wbChjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc19uYW1lLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2RfbmFtZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0ZW1wbGF0ZV9wYXJhbXMsCi0gICAgICAgICAgICAgQXJnTGlzdCYmIGFyZ19saXN0LCBib29sIGlzX2NvbnN0X21ldGhvZCA9IGZhbHNlKTsKLSAgdmlydHVhbCB+TWV0aG9kSW1wbCgpID0gZGVmYXVsdDsKLQotICAvLyBNZXRob2RJbXBsIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBzdGF0ZW1lbnQgYmxvY2suCi0gIFN0YXRlbWVudEJsb2NrKiBHZXRTdGF0ZW1lbnRCbG9jaygpOwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgcmV0dXJuX3R5cGVfOwotICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZV87Ci0gIGNvbnN0IEFyZ0xpc3QgYXJndW1lbnRzXzsKLSAgU3RhdGVtZW50QmxvY2sgc3RhdGVtZW50c187Ci0gIGJvb2wgaXNfY29uc3RfbWV0aG9kXyA9IGZhbHNlOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVtcGxhdGVfcGFyYW1zXzsKLX07ICAvLyBjbGFzcyBNZXRob2RJbXBsCi0KLWNsYXNzIFN3aXRjaFN0YXRlbWVudCA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFN3aXRjaFN0YXRlbWVudChjb25zdCBzdGQ6OnN0cmluZyYgZXhwcmVzc2lvbik7Ci0gIHZpcnR1YWwgflN3aXRjaFN0YXRlbWVudCgpID0gZGVmYXVsdDsKLQotICAvLyBBZGQgYSBjYXNlIHN0YXRlbWVudCBhbmQgcmV0dXJuIGEgcG9pbnRlciBjb2RlIGJsb2NrIGNvcnJlc3BvbmRpbmcKLSAgLy8gdG8gdGhlIGNhc2UuICBUaGUgc3dpdGNoIHN0YXRlbWVudCB3aWxsIGFkZCBhIGJyZWFrIHN0YXRlbWVudAotICAvLyBhZnRlciB0aGUgY29kZSBibG9jayBieSBkZWZhdWx0IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBmYWxsLXRocm91Z2guCi0gIC8vIFJldHVybnMgbnVsbHB0ciBvbiBkdXBsaWNhdGUgdmFsdWUgZXhwcmVzc2lvbnMgKGJ5IHN0cmNtcCwgbm90IHZhbHVlCi0gIC8vIGVxdWl2YWxlbmNlKS4KLSAgU3RhdGVtZW50QmxvY2sqIEFkZENhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlX2V4cHJlc3Npb24pOwotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHN3aXRjaF9leHByZXNzaW9uXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNhc2VfdmFsdWVzXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFN0YXRlbWVudEJsb2NrPj4gY2FzZV9sb2dpY187Ci19OyAgLy8gY2xhc3MgU3dpdGNoU3RhdGVtZW50Ci0KLWNsYXNzIEFzc2lnbm1lbnQgOiBwdWJsaWMgQXN0Tm9kZSB7Ci0gcHVibGljOgotICBBc3NpZ25tZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWZ0LCBjb25zdCBzdGQ6OnN0cmluZyYgcmlnaHQpOwotICBBc3NpZ25tZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWZ0LCBBc3ROb2RlKiByaWdodCk7Ci0gIH5Bc3NpZ25tZW50KCkgPSBkZWZhdWx0OwotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGxoc187Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBc3ROb2RlPiByaHNfOwotfTsgIC8vIGNsYXNzIEFzc2lnbm1lbnQKLQotY2xhc3MgTWV0aG9kQ2FsbCA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIE1ldGhvZENhbGwoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9uYW1lLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaW5nbGVfYXJndW1lbnQpOwotICBNZXRob2RDYWxsKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2RfbmFtZSwgQXJnTGlzdCYmIGFyZ19saXN0KTsKLSAgfk1ldGhvZENhbGwoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWVfOwotICBjb25zdCBBcmdMaXN0IGFyZ3VtZW50c187Ci19OyAgLy8gY2xhc3MgTWV0aG9kQ2FsbAotCi1jbGFzcyBJZlN0YXRlbWVudCA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IElmU3RhdGVtZW50KEFzdE5vZGUqIGV4cHJlc3Npb24sCi0gICAgICAgICAgICAgIGJvb2wgaW52ZXJ0X2V4cHJlc3Npb24gPSBmYWxzZSk7Ci0gIHZpcnR1YWwgfklmU3RhdGVtZW50KCkgPSBkZWZhdWx0OwotICBTdGF0ZW1lbnRCbG9jayogT25UcnVlKCkgeyByZXR1cm4gJm9uX3RydWVfOyB9Ci0gIFN0YXRlbWVudEJsb2NrKiBPbkZhbHNlKCkgeyByZXR1cm4gJm9uX2ZhbHNlXzsgfQotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBc3ROb2RlPiBleHByZXNzaW9uXzsKLSAgYm9vbCBpbnZlcnRfZXhwcmVzc2lvbl8gPSBmYWxzZTsKLSAgU3RhdGVtZW50QmxvY2sgb25fdHJ1ZV87Ci0gIFN0YXRlbWVudEJsb2NrIG9uX2ZhbHNlXzsKLX07ICAvLyBjbGFzcyBJZlN0YXRlbWVudAotCi1jbGFzcyBTdGF0ZW1lbnQgOiBwdWJsaWMgQXN0Tm9kZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTdGF0ZW1lbnQoc3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+IGV4cHJlc3Npb24pOwotICBleHBsaWNpdCBTdGF0ZW1lbnQoQXN0Tm9kZSogZXhwcmVzc2lvbik7ICAvLyBUYWtlcyBwb3NzZXNzaW9uLgotICBleHBsaWNpdCBTdGF0ZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHJlc3Npb24pOwotICB+U3RhdGVtZW50KCkgPSBkZWZhdWx0OwotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBc3ROb2RlPiBleHByZXNzaW9uXzsKLX07ICAvLyBjbGFzcyBTdGF0ZW1lbnQKLQotY2xhc3MgQ29tcGFyaXNvbiA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIENvbXBhcmlzb24oQXN0Tm9kZSogbGhzLCBjb25zdCBzdGQ6OnN0cmluZyYgY29tcGFyaXNvbiwgQXN0Tm9kZSogcmhzKTsKLSAgfkNvbXBhcmlzb24oKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPEFzdE5vZGU+IGxlZnRfOwotICBzdGQ6OnVuaXF1ZV9wdHI8QXN0Tm9kZT4gcmlnaHRfOwotICBjb25zdCBzdGQ6OnN0cmluZyBvcGVyYXRvcl87Ci19OyAgLy8gY2xhc3MgQ29tcGFyaXNvbgotCi1jbGFzcyBMaXRlcmFsRXhwcmVzc2lvbiA6IHB1YmxpYyBBc3ROb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IExpdGVyYWxFeHByZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBleHByZXNzaW9uKTsKLSAgfkxpdGVyYWxFeHByZXNzaW9uKCkgPSBkZWZhdWx0OwotICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cHJlc3Npb25fOwotfTsgIC8vIGNsYXNzIExpdGVyYWxFeHByZXNzaW9uCi0KLWNsYXNzIENwcE5hbWVzcGFjZSA6IHB1YmxpYyBEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICBDcHBOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsYXJhdGlvbnMpOwotICBDcHBOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IGRlY2xhcmF0aW9uKTsKLSAgZXhwbGljaXQgQ3BwTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKLSAgdmlydHVhbCB+Q3BwTmFtZXNwYWNlKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci19OyAgLy8gY2xhc3MgQ3BwTmFtZXNwYWNlCi0KLWNsYXNzIERvY3VtZW50IDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgRG9jdW1lbnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbmNsdWRlX2xpc3QsCi0gICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xhcmF0aW9ucyk7Ci0KLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5jbHVkZV9saXN0XzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zXzsKLX07ICAvLyBjbGFzcyBEb2N1bWVudAotCi1jbGFzcyBDcHBIZWFkZXIgZmluYWwgOiBwdWJsaWMgRG9jdW1lbnQgewotIHB1YmxpYzoKLSAgQ3BwSGVhZGVyKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5jbHVkZV9saXN0LAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZGVjbGFyYXRpb25zKTsKLSAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7Ci19OyAgLy8gY2xhc3MgQ3BwSGVhZGVyCi0KLWNsYXNzIENwcFNvdXJjZSBmaW5hbCA6IHB1YmxpYyBEb2N1bWVudCB7Ci0gcHVibGljOgotICBDcHBTb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbmNsdWRlX2xpc3QsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsYXJhdGlvbnMpOwotfTsgIC8vIGNsYXNzIENwcFNvdXJjZQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FzdF9jcHBfdW5pdHRlc3QuY3BwIGIvYXN0X2NwcF91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZmRiY2QuLjAwMDAwMDAKLS0tIGEvYXN0X2NwcF91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXN0X2NwcC5oIgotI2luY2x1ZGUgImNvZGVfd3JpdGVyLmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci11c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBjcHAgewotbmFtZXNwYWNlIHsKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotY29uc3QgY2hhciBrRXhwZWN0ZWRIZWFkZXJPdXRwdXRbXSA9Ci0gICAgUiIoI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLQotY2xhc3MgVGVzdENsYXNzIHsKLXB1YmxpYzoKLSAgdm9pZCBOb3JtYWxNZXRob2QoaW50IG5vcm1hbGFyZywgZmxvYXQgbm9ybWFsMik7Ci0gIHZpcnR1YWwgdm9pZCBTdWJNZXRob2QoaW50IHN1YmFyZykgY29uc3Q7Ci19OyAgLy8gY2xhc3MgVGVzdENsYXNzCi0KLWNsYXNzIFRlc3RTdWJDbGFzcyA6IHB1YmxpYyBUZXN0Q2xhc3MgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgU3ViTWV0aG9kKGludCBzdWJhcmcpIGNvbnN0OwotfTsgIC8vIGNsYXNzIFRlc3RTdWJDbGFzcwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotKSI7Ci0KLWNvbnN0IGNoYXIga0V4cGVjdGVkR2VuZXJpY0hlYWRlck91dHB1dFtdID0KLSAgICBSIigjcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHRlc3QgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLWNsYXNzIFRlc3RQYXJjZWxhYmxlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gIGludCBhOwotfTsgIC8vIGNsYXNzIFRlc3RQYXJjZWxhYmxlCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0pIjsKLS8vIGNsYW5nLWZvcm1hdCBvbgotCi1jb25zdCBjaGFyIGtFeHBlY3RlZFN3aXRjaE91dHB1dFtdID0KLVIiKHN3aXRjaCAodmFyKSB7Ci1jYXNlIDI6Ci17Ci0gIGJhejsKLX0KLWJyZWFrOwotY2FzZSAxOgotewotICBmb287Ci0gIGJhcjsKLX0KLWJyZWFrOwotfQotKSI7Ci0KLWNvbnN0IGNoYXIga0V4cGVjdGVkTWV0aG9kSW1wbE91dHB1dFtdID0KLSAgICBSIihyZXR1cm5fdHlwZSBDbGFzc05hbWU6Ok1ldGhvZE5hbWUoaW50MzJfdCBhLCBpbnQzMl90IGIsIGludDMyX3QqIGMpIGNvbnN0IHsKLSAgZm9vOwotICBiYXI7Ci19Ci0pIjsKLWNvbnN0IGNoYXIga0V4cGVjdGVkR2VuZXJpY01ldGhvZEltcGxPdXRwdXRbXSA9Ci0gICAgUiIodGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1yZXR1cm5fdHlwZSBDbGFzc05hbWU8VD46Ok1ldGhvZE5hbWUoaW50MzJfdCBhLCBpbnQzMl90IGIsIGludDMyX3QqIGMpIGNvbnN0IHsKLSAgZm9vOwotICBiYXI7Ci19Ci0pIjsKLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBBc3RDcHBUZXN0cyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBDb21wYXJlR2VuZXJhdGVkQ29kZShjb25zdCBBc3ROb2RlJiBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfb3V0cHV0KSB7Ci0gICAgc3RyaW5nIGFjdHVhbF9vdXRwdXQ7Ci0gICAgbm9kZS5Xcml0ZShDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmFjdHVhbF9vdXRwdXQpLmdldCgpKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0LCBhY3R1YWxfb3V0cHV0KTsKLSAgfQotfTsgIC8vIGNsYXNzIEFzdENwcFRlc3RzCi0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNIZWFkZXIpIHsKLSAgdW5pcXVlX3B0cjxNZXRob2REZWNsPiBub3Jte25ldyBNZXRob2REZWNsKAotICAgICAgInZvaWQiLCAiTm9ybWFsTWV0aG9kIiwKLSAgICAgIEFyZ0xpc3R7dmVjdG9yPHN0cmluZz57ImludCBub3JtYWxhcmciLCAiZmxvYXQgbm9ybWFsMiJ9fSl9OwotICB1bmlxdWVfcHRyPE1ldGhvZERlY2w+IHN1YnsKLSAgICAgIG5ldyBNZXRob2REZWNsKCJ2b2lkIiwgIlN1Yk1ldGhvZCIsCi0gICAgICAgICAgICAgICAgICAgICBBcmdMaXN0eyAiaW50IHN1YmFyZyIgfSwKLSAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2w6OklTX0NPTlNUIHwgTWV0aG9kRGVjbDo6SVNfVklSVFVBTCl9OwotICB1bmlxdWVfcHRyPE1ldGhvZERlY2w+IHN1YjJ7Ci0gICAgICBuZXcgTWV0aG9kRGVjbCgidm9pZCIsICJTdWJNZXRob2QiLAotICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdHsgImludCBzdWJhcmciIH0sCi0gICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsOjpJU19DT05TVCB8IE1ldGhvZERlY2w6OklTX1ZJUlRVQUwpfTsKLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiB0ZXN0X21ldGhvZHM7Ci0gIHRlc3RfbWV0aG9kcy5wdXNoX2JhY2soc3RkOjptb3ZlKG5vcm0pKTsKLSAgdGVzdF9tZXRob2RzLnB1c2hfYmFjayhzdGQ6Om1vdmUoc3ViKSk7Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiB0ZXN0X3N1Yl9tZXRob2RzOwotICB0ZXN0X3N1Yl9tZXRob2RzLnB1c2hfYmFjayhzdGQ6Om1vdmUoc3ViMikpOwotCi0gIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IHRlc3R7bmV3IENsYXNzRGVjbHsiVGVzdENsYXNzIiwgIiIsIHt9LCBzdGQ6Om1vdmUodGVzdF9tZXRob2RzKSwge319fTsKLQotICB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiB0ZXN0X3N1YnsKLSAgICAgIG5ldyBDbGFzc0RlY2x7IlRlc3RTdWJDbGFzcyIsICJUZXN0Q2xhc3MiLCB7fSwgc3RkOjptb3ZlKHRlc3Rfc3ViX21ldGhvZHMpLCB7fX19OwotCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gY2xhc3NlczsKLSAgY2xhc3Nlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHRlc3QpKTsKLSAgY2xhc3Nlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHRlc3Rfc3ViKSk7Ci0KLSAgdW5pcXVlX3B0cjxDcHBOYW1lc3BhY2U+IHRlc3RfbnN7bmV3IENwcE5hbWVzcGFjZSB7InRlc3QiLAotICAgICAgc3RkOjptb3ZlKGNsYXNzZXMpfX07Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiB0ZXN0X25zX3ZlYzsKLSAgdGVzdF9uc192ZWMucHVzaF9iYWNrKHN0ZDo6bW92ZSh0ZXN0X25zKSk7Ci0KLSAgdW5pcXVlX3B0cjxDcHBOYW1lc3BhY2U+IGFuZHJvaWRfbnN7bmV3IENwcE5hbWVzcGFjZSB7ImFuZHJvaWQiLAotICAgICAgc3RkOjptb3ZlKHRlc3RfbnNfdmVjKSB9fTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHRlc3RfbnNfZ2xvYmFsczsKLSAgdGVzdF9uc19nbG9iYWxzLnB1c2hfYmFjayhzdGQ6Om1vdmUoYW5kcm9pZF9ucykpOwotCi0gIENwcEhlYWRlciBjcHBfaGVhZGVye3sic3RyaW5nIiwgIm1lbW9yeSJ9LCBzdGQ6Om1vdmUodGVzdF9uc19nbG9iYWxzKX07Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGNwcF9oZWFkZXIsIGtFeHBlY3RlZEhlYWRlck91dHB1dCk7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzR2VuZXJpY0hlYWRlcikgewotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbXMgPSB7IkEiLCAiQiJ9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwdWJsaWNzOwotICBwdWJsaWNzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woImludCBhO1xuIikpOwotICB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiB0ZXN0e25ldyBDbGFzc0RlY2x7Ci0gICAgICAiVGVzdFBhcmNlbGFibGUiLCAiOjphbmRyb2lkOjpQYXJjZWxhYmxlIiwgdHlwZV9wYXJhbXMsIHN0ZDo6bW92ZShwdWJsaWNzKSwge319fTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGNsYXNzZXM7Ci0gIGNsYXNzZXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh0ZXN0KSk7Ci0KLSAgdW5pcXVlX3B0cjxDcHBOYW1lc3BhY2U+IHRlc3RfbnN7bmV3IENwcE5hbWVzcGFjZXsidGVzdCIsIHN0ZDo6bW92ZShjbGFzc2VzKX19OwotCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gdGVzdF9uc192ZWM7Ci0gIHRlc3RfbnNfdmVjLnB1c2hfYmFjayhzdGQ6Om1vdmUodGVzdF9ucykpOwotCi0gIHVuaXF1ZV9wdHI8Q3BwTmFtZXNwYWNlPiBhbmRyb2lkX25ze25ldyBDcHBOYW1lc3BhY2V7ImFuZHJvaWQiLCBzdGQ6Om1vdmUodGVzdF9uc192ZWMpfX07Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiB0ZXN0X25zX2dsb2JhbHM7Ci0gIHRlc3RfbnNfZ2xvYmFscy5wdXNoX2JhY2soc3RkOjptb3ZlKGFuZHJvaWRfbnMpKTsKLQotICBDcHBIZWFkZXIgY3BwX2hlYWRlcnt7InN0cmluZyIsICJtZW1vcnkifSwgc3RkOjptb3ZlKHRlc3RfbnNfZ2xvYmFscyl9OwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShjcHBfaGVhZGVyLCBrRXhwZWN0ZWRHZW5lcmljSGVhZGVyT3V0cHV0KTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNVbnNjb3BlZEVudW0pIHsKLSAgRW51bSBlKCJGb28iLCAiIiwgZmFsc2UpOwotICBlLkFkZFZhbHVlKCJCQVIiLCAiNDIiKTsKLSAgZS5BZGRWYWx1ZSgiQkFaIiwgIiIpOwotCi0gIHN0cmluZyBleHBlY3RlZCA9Ci0gICAgICBSIihlbnVtIEZvbyB7Ci0gIEJBUiA9IDQyLAotICBCQVosCi19OwotKSI7Ci0KLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoZSwgZXhwZWN0ZWQpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc1Njb3BlZEVudW0pIHsKLSAgRW51bSBlKCJGb28iLCAiaW50MzJfdCIsIHRydWUpOwotICBlLkFkZFZhbHVlKCJCQVIiLCAiNDIiKTsKLSAgZS5BZGRWYWx1ZSgiQkFaIiwgIiIpOwotCi0gIHN0cmluZyBleHBlY3RlZCA9Ci0gICAgICBSIihlbnVtIGNsYXNzIEZvbyA6IGludDMyX3QgewotICBCQVIgPSA0MiwKLSAgQkFaLAotfTsKLSkiOwotCi0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGUsIGV4cGVjdGVkKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNBcmdMaXN0KSB7Ci0gIEFyZ0xpc3Qgc2ltcGxlKCJmb28iKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoc2ltcGxlLCAiKGZvbykiKTsKLSAgQXJnTGlzdCBjb21wb3VuZCh7ImZvbyIsICJiYXIiLCAiYmF6In0pOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShjb21wb3VuZCwgIihmb28sIGJhciwgYmF6KSIpOwotICBzdGQ6OnZlY3Rvcjx1bmlxdWVfcHRyPEFzdE5vZGU+PiBhcmdzOwotICBhcmdzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbEV4cHJlc3Npb24oImZvbygpIikpOwotICBBcmdMaXN0IG5lc3RlZChzdGQ6Om1vdmUoYXJncykpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShuZXN0ZWQsICIoZm9vKCkpIik7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzU3RhdGVtZW50KSB7Ci0gIFN0YXRlbWVudCBzKG5ldyBMaXRlcmFsRXhwcmVzc2lvbigiZm9vIikpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShzLCAiZm9vO1xuIik7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzQ29tcGFyaXNvbikgewotICBDb21wYXJpc29uIGMoCi0gICAgICBuZXcgTGl0ZXJhbEV4cHJlc3Npb24oImxocyIpLCAiJiYiLCBuZXcgTGl0ZXJhbEV4cHJlc3Npb24oInJocyIpKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoYywgIigobGhzKSAmJiAocmhzKSkiKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNTdGF0ZW1lbnRCbG9jaykgewotICBTdGF0ZW1lbnRCbG9jayBibG9jazsKLSAgYmxvY2suQWRkU3RhdGVtZW50KHVuaXF1ZV9wdHI8QXN0Tm9kZT4obmV3IFN0YXRlbWVudCgiZm9vIikpKTsKLSAgYmxvY2suQWRkU3RhdGVtZW50KHVuaXF1ZV9wdHI8QXN0Tm9kZT4obmV3IFN0YXRlbWVudCgiYmFyIikpKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoYmxvY2ssICJ7XG4gIGZvbztcbiAgYmFyO1xufVxuIik7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzQ29uc3RydWN0b3JJbXBsKSB7Ci0gIENvbnN0cnVjdG9ySW1wbCBjKCJDbGFzc05hbWUiLCBBcmdMaXN0KHsiYSIsICJiIiwgImMifSksCi0gICAgICAgICAgICAgICAgICAgIHsiYmF6Xyhmb28pIiwgImJhcl8oYmxhaCkifSk7Ci0gIHN0cmluZyBleHBlY3RlZCA9IFIiKENsYXNzTmFtZTo6Q2xhc3NOYW1lKGEsIGIsIGMpCi0gICAgOiBiYXpfKGZvbyksCi0gICAgICBiYXJfKGJsYWgpewotfQotKSI7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGMsIGV4cGVjdGVkKTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNBc3NpZ25tZW50KSB7Ci0gIEFzc2lnbm1lbnQgc2ltcGxlKCJmb28iLCAiOCIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShzaW1wbGUsICJmb28gPSA4O1xuIik7Ci0gIEFzc2lnbm1lbnQgbGVzc19zaW1wbGUoImZvbyIsIG5ldyBNZXRob2RDYWxsKCJmIiwgIjgiKSk7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKGxlc3Nfc2ltcGxlLCAiZm9vID0gZig4KTtcbiIpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc01ldGhvZENhbGwpIHsKLSAgTWV0aG9kQ2FsbCBzaW5nbGUoInNpbmdsZSIsICJhcmciKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoc2luZ2xlLCAic2luZ2xlKGFyZykiKTsKLSAgTWV0aG9kQ2FsbCBtdWx0aSgKLSAgICAgICJtdWx0aSIsCi0gICAgICBBcmdMaXN0KHsiaGFzIiwgInNvbWUiLCAiYXJncyJ9KSk7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKG11bHRpLCAibXVsdGkoaGFzLCBzb21lLCBhcmdzKSIpOwotfQotCi1URVNUX0YoQXN0Q3BwVGVzdHMsIEdlbmVyYXRlc0lmU3RhdGVtZW50KSB7Ci0gIElmU3RhdGVtZW50IHMobmV3IExpdGVyYWxFeHByZXNzaW9uKCJmb28iKSk7Ci0gIHMuT25UcnVlKCktPkFkZExpdGVyYWwoIm9uIHRydWUxIik7Ci0gIHMuT25GYWxzZSgpLT5BZGRMaXRlcmFsKCJvbiBmYWxzZSIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShzLCAiaWYgKGZvbykge1xuICBvbiB0cnVlMTtcbn1cbmVsc2Uge1xuICBvbiBmYWxzZTtcbn1cbiIpOwotCi0gIElmU3RhdGVtZW50IHMyKG5ldyBMaXRlcmFsRXhwcmVzc2lvbigiYmFyIikpOwotICBzMi5PblRydWUoKS0+QWRkTGl0ZXJhbCgib24gdHJ1ZTEiKTsKLSAgQ29tcGFyZUdlbmVyYXRlZENvZGUoczIsICJpZiAoYmFyKSB7XG4gIG9uIHRydWUxO1xufVxuIik7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzU3dpdGNoU3RhdGVtZW50KSB7Ci0gIFN3aXRjaFN0YXRlbWVudCBzKCJ2YXIiKTsKLSAgLy8gVGhlc2UgYXJlIGludGVudGlvbmFsbHkgb3V0IG9mIGFscGhhbnVtZXJpYyBvcmRlci4gIFdlJ3JlIHRlc3RpbmcKLSAgLy8gdGhhdCBzd2l0Y2ggcmVzcGVjdHMgY2FzZSBhZGRpdGlvbiBvcmRlci4KLSAgYXV0byBjYXNlMiA9IHMuQWRkQ2FzZSgiMiIpOwotICBjYXNlMi0+QWRkU3RhdGVtZW50KHVuaXF1ZV9wdHI8QXN0Tm9kZT57bmV3IFN0YXRlbWVudHsiYmF6In19KTsKLSAgYXV0byBjYXNlMSA9IHMuQWRkQ2FzZSgiMSIpOwotICBjYXNlMS0+QWRkU3RhdGVtZW50KHVuaXF1ZV9wdHI8QXN0Tm9kZT57bmV3IFN0YXRlbWVudHsiZm9vIn19KTsKLSAgY2FzZTEtPkFkZFN0YXRlbWVudCh1bmlxdWVfcHRyPEFzdE5vZGU+e25ldyBTdGF0ZW1lbnR7ImJhciJ9fSk7Ci0gIENvbXBhcmVHZW5lcmF0ZWRDb2RlKHMsIGtFeHBlY3RlZFN3aXRjaE91dHB1dCk7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgR2VuZXJhdGVzTWV0aG9kSW1wbCkgewotICBNZXRob2RJbXBsIG17InJldHVybl90eXBlIiwKLSAgICAgICAgICAgICAgICJDbGFzc05hbWUiLAotICAgICAgICAgICAgICAgIk1ldGhvZE5hbWUiLAotICAgICAgICAgICAgICAge30sCi0gICAgICAgICAgICAgICBBcmdMaXN0e3siaW50MzJfdCBhIiwgImludDMyX3QgYiIsICJpbnQzMl90KiBjIn19LAotICAgICAgICAgICAgICAgdHJ1ZX07Ci0gIGF1dG8gYiA9IG0uR2V0U3RhdGVtZW50QmxvY2soKTsKLSAgYi0+QWRkTGl0ZXJhbCgiZm9vIik7Ci0gIGItPkFkZExpdGVyYWwoImJhciIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShtLCBrRXhwZWN0ZWRNZXRob2RJbXBsT3V0cHV0KTsKLX0KLQotVEVTVF9GKEFzdENwcFRlc3RzLCBHZW5lcmF0ZXNHZW5lcmljTWV0aG9kSW1wbCkgewotICBNZXRob2RJbXBsIG17InJldHVybl90eXBlIiwKLSAgICAgICAgICAgICAgICJDbGFzc05hbWUiLAotICAgICAgICAgICAgICAgIk1ldGhvZE5hbWUiLAotICAgICAgICAgICAgICAgeyJUIn0sCi0gICAgICAgICAgICAgICBBcmdMaXN0e3siaW50MzJfdCBhIiwgImludDMyX3QgYiIsICJpbnQzMl90KiBjIn19LAotICAgICAgICAgICAgICAgdHJ1ZX07Ci0gIGF1dG8gYiA9IG0uR2V0U3RhdGVtZW50QmxvY2soKTsKLSAgYi0+QWRkTGl0ZXJhbCgiZm9vIik7Ci0gIGItPkFkZExpdGVyYWwoImJhciIpOwotICBDb21wYXJlR2VuZXJhdGVkQ29kZShtLCBrRXhwZWN0ZWRHZW5lcmljTWV0aG9kSW1wbE91dHB1dCk7Ci19Ci0KLVRFU1RfRihBc3RDcHBUZXN0cywgVG9TdHJpbmcpIHsKLSAgc3RkOjpzdHJpbmcgbGl0ZXJhbCA9ICJ2b2lkIGZvbygpIHt9IjsKLSAgTGl0ZXJhbERlY2wgZGVjbChsaXRlcmFsKTsKLSAgc3RkOjpzdHJpbmcgYWN0dWFsID0gZGVjbC5Ub1N0cmluZygpOwotICBFWFBFQ1RfRVEobGl0ZXJhbCwgYWN0dWFsKTsKLSAgc3RkOjpzdHJpbmcgd3JpdHRlbjsKLSAgZGVjbC5Xcml0ZShDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJndyaXR0ZW4pLmdldCgpKTsKLSAgRVhQRUNUX0VRKGxpdGVyYWwsIHdyaXR0ZW4pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FzdF9qYXZhLmNwcCBiL2FzdF9qYXZhLmNwcAppbmRleCAwNjY2MjRlLi43ZDk1YmQ0IDEwMDY0NAotLS0gYS9hc3RfamF2YS5jcHAKKysrIGIvYXN0X2phdmEuY3BwCkBAIC0yMzMsMTUgKzIzMyw2IEBACiAgIHRvLT5Xcml0ZSgiKSIpOwogfQogCi1OZXdBcnJheUV4cHJlc3Npb246Ok5ld0FycmF5RXhwcmVzc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgdCwgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IHMpCi0gICAgOiB0eXBlKHQpLCBzaXplKHMpIHt9Ci0KLXZvaWQgTmV3QXJyYXlFeHByZXNzaW9uOjpXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3QgewotICB0by0+V3JpdGUoIm5ldyAlc1siLCB0aGlzLT50eXBlLmNfc3RyKCkpOwotICBzaXplLT5Xcml0ZSh0byk7Ci0gIHRvLT5Xcml0ZSgiXSIpOwotfQotCiBDYXN0OjpDYXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiB0LCBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gZSkgOiB0eXBlKHQpLCBleHByZXNzaW9uKGUpIHt9CiAKIHZvaWQgQ2FzdDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKQEAgLTI4NSw2ICsyNzYsMTAgQEAKICAgdG8tPldyaXRlKCI7XG4iKTsKIH0KIAordm9pZCBCcmVha1N0YXRlbWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKKyAgdG8tPldyaXRlKCJicmVhaztcbiIpOworfQorCiB2b2lkIFRyeVN0YXRlbWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKICAgdG8tPldyaXRlKCJ0cnkgIik7CiAgIHRoaXMtPnN0YXRlbWVudHMtPldyaXRlKHRvKTsKQEAgLTQzMiwzMSArNDI3LDYgQEAKICAgdG8tPldyaXRlKCJ9XG4iKTsKIH0KIAotRG9jdW1lbnQ6OkRvY3VtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDbGFzcz4gY2xhenopCi0gICAgOiBjb21tZW50Xyhjb21tZW50KSwKLSAgICAgIHBhY2thZ2VfKHBhY2thZ2UpLAotICAgICAgY2xhenpfKHN0ZDo6bW92ZShjbGF6eikpIHsKLX0KLQotdm9pZCBEb2N1bWVudDo6V3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IHsKLSAgaWYgKCFjb21tZW50Xy5lbXB0eSgpKSB7Ci0gICAgdG8tPldyaXRlKCIlc1xuIiwgY29tbWVudF8uY19zdHIoKSk7Ci0gIH0KLSAgdG8tPldyaXRlKAotICAgICAgIi8qXG4iCi0gICAgICAiICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS5cbiIKLSAgICAgICIgKi9cbiIpOwotICBpZiAoIXBhY2thZ2VfLmVtcHR5KCkpIHsKLSAgICB0by0+V3JpdGUoInBhY2thZ2UgJXM7XG4iLCBwYWNrYWdlXy5jX3N0cigpKTsKLSAgfQotCi0gIGlmIChjbGF6el8pIHsKLSAgICBjbGF6el8tPldyaXRlKHRvKTsKLSAgfQotfQotCiBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gTlVMTF9WQUxVRSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbEV4cHJlc3Npb24+KCJudWxsIik7CiBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gVEhJU19WQUxVRSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbEV4cHJlc3Npb24+KCJ0aGlzIik7CiBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gU1VQRVJfVkFMVUUgPSBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxFeHByZXNzaW9uPigic3VwZXIiKTsKZGlmZiAtLWdpdCBhL2FzdF9qYXZhLmggYi9hc3RfamF2YS5oCmluZGV4IGQ0ZTg5NDQuLmQ3ZTVjYjUgMTAwNjQ0Ci0tLSBhL2FzdF9qYXZhLmgKKysrIGIvYXN0X2phdmEuaApAQCAtMjA3LDE1ICsyMDcsNiBAQAogICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKIH07CiAKLXN0cnVjdCBOZXdBcnJheUV4cHJlc3Npb24gOiBwdWJsaWMgRXhwcmVzc2lvbiB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHR5cGU7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBzaXplOwotCi0gIE5ld0FycmF5RXhwcmVzc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IHNpemUpOwotICB2aXJ0dWFsIH5OZXdBcnJheUV4cHJlc3Npb24oKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotfTsKLQogc3RydWN0IENhc3QgOiBwdWJsaWMgRXhwcmVzc2lvbiB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHR5cGU7CiAgIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBleHByZXNzaW9uID0gbnVsbHB0cjsKQEAgLTI1NCw2ICsyNDUsMTIgQEAKICAgdm9pZCBXcml0ZShDb2RlV3JpdGVyKiB0bykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCitzdHJ1Y3QgQnJlYWtTdGF0ZW1lbnQgOiBwdWJsaWMgU3RhdGVtZW50IHsKKyAgQnJlYWtTdGF0ZW1lbnQoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkJyZWFrU3RhdGVtZW50KCkgPSBkZWZhdWx0OworICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKK307CisKIHN0cnVjdCBUcnlTdGF0ZW1lbnQgOiBwdWJsaWMgU3RhdGVtZW50IHsKICAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlbWVudEJsb2NrPiBzdGF0ZW1lbnRzID0gc3RkOjptYWtlX3NoYXJlZDxTdGF0ZW1lbnRCbG9jaz4oKTsKIApAQCAtMzMyLDIwICszMjksNiBAQAogICB2b2lkIFdyaXRlKENvZGVXcml0ZXIqIHRvKSBjb25zdCBvdmVycmlkZTsKIH07CiAKLWNsYXNzIERvY3VtZW50IDogcHVibGljIEFzdE5vZGUgewotIHB1YmxpYzoKLSAgRG9jdW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnQsCi0gICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLAotICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2xhc3M+IGNsYXp6KTsKLSAgdmlydHVhbCB+RG9jdW1lbnQoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgV3JpdGUoQ29kZVdyaXRlciogdG8pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgY29tbWVudF87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q2xhc3M+IGNsYXp6XzsKLX07Ci0KIGV4dGVybiBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gTlVMTF9WQUxVRTsKIGV4dGVybiBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gVEhJU19WQUxVRTsKIGV4dGVybiBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gU1VQRVJfVkFMVUU7CmRpZmYgLS1naXQgYS9idWlsZC9BbmRyb2lkLmJwIGIvYnVpbGQvQW5kcm9pZC5icAppbmRleCA1M2NmOWRiLi5mMTJhNGY1IDEwMDY0NAotLS0gYS9idWlsZC9BbmRyb2lkLmJwCisrKyBiL2J1aWxkL0FuZHJvaWQuYnAKQEAgLTI3LDcgKzI3LDYgQEAKICAgICBkZXBzOiBbCiAgICAgICAgICJibHVlcHJpbnQiLAogICAgICAgICAic29vbmciLAotICAgICAgICAic29vbmctYXBleCIsCiAgICAgICAgICJzb29uZy1hbmRyb2lkIiwKICAgICAgICAgInNvb25nLWNjIiwKICAgICAgICAgInNvb25nLWdlbnJ1bGUiLApAQCAtNjMsOCArNjIsMTEgQEAKIC8vIGJlIG1vdmVkIGJhY2sgdG8gTG9hZEhvb2ssIGFuZCB0aGVuIGRlZmF1bHQgY2FuIGJlIGFwcGxpZWQgYXMgd2VsbC4KIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiYWlkbC1jcHAtbW9kdWxlLWRlZmF1bHRzIiwKLSAgICAvLyBUT0RPKGIvMzE1NTkwOTUpOiByZW1vdmUgd2hlbiBob3N0IGJpb25pYyBpcyBhdmFpbGFibGUKLSAgICBkZWZhdWx0czogWyJsaWJiaW5kZXJfbmRrX2hvc3RfdXNlciJdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGphdmFfZGVmYXVsdHMgewpAQCAtMTE0LDcgKzExNiw3IEBACiAgICAgICAgICJ0ZXN0c18xL3NvbWVfcGFja2FnZS9JQmFyLmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAidGVzdC1waWVjZS0xIiwKKyAgICAgICAgInRlc3QtcGllY2UtMS1WMyIsCiAgICAgXSwKICAgICBiYWNrZW5kOiB7CiAgICAgICAgIGphdmE6IHsKQEAgLTEzMyw3ICsxMzUsNyBAQAogICAgICAgICAidGVzdHNfMS9vdGhlcl9wYWNrYWdlL0lCYXouYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJ0ZXN0LXBpZWNlLTIiLAorICAgICAgICAidGVzdC1waWVjZS0yLVYxIiwKICAgICBdLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgamF2YTogewpAQCAtMTUyLDcgKzE1NCw3IEBACiAgICAgICAgICJ0ZXN0c18yL2Fub3RoZXJfcGFja2FnZS9JRmF6LmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAidGVzdC1waWVjZS0xIiwKKyAgICAgICAgInRlc3QtcGllY2UtMS1WMyIsCiAgICAgXSwKICAgICBiYWNrZW5kOiB7CiAgICAgICAgIGphdmE6IHsKQEAgLTE3Myw3ICsxNzUsNyBAQAogICAgICAgICAidGVzdF9wYWNrYWdlL0lCYXouYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJ0ZXN0LXBpZWNlLTIiLAorICAgICAgICAidGVzdC1waWVjZS0yLVYxIiwKICAgICBdLAogICAgIGJhY2tlbmQ6IHsKICAgICAgICAgamF2YTogewpAQCAtMTk4LDYgKzIwMCwxNyBAQAogICAgIF0sCiB9CiAKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAidGVzdC1waWVjZS02IiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogInRlc3RzXzYiLAorICAgIGZsYWdzOiBbIi1XZXJyb3IiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0c182L3Rlc3Q2L0Jhci5haWRsIiwKKyAgICAgICAgInRlc3RzXzYvdGVzdDYvRm9vLmFpZGwiLAorICAgIF0sCit9CisKIC8vIFRoZXNlIHRlc3QgdGhhdCBhIHBhcmNlbCBpbXBvcnRlZCBmcm9tIEEtPkItPkMgd2lsbCBoYXZlIHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgdG8gbGluayBpbgogLy8gYWxsIGJhY2tlbmRzIChDKysgYmFja2VuZHMgbmVlZCB0byBsaW5rIGRpcmVjbHR5IGFnYWluc3QgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBwYXJjZWxhYmxlCiAvLyBpbiBvcmRlciB0byB3b3JrKQpAQCAtMjQxLDMgKzI1NCw5IEBACiAgICAgICAgIH0sCiAgICAgfSwKIH0KKworc2hfYmluYXJ5IHsKKyAgICBuYW1lOiAiYWlkbF9oYXNoX2dlbiIsCisgICAgc3JjOiAiaGFzaF9nZW4uc2giLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF9hcGkuZ28gYi9idWlsZC9haWRsX2FwaS5nbwppbmRleCAyNzk4Mzc0Li42MmQyNTQxIDEwMDY0NAotLS0gYS9idWlsZC9haWRsX2FwaS5nbworKysgYi9idWlsZC9haWRsX2FwaS5nbwpAQCAtMzEsMzIgKzMxLDMyIEBACiAJYWlkbER1bXBBcGlSdWxlID0gcGN0eC5TdGF0aWNSdWxlKCJhaWRsRHVtcEFwaVJ1bGUiLCBibHVlcHJpbnQuUnVsZVBhcmFtc3sKIAkJQ29tbWFuZDogYHJtIC1yZiAiJHtvdXREaXJ9IiAmJiBta2RpciAtcCAiJHtvdXREaXJ9IiAmJiBgICsKIAkJCWAke2FpZGxDbWR9IC0tZHVtcGFwaSAtLXN0cnVjdHVyZWQgJHtpbXBvcnRzfSAke29wdGlvbmFsRmxhZ3N9IC0tb3V0ICR7b3V0RGlyfSAke2lufSAmJiBgICsKLQkJCWAoY2QgJHtvdXREaXJ9ICYmIGZpbmQgLi8gLW5hbWUgIiouYWlkbCIgLXByaW50MCB8IExDX0FMTD1DIHNvcnQgLXogfCB4YXJncyAtMCBzaGExc3VtICYmIGVjaG8gJHtsYXRlc3RWZXJzaW9ufSkgfCBzaGExc3VtIHwgY3V0IC1kICIgIiAtZiAxID4gJHtoYXNoRmlsZX0gYCwKLQkJQ29tbWFuZERlcHM6IFtdc3RyaW5neyIke2FpZGxDbWR9In0sCisJCQlgJHthaWRsSGFzaEdlbn0gJHtvdXREaXJ9ICR7bGF0ZXN0VmVyc2lvbn0gJHtoYXNoRmlsZX1gLAorCQlDb21tYW5kRGVwczogW11zdHJpbmd7IiR7YWlkbENtZH0iLCAiJHthaWRsSGFzaEdlbn0ifSwKIAl9LCAib3B0aW9uYWxGbGFncyIsICJpbXBvcnRzIiwgIm91dERpciIsICJoYXNoRmlsZSIsICJsYXRlc3RWZXJzaW9uIikKIAogCWFpZGxDaGVja0FwaVJ1bGUgPSBwY3R4LlN0YXRpY1J1bGUoImFpZGxDaGVja0FwaVJ1bGUiLCBibHVlcHJpbnQuUnVsZVBhcmFtc3sKLQkJQ29tbWFuZDogYCgke2FpZGxDbWR9ICR7b3B0aW9uYWxGbGFnc30gLS1jaGVja2FwaT0ke2NoZWNrQXBpTGV2ZWx9ICR7b2xkfSAke25ld30gJiYgdG91Y2ggJHtvdXR9KSB8fCBgICsKKwkJQ29tbWFuZDogYCgke2FpZGxDbWR9ICR7b3B0aW9uYWxGbGFnc30gLS1jaGVja2FwaT0ke2NoZWNrQXBpTGV2ZWx9ICR7aW1wb3J0c30gJHtvbGR9ICR7bmV3fSAmJiB0b3VjaCAke291dH0pIHx8IGAgKwogCQkJYChjYXQgJHttZXNzYWdlRmlsZX0gJiYgZXhpdCAxKWAsCiAJCUNvbW1hbmREZXBzOiBbXXN0cmluZ3siJHthaWRsQ21kfSJ9LAogCQlEZXNjcmlwdGlvbjogIkFJREwgQ0hFQ0sgQVBJOiAke25ld30gYWdhaW5zdCAke29sZH0iLAotCX0sICJvcHRpb25hbEZsYWdzIiwgIm9sZCIsICJuZXciLCAibWVzc2FnZUZpbGUiLCAiY2hlY2tBcGlMZXZlbCIpCisJfSwgIm9wdGlvbmFsRmxhZ3MiLCAiaW1wb3J0cyIsICJvbGQiLCAibmV3IiwgIm1lc3NhZ2VGaWxlIiwgImNoZWNrQXBpTGV2ZWwiKQogCiAJYWlkbFZlcmlmeUhhc2hSdWxlID0gcGN0eC5TdGF0aWNSdWxlKCJhaWRsVmVyaWZ5SGFzaFJ1bGUiLCBibHVlcHJpbnQuUnVsZVBhcmFtc3sKLQkJQ29tbWFuZDogYGlmIFsgJCQoY2QgJyR7YXBpRGlyfScgJiYgeyBmaW5kIC4vIC1uYW1lICIqLmFpZGwiIC1wcmludDAgfCBMQ19BTEw9QyBzb3J0IC16IHwgeGFyZ3MgLTAgc2hhMXN1bSAmJiBlY2hvICR7dmVyc2lvbn07IH0gfCBzaGExc3VtIHwgY3V0IC1kICIgIiAtZiAxKSA9ICQkKHJlYWQgLXIgPCcke2hhc2hGaWxlfScgaGFzaCBleHRyYTsgcHJpbnRmICVzICQkaGFzaCkgXTsgdGhlbiBgICsKKwkJQ29tbWFuZDogYGlmIFsgJCQoY2QgJyR7YXBpRGlyfScgJiYgeyBmaW5kIC4vIC1uYW1lICIqLmFpZGwiIC1wcmludDAgfCBMQ19BTEw9QyBzb3J0IC16IHwgeGFyZ3MgLTAgc2hhMXN1bSAmJiBlY2hvICR7dmVyc2lvbn07IH0gfCBzaGExc3VtIHwgY3V0IC1kICIgIiAtZiAxKSA9ICQkKHRhaWwgLTEgJyR7aGFzaEZpbGV9JykgXTsgdGhlbiBgICsKIAkJCWB0b3VjaCAke291dH07IGVsc2UgY2F0ICcke21lc3NhZ2VGaWxlfScgJiYgZXhpdCAxOyBmaWAsCiAJCURlc2NyaXB0aW9uOiAiVmVyaWZ5ICR7YXBpRGlyfSBmaWxlcyBoYXZlIG5vdCBiZWVuIG1vZGlmaWVkIiwKIAl9LCAiYXBpRGlyIiwgInZlcnNpb24iLCAibWVzc2FnZUZpbGUiLCAiaGFzaEZpbGUiKQogKQogCiB0eXBlIGFpZGxBcGlQcm9wZXJ0aWVzIHN0cnVjdCB7Ci0JQmFzZU5hbWUgICAgICAgICAgICAgIHN0cmluZwotCVNyY3MgICAgICAgICAgICAgICAgICBbXXN0cmluZyBgYW5kcm9pZDoicGF0aCJgCi0JQWlkbFJvb3QgICAgICAgICAgICAgIHN0cmluZyAgIC8vIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgaW5wdXQgYWlkbCBmaWxlCi0JU3RhYmlsaXR5ICAgICAgICAgICAgICpzdHJpbmcKLQlJbXBvcnRzV2l0aG91dFZlcnNpb24gW11zdHJpbmcKLQlWZXJzaW9ucyAgICAgICAgICAgICAgW11zdHJpbmcKLQlEdW1wYXBpICAgICAgICAgICAgICAgRHVtcEFwaVByb3BlcnRpZXMKKwlCYXNlTmFtZSAgc3RyaW5nCisJU3JjcyAgICAgIFtdc3RyaW5nIGBhbmRyb2lkOiJwYXRoImAKKwlBaWRsUm9vdCAgc3RyaW5nICAgLy8gYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBpbnB1dCBhaWRsIGZpbGUKKwlTdGFiaWxpdHkgKnN0cmluZworCUltcG9ydHMgICBbXXN0cmluZworCVZlcnNpb25zICBbXXN0cmluZworCUR1bXBhcGkgICBEdW1wQXBpUHJvcGVydGllcwogfQogCiB0eXBlIGFpZGxBcGkgc3RydWN0IHsKQEAgLTc1LDYgKzc1LDkgQEAKIAogCS8vIGZvciB0cmlnZ2VyaW5nIGZyZWV6aW5nIEFQSSBhcyB0aGUgbmV3IHZlcnNpb24KIAlmcmVlemVBcGlUaW1lc3RhbXAgYW5kcm9pZC5Xcml0YWJsZVBhdGgKKworCS8vIGZvciBjaGVja2luZyBmb3IgYWN0aXZlIGRldmVsb3BtZW50IG9uIHVuZnJvemVuIHZlcnNpb24KKwloYXNEZXZlbG9wbWVudCBhbmRyb2lkLldyaXRhYmxlUGF0aAogfQogCiBmdW5jIChtICphaWRsQXBpKSBhcGlEaXIoKSBzdHJpbmcgewpAQCAtODcsMTEgKzkwLDE3IEBACiB9CiAKIHR5cGUgYXBpRHVtcCBzdHJ1Y3QgeworCXZlcnNpb24gIHN0cmluZwogCWRpciAgICAgIGFuZHJvaWQuUGF0aAogCWZpbGVzICAgIGFuZHJvaWQuUGF0aHMKIAloYXNoRmlsZSBhbmRyb2lkLk9wdGlvbmFsUGF0aAogfQogCitmdW5jIChtICphaWRsQXBpKSBnZXRJbXBvcnRzKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIHZlcnNpb24gc3RyaW5nKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJaWZhY2UgOj0gY3R4LkdldERpcmVjdERlcFdpdGhUYWcobS5wcm9wZXJ0aWVzLkJhc2VOYW1lLCBpbnRlcmZhY2VEZXApLigqYWlkbEludGVyZmFjZSkKKwlyZXR1cm4gaWZhY2UuZ2V0SW1wb3J0cyh2ZXJzaW9uKQorfQorCiBmdW5jIChtICphaWRsQXBpKSBjcmVhdGVBcGlEdW1wRnJvbVNvdXJjZShjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0KSBhcGlEdW1wIHsKIAlzcmNzLCBpbXBvcnRzIDo9IGdldFBhdGhzKGN0eCwgbS5wcm9wZXJ0aWVzLlNyY3MsIG0ucHJvcGVydGllcy5BaWRsUm9vdCkKIApAQCAtOTksMzEgKzEwOCwyMCBAQAogCQlyZXR1cm4gYXBpRHVtcHt9CiAJfQogCi0JdmFyIGltcG9ydFBhdGhzIFtdc3RyaW5nCi0JaW1wb3J0UGF0aHMgPSBhcHBlbmQoaW1wb3J0UGF0aHMsIGltcG9ydHMuLi4pCi0JY3R4LlZpc2l0RGlyZWN0RGVwcyhmdW5jKGRlcCBhbmRyb2lkLk1vZHVsZSkgewotCQlpZiBpbXBvcnRlZEFpZGwsIG9rIDo9IGRlcC4oKmFpZGxJbnRlcmZhY2UpOyBvayB7Ci0JCQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgaW1wb3J0ZWRBaWRsLnByb3BlcnRpZXMuRnVsbF9pbXBvcnRfcGF0aHMuLi4pCi0JCX0KLQl9KQorCS8vIGR1bXBhcGkgdXNlcyBpbXBvcnRzIGZvciBUb1QoIiIpIHZlcnNpb24KKwlkZXBzIDo9IGdldERlcHMoY3R4LCBtLmdldEltcG9ydHMoY3R4LCBtLm5leHRWZXJzaW9uKCkpKQorCWltcG9ydHMgPSBhcHBlbmQoaW1wb3J0cywgZGVwcy5pbXBvcnRzLi4uKQogCiAJdmFyIGFwaURpciBhbmRyb2lkLldyaXRhYmxlUGF0aAogCXZhciBhcGlGaWxlcyBhbmRyb2lkLldyaXRhYmxlUGF0aHMKIAl2YXIgaGFzaEZpbGUgYW5kcm9pZC5Xcml0YWJsZVBhdGgKIAogCWFwaURpciA9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJkdW1wIikKLQlhaWRsUm9vdCA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVTcmMoY3R4LCBtLnByb3BlcnRpZXMuQWlkbFJvb3QpCiAJZm9yIF8sIHNyYyA6PSByYW5nZSBzcmNzIHsKLQkJYmFzZURpciA6PSBnZXRCYXNlRGlyKGN0eCwgc3JjLCBhaWRsUm9vdCkKLQkJcmVsUGF0aCwgXyA6PSBmaWxlcGF0aC5SZWwoYmFzZURpciwgc3JjLlN0cmluZygpKQotCQlvdXRGaWxlIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJkdW1wIiwgcmVsUGF0aCkKKwkJb3V0RmlsZSA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAiZHVtcCIsIHNyYy5SZWwoKSkKIAkJYXBpRmlsZXMgPSBhcHBlbmQoYXBpRmlsZXMsIG91dEZpbGUpCiAJfQogCWhhc2hGaWxlID0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlT3V0KGN0eCwgImR1bXAiLCAiLmhhc2giKQotCWxhdGVzdFZlcnNpb24gOj0gImxhdGVzdC12ZXJzaW9uIgotCWlmIGxlbihtLnByb3BlcnRpZXMuVmVyc2lvbnMpID49IDEgewotCQlsYXRlc3RWZXJzaW9uID0gbS5wcm9wZXJ0aWVzLlZlcnNpb25zW2xlbihtLnByb3BlcnRpZXMuVmVyc2lvbnMpLTFdCi0JfQogCiAJdmFyIG9wdGlvbmFsRmxhZ3MgW11zdHJpbmcKIAlpZiBtLnByb3BlcnRpZXMuU3RhYmlsaXR5ICE9IG5pbCB7CkBAIC0xMzIsMjAgKzEzMCwyMyBAQAogCWlmIHByb3B0b29scy5Cb29sKG0ucHJvcGVydGllcy5EdW1wYXBpLk5vX2xpY2Vuc2UpIHsKIAkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS1ub19saWNlbnNlIikKIAl9CisJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCB3cmFwKCItcCIsIGRlcHMucHJlcHJvY2Vzc2VkLlN0cmluZ3MoKSwgIiIpLi4uKQogCisJdmVyc2lvbiA6PSBuZXh0VmVyc2lvbihtLnByb3BlcnRpZXMuVmVyc2lvbnMpCiAJY3R4LkJ1aWxkKHBjdHgsIGFuZHJvaWQuQnVpbGRQYXJhbXN7Ci0JCVJ1bGU6ICAgIGFpZGxEdW1wQXBpUnVsZSwKLQkJT3V0cHV0czogYXBwZW5kKGFwaUZpbGVzLCBoYXNoRmlsZSksCi0JCUlucHV0czogIHNyY3MsCisJCVJ1bGU6ICAgICAgYWlkbER1bXBBcGlSdWxlLAorCQlPdXRwdXRzOiAgIGFwcGVuZChhcGlGaWxlcywgaGFzaEZpbGUpLAorCQlJbnB1dHM6ICAgIHNyY3MsCisJCUltcGxpY2l0czogZGVwcy5wcmVwcm9jZXNzZWQsCiAJCUFyZ3M6IG1hcFtzdHJpbmddc3RyaW5newogCQkJIm9wdGlvbmFsRmxhZ3MiOiBzdHJpbmdzLkpvaW4ob3B0aW9uYWxGbGFncywgIiAiKSwKLQkJCSJpbXBvcnRzIjogICAgICAgc3RyaW5ncy5Kb2luKHdyYXAoIi1JIiwgaW1wb3J0UGF0aHMsICIiKSwgIiAiKSwKKwkJCSJpbXBvcnRzIjogICAgICAgc3RyaW5ncy5Kb2luKHdyYXAoIi1JIiwgaW1wb3J0cywgIiIpLCAiICIpLAogCQkJIm91dERpciI6ICAgICAgICBhcGlEaXIuU3RyaW5nKCksCiAJCQkiaGFzaEZpbGUiOiAgICAgIGhhc2hGaWxlLlN0cmluZygpLAotCQkJImxhdGVzdFZlcnNpb24iOiBsYXRlc3RWZXJzaW9uLAorCQkJImxhdGVzdFZlcnNpb24iOiB2ZXJzaW9uRm9ySGFzaEdlbih2ZXJzaW9uKSwKIAkJfSwKIAl9KQotCXJldHVybiBhcGlEdW1we2FwaURpciwgYXBpRmlsZXMuUGF0aHMoKSwgYW5kcm9pZC5PcHRpb25hbFBhdGhGb3JQYXRoKGhhc2hGaWxlKX0KKwlyZXR1cm4gYXBpRHVtcHt2ZXJzaW9uLCBhcGlEaXIsIGFwaUZpbGVzLlBhdGhzKCksIGFuZHJvaWQuT3B0aW9uYWxQYXRoRm9yUGF0aChoYXNoRmlsZSl9CiB9CiAKIGZ1bmMgKG0gKmFpZGxBcGkpIG1ha2VBcGlEdW1wQXNWZXJzaW9uKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIGR1bXAgYXBpRHVtcCwgdmVyc2lvbiBzdHJpbmcsIGxhdGVzdFZlcnNpb25EdW1wICphcGlEdW1wKSBhbmRyb2lkLldyaXRhYmxlUGF0aCB7CkBAIC0xNTQsNDQgKzE1NSwyMyBAQAogCXRhcmdldERpciA6PSBmaWxlcGF0aC5Kb2luKG1vZHVsZURpciwgbS5hcGlEaXIoKSwgdmVyc2lvbikKIAlyYiA6PSBhbmRyb2lkLk5ld1J1bGVCdWlsZGVyKHBjdHgsIGN0eCkKIAorCXZhciBhY3Rpb25Xb3JkIHN0cmluZwogCWlmIGNyZWF0aW5nTmV3VmVyc2lvbiB7CisJCWFjdGlvbldvcmQgPSAiTWFraW5nIgogCQkvLyBXZSBhcmUgYXNrZWQgdG8gY3JlYXRlIGEgbmV3IHZlcnNpb24uIEJ1dCBiZWZvcmUgZG9pbmcgdGhhdCwgY2hlY2sgaWYgdGhlIGdpdmVuCiAJCS8vIGR1bXAgaXMgdGhlIHNhbWUgYXMgdGhlIGxhdGVzdCB2ZXJzaW9uLiBJZiBzbywgZG9uJ3QgY3JlYXRlIGEgbmV3IHZlcnNpb24sCi0JCS8vIG90aGVyd2lzZSB3ZSB3aWxsIGJlIHVubmVjZXNzYXJpbHkgY3JlYXRpbmcgbWFueSB2ZXJzaW9ucy4gYG5ld1ZlcnNpb25OZWVkZWRGaWxlYAotCQkvLyBpcyBjcmVhdGVkIHdoZW4gdGhlIGVxdWFsaXR5IGNoZWNrIGZhaWxzLgotCQluZXdWZXJzaW9uTmVlZGVkRmlsZSA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAidXBkYXRlYXBpXyIrdmVyc2lvbisiLm5lZWRlZCIpCi0JCXJiLkNvbW1hbmQoKS5UZXh0KCJybSAtZiAiICsgbmV3VmVyc2lvbk5lZWRlZEZpbGUuU3RyaW5nKCkpCi0KLQkJaWYgbGF0ZXN0VmVyc2lvbkR1bXAgIT0gbmlsIHsKLQkJCWVxdWFsaXR5Q2hlY2tDb21tYW5kIDo9IHJiLkNvbW1hbmQoKQotCQkJZXF1YWxpdHlDaGVja0NvbW1hbmQuQnVpbHRUb29sKCJhaWRsIikuCi0JCQkJRmxhZ1dpdGhBcmcoIi0tY2hlY2thcGk9IiwgImVxdWFsIikKLQkJCWlmIG0ucHJvcGVydGllcy5TdGFiaWxpdHkgIT0gbmlsIHsKLQkJCQllcXVhbGl0eUNoZWNrQ29tbWFuZC5GbGFnV2l0aEFyZygiLS1zdGFiaWxpdHkgIiwgKm0ucHJvcGVydGllcy5TdGFiaWxpdHkpCi0JCQl9Ci0JCQllcXVhbGl0eUNoZWNrQ29tbWFuZC4KLQkJCQlUZXh0KGxhdGVzdFZlcnNpb25EdW1wLmRpci5TdHJpbmcoKSkuSW1wbGljaXRzKGxhdGVzdFZlcnNpb25EdW1wLmZpbGVzKS4KLQkJCQlUZXh0KGR1bXAuZGlyLlN0cmluZygpKS5JbXBsaWNpdHMoZHVtcC5maWxlcykuCi0JCQkJVGV4dCgiJj4gL2Rldi9udWxsIikKLQkJCWVxdWFsaXR5Q2hlY2tDb21tYW5kLgotCQkJCVRleHQoInx8IHRvdWNoIikuCi0JCQkJVGV4dChuZXdWZXJzaW9uTmVlZGVkRmlsZS5TdHJpbmcoKSkKLQkJfSBlbHNlIHsKLQkJCS8vIElmIHRoZXJlIGlzIG5vIGxhdGVzdCB2ZXJzaW9uIChpLmUuIHdlIGFyZSBjcmVhdGluZyB0aGUgaW5pdGlhbCB2ZXJzaW9uKQotCQkJLy8gY3JlYXRlIHRoZSBuZXcgdmVyc2lvbiB1bmNvbmRpdGlvbmFsbHkKLQkJCXJiLkNvbW1hbmQoKS5UZXh0KCJ0b3VjaCIpLlRleHQobmV3VmVyc2lvbk5lZWRlZEZpbGUuU3RyaW5nKCkpCi0JCX0KLQorCQkvLyBvdGhlcndpc2Ugd2Ugd2lsbCBiZSB1bm5lY2Vzc2FyaWx5IGNyZWF0aW5nIG1hbnkgdmVyc2lvbnMuCiAJCS8vIENvcHkgdGhlIGdpdmVuIGR1bXAgdG8gdGhlIHRhcmdldCBkaXJlY3Rvcnkgb25seSB3aGVuIHRoZSBlcXVhbGl0eSBjaGVjayBmYWlsZWQKLQkJLy8gKGkuZS4gYG5ld1ZlcnNpb25OZWVkZWRGaWxlYCBleGlzdHMpLgorCQkvLyAoaS5lLiBgaGFzX2RldmVsb3BtZW50YCBmaWxlIGNvbnRhaW5zICIxIikuCiAJCXJiLkNvbW1hbmQoKS4KLQkJCVRleHQoImlmIFsgLWYgIiArIG5ld1ZlcnNpb25OZWVkZWRGaWxlLlN0cmluZygpICsgIiBdOyB0aGVuIikuCisJCQlUZXh0KCJpZiBbIFwiJChjYXQgIikuSW5wdXQobS5oYXNEZXZlbG9wbWVudCkuVGV4dCgiKVwiID0gXCIxXCIgXTsgdGhlbiIpLgorCQkJVGV4dCgibWtkaXIgLXAgIiArIHRhcmdldERpciArICIgJiYgIikuCiAJCQlUZXh0KCJjcCAtcmYgIiArIGR1bXAuZGlyLlN0cmluZygpICsgIi8uICIgKyB0YXJnZXREaXIpLkltcGxpY2l0cyhkdW1wLmZpbGVzKS4KIAkJCVRleHQoIjsgZmkiKQogCiAJCS8vIEFsc28gbW9kaWZ5IEFuZHJvaWQuYnAgZmlsZSB0byBhZGQgdGhlIG5ldyB2ZXJzaW9uIHRvIHRoZSAndmVyc2lvbnMnIHByb3BlcnR5LgogCQlyYi5Db21tYW5kKCkuCi0JCQlUZXh0KCJpZiBbIC1mICIgKyBuZXdWZXJzaW9uTmVlZGVkRmlsZS5TdHJpbmcoKSArICIgXTsgdGhlbiIpLgorCQkJVGV4dCgiaWYgWyBcIiQoY2F0ICIpLklucHV0KG0uaGFzRGV2ZWxvcG1lbnQpLlRleHQoIilcIiA9IFwiMVwiIF07IHRoZW4iKS4KIAkJCUJ1aWx0VG9vbCgiYnBtb2RpZnkiKS4KIAkJCVRleHQoIi13IC1tICIgKyBtLnByb3BlcnRpZXMuQmFzZU5hbWUpLgogCQkJVGV4dCgiLXBhcmFtZXRlciB2ZXJzaW9ucyAtYSAiICsgdmVyc2lvbikuCkBAIC0xOTksNiArMTc5LDcgQEAKIAkJCVRleHQoIjsgZmkiKQogCiAJfSBlbHNlIHsKKwkJYWN0aW9uV29yZCA9ICJVcGRhdGluZyIKIAkJLy8gV2UgYXJlIHVwZGF0aW5nIHRoZSBjdXJyZW50IHZlcnNpb24uIERvbid0IGNvcHkgLmhhc2ggdG8gdGhlIGN1cnJlbnQgZHVtcAogCQlyYi5Db21tYW5kKCkuVGV4dCgibWtkaXIgLXAgIiArIHRhcmdldERpcikKIAkJcmIuQ29tbWFuZCgpLlRleHQoInJtIC1yZiAiICsgdGFyZ2V0RGlyICsgIi8qIikKQEAgLTIwOCw3MyArMTg5LDcwIEBACiAJdGltZXN0YW1wRmlsZSA6PSBhbmRyb2lkLlBhdGhGb3JNb2R1bGVPdXQoY3R4LCAidXBkYXRlYXBpXyIrdmVyc2lvbisiLnRpbWVzdGFtcCIpCiAJcmIuQ29tbWFuZCgpLlRleHQoInRvdWNoIikuT3V0cHV0KHRpbWVzdGFtcEZpbGUpCiAKLQlyYi5CdWlsZCgiZHVtcF9haWRsX2FwaSIrbS5wcm9wZXJ0aWVzLkJhc2VOYW1lKyJfIit2ZXJzaW9uLAotCQkiTWFraW5nIEFJREwgQVBJIG9mICIrbS5wcm9wZXJ0aWVzLkJhc2VOYW1lKyIgYXMgdmVyc2lvbiAiK3ZlcnNpb24pCisJcmIuQnVpbGQoImR1bXBfYWlkbF9hcGlfIittLnByb3BlcnRpZXMuQmFzZU5hbWUrIl8iK3ZlcnNpb24sIGFjdGlvbldvcmQrIiBBSURMIEFQSSBkdW1wIHZlcnNpb24gIit2ZXJzaW9uKyIgZm9yICIrbS5wcm9wZXJ0aWVzLkJhc2VOYW1lKyIgKHNlZSAiK3RhcmdldERpcisiKSIpCiAJcmV0dXJuIHRpbWVzdGFtcEZpbGUKIH0KIAotdHlwZSBkZXBUYWcgc3RydWN0IHsKLQlibHVlcHJpbnQuQmFzZURlcGVuZGVuY3lUYWcKLQluYW1lIHN0cmluZwordHlwZSBkZXBzIHN0cnVjdCB7CisJcHJlcHJvY2Vzc2VkIGFuZHJvaWQuUGF0aHMKKwlpbXBsaWNpdHMgICAgYW5kcm9pZC5QYXRocworCWltcG9ydHMgICAgICBbXXN0cmluZwogfQogCi12YXIgKAotCWFwaURlcCAgICAgICA9IGRlcFRhZ3tuYW1lOiAiYXBpIn0KLQlpbnRlcmZhY2VEZXAgPSBkZXBUYWd7bmFtZTogImludGVyZmFjZSJ9Ci0KLQlpbXBvcnRBcGlEZXAgICAgICAgPSBkZXBUYWd7bmFtZTogImltcG9ydGVkLWFwaSJ9Ci0JaW1wb3J0SW50ZXJmYWNlRGVwID0gZGVwVGFne25hbWU6ICJpbXBvcnRlZC1pbnRlcmZhY2UifQotKQotCiAvLyBjYWxjdWxhdGVzIGltcG9ydCBmbGFncygtSSkgZnJvbSBkZXBzLgogLy8gV2hlbiB0aGUgdGFyZ2V0IGlzIFRvVCwgdXNlIFRvVCBvZiBpbXBvcnRlZCBpbnRlcmZhY2VzLiBJZiBub3QsIHdlIHVzZSAiY3VycmVudCIgc25hcHNob3Qgb2YKIC8vIGltcG9ydGVkIGludGVyZmFjZXMuCi1mdW5jIGdldEltcG9ydHNGcm9tRGVwcyhjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0LCB0YXJnZXRJc1RvVCBib29sKSAoaW1wb3J0UGF0aHMgW11zdHJpbmcsIGltcGxpY2l0cyBhbmRyb2lkLlBhdGhzKSB7CitmdW5jIGdldERlcHMoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgdmVyc2lvbmVkSW1wb3J0cyBtYXBbc3RyaW5nXXN0cmluZykgZGVwcyB7CisJdmFyIGRlcHMgZGVwcwogCWN0eC5WaXNpdERpcmVjdERlcHMoZnVuYyhkZXAgYW5kcm9pZC5Nb2R1bGUpIHsKLQkJc3dpdGNoIGN0eC5PdGhlck1vZHVsZURlcGVuZGVuY3lUYWcoZGVwKSB7Ci0JCWNhc2UgaW1wb3J0SW50ZXJmYWNlRGVwOgorCQlzd2l0Y2ggY3R4Lk90aGVyTW9kdWxlRGVwZW5kZW5jeVRhZyhkZXApLih0eXBlKSB7CisJCWNhc2UgaW1wb3J0SW50ZXJmYWNlRGVwVGFnOgogCQkJaWZhY2UgOj0gZGVwLigqYWlkbEludGVyZmFjZSkKLQkJCWlmIHByb3B0b29scy5Cb29sKGlmYWNlLnByb3BlcnRpZXMuVW5zdGFibGUpIHx8IHRhcmdldElzVG9UIHsKLQkJCQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgaWZhY2UucHJvcGVydGllcy5GdWxsX2ltcG9ydF9wYXRocy4uLikKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdXNlICJjdXJyZW50IiBzbmFwc2hvdCBmcm9tIHN0YWJsZSAiaW1wb3J0ZWQiIG1vZHVsZXMKLQkJCQljdXJyZW50RGlyIDo9IGZpbGVwYXRoLkpvaW4oY3R4Lk90aGVyTW9kdWxlRGlyKGRlcCksIGFpZGxBcGlEaXIsIGlmYWNlLkJhc2VNb2R1bGVOYW1lKCksIGN1cnJlbnRWZXJzaW9uKQotCQkJCWltcG9ydFBhdGhzID0gYXBwZW5kKGltcG9ydFBhdGhzLCBjdXJyZW50RGlyKQotCQkJCS8vIFRPRE8oYi8xODkyODgzNjkpIHRoaXMgc2hvdWxkIGJlIHRyYW5zaXRpdmUKLQkJCQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgaWZhY2UucHJvcGVydGllcy5JbmNsdWRlX2RpcnMuLi4pCisJCQlpZiB2ZXJzaW9uLCBvayA6PSB2ZXJzaW9uZWRJbXBvcnRzW2lmYWNlLkJhc2VNb2R1bGVOYW1lKCldOyBvayB7CisJCQkJaWYgaWZhY2UucHJlcHJvY2Vzc2VkW3ZlcnNpb25dID09IG5pbCB7CisJCQkJCWN0eC5Nb2R1bGVFcnJvcmYoImNhbid0IGltcG9ydCAldidzIHByZXByb2Nlc3NlZCh2ZXJzaW9uPSV2KSIsIGlmYWNlLkJhc2VNb2R1bGVOYW1lKCksIHZlcnNpb24pCisJCQkJfQorCQkJCWRlcHMucHJlcHJvY2Vzc2VkID0gYXBwZW5kKGRlcHMucHJlcHJvY2Vzc2VkLCBpZmFjZS5wcmVwcm9jZXNzZWRbdmVyc2lvbl0pCiAJCQl9Ci0JCWNhc2UgaW50ZXJmYWNlRGVwOgorCQljYXNlIGludGVyZmFjZURlcFRhZzoKIAkJCWlmYWNlIDo9IGRlcC4oKmFpZGxJbnRlcmZhY2UpCi0JCQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgaWZhY2UucHJvcGVydGllcy5JbmNsdWRlX2RpcnMuLi4pCi0JCWNhc2UgaW1wb3J0QXBpRGVwLCBhcGlEZXA6CisJCQlkZXBzLmltcG9ydHMgPSBhcHBlbmQoZGVwcy5pbXBvcnRzLCBpZmFjZS5wcm9wZXJ0aWVzLkluY2x1ZGVfZGlycy4uLikKKwkJY2FzZSBhcGlEZXBUYWc6CiAJCQlhcGkgOj0gZGVwLigqYWlkbEFwaSkKIAkJCS8vIGFkZCBpbXBvcnRlZCBtb2R1bGUncyBjaGVja2FwaVRpbWVzdGFtcHMgYXMgaW1wbGljaXRzIHRvIG1ha2Ugc3VyZSB0aGF0IGltcG9ydGVkIGFwaUR1bXAgaXMgdXAtdG8tZGF0ZQotCQkJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgYXBpLmNoZWNrQXBpVGltZXN0YW1wcy5QYXRocygpLi4uKQotCQkJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgYXBpLmNoZWNrSGFzaFRpbWVzdGFtcHMuUGF0aHMoKS4uLikKKwkJCWRlcHMuaW1wbGljaXRzID0gYXBwZW5kKGRlcHMuaW1wbGljaXRzLCBhcGkuY2hlY2tBcGlUaW1lc3RhbXBzLlBhdGhzKCkuLi4pCisJCQlkZXBzLmltcGxpY2l0cyA9IGFwcGVuZChkZXBzLmltcGxpY2l0cywgYXBpLmNoZWNrSGFzaFRpbWVzdGFtcHMuUGF0aHMoKS4uLikKIAkJfQogCX0pCi0JcmV0dXJuCisJcmV0dXJuIGRlcHMKIH0KIAogZnVuYyAobSAqYWlkbEFwaSkgY2hlY2tBcGkoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgb2xkRHVtcCwgbmV3RHVtcCBhcGlEdW1wLCBjaGVja0FwaUxldmVsIHN0cmluZywgbWVzc2FnZUZpbGUgYW5kcm9pZC5QYXRoKSBhbmRyb2lkLldyaXRhYmxlUGF0aCB7CiAJbmV3VmVyc2lvbiA6PSBuZXdEdW1wLmRpci5CYXNlKCkKIAl0aW1lc3RhbXBGaWxlIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJjaGVja2FwaV8iK25ld1ZlcnNpb24rIi50aW1lc3RhbXAiKQogCisJLy8gLS1jaGVja2FwaShvbGQsbmV3KSBzaG91bGQgdXNlIGltcG9ydHMgZm9yICJuZXciCisJZGVwcyA6PSBnZXREZXBzKGN0eCwgbS5nZXRJbXBvcnRzKGN0eCwgbmV3RHVtcC52ZXJzaW9uKSkKKwl2YXIgaW1wbGljaXRzIGFuZHJvaWQuUGF0aHMKKwlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBkZXBzLmltcGxpY2l0cy4uLikKKwlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBkZXBzLnByZXByb2Nlc3NlZC4uLikKKwlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBvbGREdW1wLmZpbGVzLi4uKQorCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIG5ld0R1bXAuZmlsZXMuLi4pCisJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgbWVzc2FnZUZpbGUpCisKIAl2YXIgb3B0aW9uYWxGbGFncyBbXXN0cmluZwogCWlmIG0ucHJvcGVydGllcy5TdGFiaWxpdHkgIT0gbmlsIHsKIAkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS1zdGFiaWxpdHkiLCAqbS5wcm9wZXJ0aWVzLlN0YWJpbGl0eSkKIAl9CisJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCB3cmFwKCItcCIsIGRlcHMucHJlcHJvY2Vzc2VkLlN0cmluZ3MoKSwgIiIpLi4uKQogCi0JdmFyIGltcGxpY2l0cyBhbmRyb2lkLlBhdGhzCi0JaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgb2xkRHVtcC5maWxlcy4uLikKLQlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBuZXdEdW1wLmZpbGVzLi4uKQotCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIG1lc3NhZ2VGaWxlKQogCWN0eC5CdWlsZChwY3R4LCBhbmRyb2lkLkJ1aWxkUGFyYW1zewogCQlSdWxlOiAgICAgIGFpZGxDaGVja0FwaVJ1bGUsCiAJCUltcGxpY2l0czogaW1wbGljaXRzLAogCQlPdXRwdXQ6ICAgIHRpbWVzdGFtcEZpbGUsCiAJCUFyZ3M6IG1hcFtzdHJpbmddc3RyaW5newogCQkJIm9wdGlvbmFsRmxhZ3MiOiBzdHJpbmdzLkpvaW4ob3B0aW9uYWxGbGFncywgIiAiKSwKKwkJCSJpbXBvcnRzIjogICAgICAgc3RyaW5ncy5Kb2luKHdyYXAoIi1JIiwgZGVwcy5pbXBvcnRzLCAiIiksICIgIiksCiAJCQkib2xkIjogICAgICAgICAgIG9sZER1bXAuZGlyLlN0cmluZygpLAogCQkJIm5ldyI6ICAgICAgICAgICBuZXdEdW1wLmRpci5TdHJpbmcoKSwKIAkJCSJtZXNzYWdlRmlsZSI6ICAgbWVzc2FnZUZpbGUuU3RyaW5nKCksCkBAIC0zMDQsMTAgKzI4Miw2IEBACiAJcmIuQ29tbWFuZCgpLlRleHQoInNlZCIpLkZsYWcoIiBzLyVzLyIgKyBtLnByb3BlcnRpZXMuQmFzZU5hbWUgKyAiL2cgIikuSW5wdXQobWVzc2FnZUZpbGUpLlRleHQoIiA+ICIpLk91dHB1dChmb3JtYXR0ZWRNZXNzYWdlRmlsZSkKIAlyYi5CdWlsZCgiZm9ybWF0X21lc3NhZ2VfIittLnByb3BlcnRpZXMuQmFzZU5hbWUsICIiKQogCi0JdmFyIGltcGxpY2l0cyBhbmRyb2lkLlBhdGhzCi0JaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgb2xkRHVtcC5maWxlcy4uLikKLQlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBuZXdEdW1wLmZpbGVzLi4uKQotCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIGZvcm1hdHRlZE1lc3NhZ2VGaWxlKQogCXJldHVybiBtLmNoZWNrQXBpKGN0eCwgb2xkRHVtcCwgbmV3RHVtcCwgImVxdWFsIiwgZm9ybWF0dGVkTWVzc2FnZUZpbGUpCiB9CiAKQEAgLTMxNiwxMyArMjkwLDYgQEAKIAl0aW1lc3RhbXBGaWxlIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJjaGVja2hhc2hfIit2ZXJzaW9uKyIudGltZXN0YW1wIikKIAltZXNzYWdlRmlsZSA6PSBhbmRyb2lkLlBhdGhGb3JTb3VyY2UoY3R4LCAic3lzdGVtL3Rvb2xzL2FpZGwvYnVpbGQvbWVzc2FnZV9jaGVja19pbnRlZ3JpdHkudHh0IikKIAotCWksIF8gOj0gc3RyY29udi5BdG9pKHZlcnNpb24pCi0JaWYgaSA9PSAxIHsKLQkJdmVyc2lvbiA9ICJsYXRlc3QtdmVyc2lvbiIKLQl9IGVsc2UgewotCQl2ZXJzaW9uID0gc3RyY29udi5JdG9hKGkgLSAxKQotCX0KLQogCXZhciBpbXBsaWNpdHMgYW5kcm9pZC5QYXRocwogCWltcGxpY2l0cyA9IGFwcGVuZChpbXBsaWNpdHMsIGR1bXAuZmlsZXMuLi4pCiAJaW1wbGljaXRzID0gYXBwZW5kKGltcGxpY2l0cywgZHVtcC5oYXNoRmlsZS5QYXRoKCkpCkBAIC0zMzMsNyArMzAwLDcgQEAKIAkJT3V0cHV0OiAgICB0aW1lc3RhbXBGaWxlLAogCQlBcmdzOiBtYXBbc3RyaW5nXXN0cmluZ3sKIAkJCSJhcGlEaXIiOiAgICAgIGR1bXAuZGlyLlN0cmluZygpLAotCQkJInZlcnNpb24iOiAgICAgdmVyc2lvbiwKKwkJCSJ2ZXJzaW9uIjogICAgIHZlcnNpb25Gb3JIYXNoR2VuKHZlcnNpb24pLAogCQkJImhhc2hGaWxlIjogICAgZHVtcC5oYXNoRmlsZS5QYXRoKCkuU3RyaW5nKCksCiAJCQkibWVzc2FnZUZpbGUiOiBtZXNzYWdlRmlsZS5TdHJpbmcoKSwKIAkJfSwKQEAgLTM0MSw2ICszMDgsMzEgQEAKIAlyZXR1cm4gdGltZXN0YW1wRmlsZQogfQogCitmdW5jIChtICphaWRsQXBpKSBjaGVja0ZvckRldmVsb3BtZW50KGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIGxhdGVzdFZlcnNpb25EdW1wICphcGlEdW1wLCB0b3REdW1wIGFwaUR1bXApIGFuZHJvaWQuV3JpdGFibGVQYXRoIHsKKwloYXNEZXZQYXRoIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZU91dChjdHgsICJoYXNfZGV2ZWxvcG1lbnQiKQorCXJiIDo9IGFuZHJvaWQuTmV3UnVsZUJ1aWxkZXIocGN0eCwgY3R4KQorCXJiLkNvbW1hbmQoKS5UZXh0KCJybSAtZiAiICsgaGFzRGV2UGF0aC5TdHJpbmcoKSkKKwlpZiBsYXRlc3RWZXJzaW9uRHVtcCAhPSBuaWwgeworCQloYXNEZXZDb21tYW5kIDo9IHJiLkNvbW1hbmQoKQorCQloYXNEZXZDb21tYW5kLkJ1aWx0VG9vbCgiYWlkbCIpLkZsYWdXaXRoQXJnKCItLWNoZWNrYXBpPSIsICJlcXVhbCIpCisJCWlmIG0ucHJvcGVydGllcy5TdGFiaWxpdHkgIT0gbmlsIHsKKwkJCWhhc0RldkNvbW1hbmQuRmxhZ1dpdGhBcmcoIi0tc3RhYmlsaXR5ICIsICptLnByb3BlcnRpZXMuU3RhYmlsaXR5KQorCQl9CisJCS8vIGNoZWNrYXBpKGxhdGVzdCwgdG90KSBzaG91bGQgdXNlIGltcG9ydHMgZm9yIG5leHRWZXJzaW9uKD10b3QpCisJCWRlcHMgOj0gZ2V0RGVwcyhjdHgsIG0uZ2V0SW1wb3J0cyhjdHgsIG0ubmV4dFZlcnNpb24oKSkpCisJCWhhc0RldkNvbW1hbmQuCisJCQlGbGFnRm9yRWFjaEFyZygiLUkiLCBkZXBzLmltcG9ydHMpLkltcGxpY2l0cyhkZXBzLmltcGxpY2l0cykuCisJCQlGbGFnRm9yRWFjaElucHV0KCItcCIsIGRlcHMucHJlcHJvY2Vzc2VkKS4KKwkJCVRleHQobGF0ZXN0VmVyc2lvbkR1bXAuZGlyLlN0cmluZygpKS5JbXBsaWNpdHMobGF0ZXN0VmVyc2lvbkR1bXAuZmlsZXMpLgorCQkJVGV4dCh0b3REdW1wLmRpci5TdHJpbmcoKSkuSW1wbGljaXRzKHRvdER1bXAuZmlsZXMpLgorCQkJVGV4dCgiMj4gL2Rldi9udWxsOyBlY2hvICQ/ID4iKS5PdXRwdXQoaGFzRGV2UGF0aCkKKwl9IGVsc2UgeworCQlyYi5Db21tYW5kKCkuVGV4dCgiZWNobyAxID4iKS5PdXRwdXQoaGFzRGV2UGF0aCkKKwl9CisJcmIuQnVpbGQoImNoZWNrX2Zvcl9kZXZlbG9wbWVudCIsICIiKQorCXJldHVybiBoYXNEZXZQYXRoCit9CisKIGZ1bmMgKG0gKmFpZGxBcGkpIEdlbmVyYXRlQW5kcm9pZEJ1aWxkQWN0aW9ucyhjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0KSB7CiAJLy8gQW4gQVBJIGR1bXAgaXMgY3JlYXRlZCBmcm9tIHNvdXJjZSBhbmQgaXQgaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgQVBJIGR1bXAgb2YgdGhlCiAJLy8gJ2N1cnJlbnQnICh5ZXQtdG8tYmUtZmluYWxpemVkKSB2ZXJzaW9uLiBCeSBjaGVja2luZyB0aGlzIHdlIGVuZm9yY2UgdGhhdCBhbnkgY2hhbmdlIGluCkBAIC0zNTEsNiArMzQzLDcgQEAKIAl2YXIgY3VycmVudEFwaUR1bXAgYXBpRHVtcAogCWlmIGN1cnJlbnRBcGlEaXIuVmFsaWQoKSB7CiAJCWN1cnJlbnRBcGlEdW1wID0gYXBpRHVtcHsKKwkJCXZlcnNpb246ICBuZXh0VmVyc2lvbihtLnByb3BlcnRpZXMuVmVyc2lvbnMpLAogCQkJZGlyOiAgICAgIGN1cnJlbnRBcGlEaXIuUGF0aCgpLAogCQkJZmlsZXM6ICAgIGN0eC5HbG9iKGZpbGVwYXRoLkpvaW4oY3VycmVudEFwaURpci5QYXRoKCkuU3RyaW5nKCksICIqKi8qLmFpZGwiKSwgbmlsKSwKIAkJCWhhc2hGaWxlOiBhbmRyb2lkLkV4aXN0ZW50UGF0aEZvclNvdXJjZShjdHgsIGN0eC5Nb2R1bGVEaXIoKSwgbS5hcGlEaXIoKSwgY3VycmVudFZlcnNpb24sICIuaGFzaCIpLApAQCAtMzc5LDExICszNzIsMjAgQEAKIAkJYXBpRGlyIDo9IGZpbGVwYXRoLkpvaW4oY3R4Lk1vZHVsZURpcigpLCBtLmFwaURpcigpLCB2ZXIpCiAJCWFwaURpclBhdGggOj0gYW5kcm9pZC5FeGlzdGVudFBhdGhGb3JTb3VyY2UoY3R4LCBhcGlEaXIpCiAJCWlmIGFwaURpclBhdGguVmFsaWQoKSB7Ci0JCQlkdW1wcyA9IGFwcGVuZChkdW1wcywgYXBpRHVtcHsKKwkJCWhhc2hGaWxlUGF0aCA6PSBmaWxlcGF0aC5Kb2luKGFwaURpciwgIi5oYXNoIikKKwkJCWR1bXAgOj0gYXBpRHVtcHsKKwkJCQl2ZXJzaW9uOiAgdmVyLAogCQkJCWRpcjogICAgICBhcGlEaXJQYXRoLlBhdGgoKSwKIAkJCQlmaWxlczogICAgY3R4Lkdsb2IoZmlsZXBhdGguSm9pbihhcGlEaXJQYXRoLlN0cmluZygpLCAiKiovKi5haWRsIiksIG5pbCksCi0JCQkJaGFzaEZpbGU6IGFuZHJvaWQuRXhpc3RlbnRQYXRoRm9yU291cmNlKGN0eCwgY3R4Lk1vZHVsZURpcigpLCBtLmFwaURpcigpLCB2ZXIsICIuaGFzaCIpLAotCQkJfSkKKwkJCQloYXNoRmlsZTogYW5kcm9pZC5FeGlzdGVudFBhdGhGb3JTb3VyY2UoY3R4LCBoYXNoRmlsZVBhdGgpLAorCQkJfQorCQkJaWYgIWR1bXAuaGFzaEZpbGUuVmFsaWQoKSB7CisJCQkJLy8gV2Ugc2hvdWxkIHNob3cgdGhlIHNvdXJjZSBwYXRoIG9mIGhhc2hfZ2VuIGJlY2F1c2UgYWlkbF9oYXNoX2dlbiBjYW5ub3QgYmUgYnVpbHQgZHVlIHRvIGJ1aWxkIGVycm9yLgorCQkJCWNtZCA6PSBmbXQuU3ByaW50ZihgKGNyb290ICYmIHN5c3RlbS90b29scy9haWRsL2J1aWxkL2hhc2hfZ2VuLnNoICVzICVzICVzKWAsIGFwaURpciwgdmVyc2lvbkZvckhhc2hHZW4odmVyKSwgaGFzaEZpbGVQYXRoKQorCQkJCWN0eC5Nb2R1bGVFcnJvcmYoIkEgZnJvemVuIGFpZGxfaW50ZXJmYWNlIG11c3QgaGF2ZSAnLmhhc2gnIGZpbGUsIGJ1dCAlcy1WJXMgZG9lc24ndCBoYXZlIGl0LiBVc2UgdGhlIGNvbW1hbmQgYmVsb3cgdG8gZ2VuZXJhdGUgaGFzaC5cbiVzXG4iLAorCQkJCQltLnByb3BlcnRpZXMuQmFzZU5hbWUsIHZlciwgY21kKQorCQkJfQorCQkJZHVtcHMgPSBhcHBlbmQoZHVtcHMsIGR1bXApCiAJCX0gZWxzZSBpZiBjdHguQ29uZmlnKCkuQWxsb3dNaXNzaW5nRGVwZW5kZW5jaWVzKCkgewogCQkJY3R4LkFkZE1pc3NpbmdEZXBlbmRlbmNpZXMoW11zdHJpbmd7YXBpRGlyfSkKIAkJfSBlbHNlIHsKQEAgLTQxMCw2ICs0MTIsOSBAQAogCQltLmNoZWNrQXBpVGltZXN0YW1wcyA9IGFwcGVuZChtLmNoZWNrQXBpVGltZXN0YW1wcywgY2hlY2tlZCkKIAl9CiAKKwkvLyBDaGVjayBmb3IgYWN0aXZlIGRldmVsb3BtZW50IG9uIHRoZSB1bmZyb3plbiB2ZXJzaW9uCisJbS5oYXNEZXZlbG9wbWVudCA9IG0uY2hlY2tGb3JEZXZlbG9wbWVudChjdHgsIGxhdGVzdFZlcnNpb25EdW1wLCB0b3RBcGlEdW1wKQorCiAJLy8gQVBJIGR1bXAgZnJvbSBzb3VyY2UgaXMgdXBkYXRlZCB0byB0aGUgJ2N1cnJlbnQnIHZlcnNpb24uIFRyaWdnZXJlZCBieSBgbSA8bmFtZT4tdXBkYXRlLWFwaWAKIAltLnVwZGF0ZUFwaVRpbWVzdGFtcCA9IG0ubWFrZUFwaUR1bXBBc1ZlcnNpb24oY3R4LCB0b3RBcGlEdW1wLCBjdXJyZW50VmVyc2lvbiwgbmlsKQogCkBAIC00MzQsNyArNDM5LDcgQEAKIH0KIAogZnVuYyAobSAqYWlkbEFwaSkgRGVwc011dGF0b3IoY3R4IGFuZHJvaWQuQm90dG9tVXBNdXRhdG9yQ29udGV4dCkgewotCWN0eC5BZGREZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgbmlsLCB3cmFwKCIiLCBtLnByb3BlcnRpZXMuSW1wb3J0c1dpdGhvdXRWZXJzaW9uLCBhaWRsSW50ZXJmYWNlU3VmZml4KS4uLikKKwljdHguQWRkUmV2ZXJzZURlcGVuZGVuY3koY3R4Lk1vZHVsZSgpLCBuaWwsIGFpZGxNZXRhZGF0YVNpbmdsZXRvbk5hbWUpCiB9CiAKIGZ1bmMgYWlkbEFwaUZhY3RvcnkoKSBhbmRyb2lkLk1vZHVsZSB7CkBAIC00NTAsMTcgKzQ1NSwyNiBAQAogCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxBcGlGYWN0b3J5LCAmbmFtZVByb3BlcnRpZXN7CiAJCU5hbWU6IHByb3B0b29scy5TdHJpbmdQdHIoYXBpTW9kdWxlKSwKIAl9LCAmYWlkbEFwaVByb3BlcnRpZXN7Ci0JCUJhc2VOYW1lOiAgICAgICAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKLQkJU3JjczogICAgICAgICAgICAgICAgICBzcmNzLAotCQlBaWRsUm9vdDogICAgICAgICAgICAgIGFpZGxSb290LAotCQlTdGFiaWxpdHk6ICAgICAgICAgICAgIGkucHJvcGVydGllcy5TdGFiaWxpdHksCi0JCUltcG9ydHNXaXRob3V0VmVyc2lvbjogY29uY2F0KGkucHJvcGVydGllcy5JbXBvcnRzV2l0aG91dFZlcnNpb24sIFtdc3RyaW5ne2kuTW9kdWxlQmFzZS5OYW1lKCl9KSwKLQkJVmVyc2lvbnM6ICAgICAgICAgICAgICBpLnByb3BlcnRpZXMuVmVyc2lvbnMsCi0JCUR1bXBhcGk6ICAgICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLkR1bXBhcGksCisJCUJhc2VOYW1lOiAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKKwkJU3JjczogICAgICBzcmNzLAorCQlBaWRsUm9vdDogIGFpZGxSb290LAorCQlTdGFiaWxpdHk6IGkucHJvcGVydGllcy5TdGFiaWxpdHksCisJCUltcG9ydHM6ICAgaS5wcm9wZXJ0aWVzLkltcG9ydHMsCisJCVZlcnNpb25zOiAgaS5wcm9wZXJ0aWVzLlZlcnNpb25zLAorCQlEdW1wYXBpOiAgIGkucHJvcGVydGllcy5EdW1wYXBpLAogCX0pCiAJcmV0dXJuIGFwaU1vZHVsZQogfQogCitmdW5jIHZlcnNpb25Gb3JIYXNoR2VuKHZlciBzdHJpbmcpIHN0cmluZyB7CisJLy8gYWlkbEhhc2hHZW4gdXNlcyB0aGUgdmVyc2lvbiBiZWZvcmUgY3VycmVudCB2ZXJzaW9uLiBJZiBpdCBoYXMgbmV2ZXIgYmVlbiBmcm96ZW4sIHJldHVybiAnbGF0ZXN0LXZlcnNpb24nLgorCXZlckludCwgXyA6PSBzdHJjb252LkF0b2kodmVyKQorCWlmIHZlckludCA+IDEgeworCQlyZXR1cm4gc3RyY29udi5JdG9hKHZlckludCAtIDEpCisJfQorCXJldHVybiAibGF0ZXN0LXZlcnNpb24iCit9CisKIGZ1bmMgaW5pdCgpIHsKIAlhbmRyb2lkLlJlZ2lzdGVyU2luZ2xldG9uVHlwZSgiYWlkbC1mcmVlemUtYXBpIiwgZnJlZXplQXBpU2luZ2xldG9uRmFjdG9yeSkKIH0KQEAgLTQ3OCw3ICs0OTIsMTYgQEAKIAkJCXJldHVybgogCQl9CiAJCWlmIG0sIG9rIDo9IG1vZHVsZS4oKmFpZGxBcGkpOyBvayB7Ci0JCQlmaWxlcyA9IGFwcGVuZChmaWxlcywgbS5mcmVlemVBcGlUaW1lc3RhbXApCisJCQlvd25lcnNUb0ZyZWV6ZSA6PSBzdHJpbmdzLkZpZWxkcyhjdHguQ29uZmlnKCkuR2V0ZW52KCJBSURMX0ZSRUVaRV9PV05FUlMiKSkKKwkJCXZhciBzaG91bGRCZUZyb3plbiBib29sCisJCQlpZiBsZW4ob3duZXJzVG9GcmVlemUpID4gMCB7CisJCQkJc2hvdWxkQmVGcm96ZW4gPSBhbmRyb2lkLkluTGlzdChtLk93bmVyKCksIG93bmVyc1RvRnJlZXplKQorCQkJfSBlbHNlIHsKKwkJCQlzaG91bGRCZUZyb3plbiA9IG0uT3duZXIoKSA9PSAiIgorCQkJfQorCQkJaWYgc2hvdWxkQmVGcm96ZW4geworCQkJCWZpbGVzID0gYXBwZW5kKGZpbGVzLCBtLmZyZWV6ZUFwaVRpbWVzdGFtcCkKKwkJCX0KIAkJfQogCX0pCiAJY3R4LlBob255KCJhaWRsLWZyZWV6ZS1hcGkiLCBmaWxlcy4uLikKZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfYXBpL3Rlc3QtcGllY2UtMi8xLy5oYXNoIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0yLzEvLmhhc2gKaW5kZXggNzA1ZmMzMS4uM2MzMmVkZiAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0yLzEvLmhhc2gKKysrIGIvYnVpbGQvYWlkbF9hcGkvdGVzdC1waWVjZS0yLzEvLmhhc2gKQEAgLTEgKzEsMiBAQAorYzU0NDkwMmFiOGExZDJlNzJhZTkzOTYwMzJiYTExM2U5Yjk2OThjNAogZmNkMzZkYjQ1MWNkYmVlYjA0OTgzM2ZkN2Y0OTlhOTg3YWNmMzkzMApkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF9nZW5fcnVsZS5nbyBiL2J1aWxkL2FpZGxfZ2VuX3J1bGUuZ28KaW5kZXggZjk0NDYxNy4uM2RkMGZkZSAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9nZW5fcnVsZS5nbworKysgYi9idWlsZC9haWRsX2dlbl9ydWxlLmdvCkBAIC02MywxOSArNjMsMjIgQEAKICkKIAogdHlwZSBhaWRsR2VuUHJvcGVydGllcyBzdHJ1Y3QgewotCVNyY3MgICAgICAgICAgICAgICAgICBbXXN0cmluZyBgYW5kcm9pZDoicGF0aCJgCi0JQWlkbFJvb3QgICAgICAgICAgICAgIHN0cmluZyAgIC8vIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgaW5wdXQgYWlkbCBmaWxlCi0JSXNUb1QgICAgICAgICAgICAgICAgIGJvb2wKLQlJbXBvcnRzV2l0aG91dFZlcnNpb24gW11zdHJpbmcKLQlTdGFiaWxpdHkgICAgICAgICAgICAgKnN0cmluZwotCUxhbmcgICAgICAgICAgICAgICAgICBzdHJpbmcgLy8gdGFyZ2V0IGxhbmd1YWdlIFtqYXZhfGNwcHxuZGt8cnVzdF0KLQlCYXNlTmFtZSAgICAgICAgICAgICAgc3RyaW5nCi0JR2VuTG9nICAgICAgICAgICAgICAgIGJvb2wKLQlWZXJzaW9uICAgICAgICAgICAgICAgc3RyaW5nCi0JR2VuVHJhY2UgICAgICAgICAgICAgIGJvb2wKLQlVbnN0YWJsZSAgICAgICAgICAgICAgKmJvb2wKLQlWaXNpYmlsaXR5ICAgICAgICAgICAgW11zdHJpbmcKLQlGbGFncyAgICAgICAgICAgICAgICAgW11zdHJpbmcKKwlTcmNzICAgICAgICAgICAgW11zdHJpbmcgYGFuZHJvaWQ6InBhdGgiYAorCUFpZGxSb290ICAgICAgICBzdHJpbmcgICAvLyBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIGlucHV0IGFpZGwgZmlsZQorCUltcG9ydHMgICAgICAgICBbXXN0cmluZworCVN0YWJpbGl0eSAgICAgICAqc3RyaW5nCisJTWluX3Nka192ZXJzaW9uICpzdHJpbmcKKwlQbGF0Zm9ybV9hcGlzICAgYm9vbAorCUxhbmcgICAgICAgICAgICBzdHJpbmcgLy8gdGFyZ2V0IGxhbmd1YWdlIFtqYXZhfGNwcHxuZGt8cnVzdF0KKwlCYXNlTmFtZSAgICAgICAgc3RyaW5nCisJR2VuTG9nICAgICAgICAgIGJvb2wKKwlWZXJzaW9uICAgICAgICAgc3RyaW5nCisJR2VuUnBjICAgICAgICAgIGJvb2wKKwlHZW5UcmFjZSAgICAgICAgYm9vbAorCVVuc3RhYmxlICAgICAgICAqYm9vbAorCU5vdEZyb3plbiAgICAgICBib29sCisJVmlzaWJpbGl0eSAgICAgIFtdc3RyaW5nCisJRmxhZ3MgICAgICAgICAgIFtdc3RyaW5nCiB9CiAKIHR5cGUgYWlkbEdlblJ1bGUgc3RydWN0IHsKQEAgLTgzLDEwICs4NiwxMSBAQAogCiAJcHJvcGVydGllcyBhaWRsR2VuUHJvcGVydGllcwogCisJZGVwcyAgICAgICAgICAgZGVwcwogCWltcGxpY2l0SW5wdXRzIGFuZHJvaWQuUGF0aHMKIAlpbXBvcnRGbGFncyAgICBzdHJpbmcKIAotCS8vIFRPRE8oYi8xNDk5NTIxMzEpOiBhbHdheXMgaGF2ZSBhIGhhc2ggZmlsZQorCS8vIEEgZnJvemVuIGFpZGxfaW50ZXJmYWNlIGFsd2F5cyBoYXZlIGEgaGFzaCBmaWxlCiAJaGFzaEZpbGUgYW5kcm9pZC5QYXRoCiAKIAlnZW5PdXREaXIgICAgIGFuZHJvaWQuTW9kdWxlR2VuUGF0aApAQCAtOTgsNiArMTAyLDE1IEBACiB2YXIgXyBhbmRyb2lkLlNvdXJjZUZpbGVQcm9kdWNlciA9ICgqYWlkbEdlblJ1bGUpKG5pbCkKIHZhciBfIGdlbnJ1bGUuU291cmNlRmlsZUdlbmVyYXRvciA9ICgqYWlkbEdlblJ1bGUpKG5pbCkKIAorZnVuYyAoZyAqYWlkbEdlblJ1bGUpIGFpZGxJbnRlcmZhY2UoY3R4IGFuZHJvaWQuQmFzZU1vZHVsZUNvbnRleHQpICphaWRsSW50ZXJmYWNlIHsKKwlyZXR1cm4gY3R4LkdldERpcmVjdERlcFdpdGhUYWcoZy5wcm9wZXJ0aWVzLkJhc2VOYW1lLCBpbnRlcmZhY2VEZXApLigqYWlkbEludGVyZmFjZSkKK30KKworZnVuYyAoZyAqYWlkbEdlblJ1bGUpIGdldEltcG9ydHMoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCkgbWFwW3N0cmluZ11zdHJpbmcgeworCWlmYWNlIDo9IGcuYWlkbEludGVyZmFjZShjdHgpCisJcmV0dXJuIGlmYWNlLmdldEltcG9ydHMoZy5wcm9wZXJ0aWVzLlZlcnNpb24pCit9CisKIGZ1bmMgKGcgKmFpZGxHZW5SdWxlKSBHZW5lcmF0ZUFuZHJvaWRCdWlsZEFjdGlvbnMoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCkgewogCXNyY3MsIGltcG9ydHMgOj0gZ2V0UGF0aHMoY3R4LCBnLnByb3BlcnRpZXMuU3JjcywgZy5wcm9wZXJ0aWVzLkFpZGxSb290KQogCkBAIC0xMDUsMTIgKzExOCwxNCBAQAogCQlyZXR1cm4KIAl9CiAKKwlnLmRlcHMgPSBnZXREZXBzKGN0eCwgZy5nZXRJbXBvcnRzKGN0eCkpCisKIAlnZW5EaXJUaW1lc3RhbXAgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlR2VuKGN0eCwgInRpbWVzdGFtcCIpIC8vICRvdXQvZ2VuL3RpbWVzdGFtcAogCWcuaW1wbGljaXRJbnB1dHMgPSBhcHBlbmQoZy5pbXBsaWNpdElucHV0cywgZ2VuRGlyVGltZXN0YW1wKQorCWcuaW1wbGljaXRJbnB1dHMgPSBhcHBlbmQoZy5pbXBsaWNpdElucHV0cywgZy5kZXBzLmltcGxpY2l0cy4uLikKKwlnLmltcGxpY2l0SW5wdXRzID0gYXBwZW5kKGcuaW1wbGljaXRJbnB1dHMsIGcuZGVwcy5wcmVwcm9jZXNzZWQuLi4pCiAKLQlpbXBvcnRQYXRocywgaW1wbGljaXRzIDo9IGdldEltcG9ydHNGcm9tRGVwcyhjdHgsIGcucHJvcGVydGllcy5Jc1RvVCkKLQlpbXBvcnRzID0gYXBwZW5kKGltcG9ydHMsIGltcG9ydFBhdGhzLi4uKQotCisJaW1wb3J0cyA9IGFwcGVuZChpbXBvcnRzLCBnLmRlcHMuaW1wb3J0cy4uLikKIAlnLmltcG9ydEZsYWdzID0gc3RyaW5ncy5Kb2luKHdyYXAoIi1JIiwgaW1wb3J0cywgIiIpLCAiICIpCiAKIAlnLmdlbk91dERpciA9IGFuZHJvaWQuUGF0aEZvck1vZHVsZUdlbihjdHgpCkBAIC0xMjMsMTAgKzEzOCw5IEBACiAKIAkvLyBUaGlzIGlzIHRvIGNsZWFuIGdlbk91dERpciBiZWZvcmUgZ2VuZXJhdGluZyBhbnkgZmlsZQogCWN0eC5CdWlsZChwY3R4LCBhbmRyb2lkLkJ1aWxkUGFyYW1zewotCQlSdWxlOiAgICAgIGFpZGxEaXJQcmVwYXJlUnVsZSwKLQkJSW1wbGljaXRzOiBpbXBsaWNpdHMsCi0JCUlucHV0czogICAgc3JjcywKLQkJT3V0cHV0OiAgICBnZW5EaXJUaW1lc3RhbXAsCisJCVJ1bGU6ICAgYWlkbERpclByZXBhcmVSdWxlLAorCQlJbnB1dHM6IHNyY3MsCisJCU91dHB1dDogZ2VuRGlyVGltZXN0YW1wLAogCQlBcmdzOiBtYXBbc3RyaW5nXXN0cmluZ3sKIAkJCSJvdXREaXIiOiBnLmdlbk91dERpci5TdHJpbmcoKSwKIAkJfSwKQEAgLTE0MSw3ICsxNTUsOCBAQAogfQogCiBmdW5jIChnICphaWRsR2VuUnVsZSkgZ2VuZXJhdGVCdWlsZEFjdGlvbnNGb3JTaW5nbGVBaWRsKGN0eCBhbmRyb2lkLk1vZHVsZUNvbnRleHQsIHNyYyBhbmRyb2lkLlBhdGgpIChhbmRyb2lkLldyaXRhYmxlUGF0aCwgYW5kcm9pZC5QYXRocykgewotCWJhc2VEaXIgOj0gZ2V0QmFzZURpcihjdHgsIHNyYywgYW5kcm9pZC5QYXRoRm9yTW9kdWxlU3JjKGN0eCwgZy5wcm9wZXJ0aWVzLkFpZGxSb290KSkKKwlyZWxQYXRoIDo9IHNyYy5SZWwoKQorCWJhc2VEaXIgOj0gc3RyaW5ncy5UcmltU3VmZml4KHN0cmluZ3MuVHJpbVN1ZmZpeChzcmMuU3RyaW5nKCksIHJlbFBhdGgpLCAiLyIpCiAKIAl2YXIgZXh0IHN0cmluZwogCWlmIGcucHJvcGVydGllcy5MYW5nID09IGxhbmdKYXZhIHsKQEAgLTE1MSw3ICsxNjYsNiBAQAogCX0gZWxzZSB7CiAJCWV4dCA9ICJjcHAiCiAJfQotCXJlbFBhdGgsIF8gOj0gZmlsZXBhdGguUmVsKGJhc2VEaXIsIHNyYy5TdHJpbmcoKSkKIAlvdXRGaWxlIDo9IGFuZHJvaWQuUGF0aEZvck1vZHVsZUdlbihjdHgsIHBhdGh0b29scy5SZXBsYWNlRXh0ZW5zaW9uKHJlbFBhdGgsIGV4dCkpCiAJaW1wbGljaXRzIDo9IGcuaW1wbGljaXRJbnB1dHMKIApAQCAtMTYwLDEwICsxNzQsMTAgQEAKIAkJb3B0aW9uYWxGbGFncyA9IGFwcGVuZChvcHRpb25hbEZsYWdzLCAiLS12ZXJzaW9uICIrZy5wcm9wZXJ0aWVzLlZlcnNpb24pCiAKIAkJaGFzaCA6PSAibm90ZnJvemVuIgotCQlpZiAhc3RyaW5ncy5IYXNQcmVmaXgoYmFzZURpciwgY3R4LkNvbmZpZygpLkJ1aWxkRGlyKCkpIHsKKwkJaWYgIXN0cmluZ3MuSGFzUHJlZml4KGJhc2VEaXIsIGN0eC5Db25maWcoKS5Tb29uZ091dERpcigpKSB7CiAJCQloYXNoRmlsZSA6PSBhbmRyb2lkLkV4aXN0ZW50UGF0aEZvclNvdXJjZShjdHgsIGJhc2VEaXIsICIuaGFzaCIpCiAJCQlpZiBoYXNoRmlsZS5WYWxpZCgpIHsKLQkJCQloYXNoID0gIiQkKHJlYWQgLXIgPCIgKyBoYXNoRmlsZS5QYXRoKCkuU3RyaW5nKCkgKyAiIGhhc2ggZXh0cmE7IHByaW50ZiAnJXMnIFwiJCRoYXNoXCIpIgorCQkJCWhhc2ggPSAiJCQodGFpbCAtMSAnIiArIGhhc2hGaWxlLlBhdGgoKS5TdHJpbmcoKSArICInKSIKIAkJCQlpbXBsaWNpdHMgPSBhcHBlbmQoaW1wbGljaXRzLCBoYXNoRmlsZS5QYXRoKCkpCiAKIAkJCQlnLmhhc2hGaWxlID0gaGFzaEZpbGUuUGF0aCgpCkBAIC0xNzEsMTIgKzE4NSwyMiBAQAogCQl9CiAJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi0taGFzaCAiK2hhc2gpCiAJfQorCWlmIGcucHJvcGVydGllcy5HZW5ScGMgeworCQlvcHRpb25hbEZsYWdzID0gYXBwZW5kKG9wdGlvbmFsRmxhZ3MsICItLXJwYyIpCisJfQogCWlmIGcucHJvcGVydGllcy5HZW5UcmFjZSB7CiAJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi10IikKIAl9CiAJaWYgZy5wcm9wZXJ0aWVzLlN0YWJpbGl0eSAhPSBuaWwgewogCQlvcHRpb25hbEZsYWdzID0gYXBwZW5kKG9wdGlvbmFsRmxhZ3MsICItLXN0YWJpbGl0eSIsICpnLnByb3BlcnRpZXMuU3RhYmlsaXR5KQogCX0KKwlpZiBnLnByb3BlcnRpZXMuUGxhdGZvcm1fYXBpcyB7CisJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi0tbWluX3Nka192ZXJzaW9uIHBsYXRmb3JtX2FwaXMiKQorCX0gZWxzZSB7CisJCW1pblNka1ZlciA6PSBwcm9wdG9vbHMuU3RyaW5nRGVmYXVsdChnLnByb3BlcnRpZXMuTWluX3Nka192ZXJzaW9uLCAiY3VycmVudCIpCisJCW9wdGlvbmFsRmxhZ3MgPSBhcHBlbmQob3B0aW9uYWxGbGFncywgIi0tbWluX3Nka192ZXJzaW9uICIrbWluU2RrVmVyKQorCX0KKwlvcHRpb25hbEZsYWdzID0gYXBwZW5kKG9wdGlvbmFsRmxhZ3MsIHdyYXAoIi1wIiwgZy5kZXBzLnByZXByb2Nlc3NlZC5TdHJpbmdzKCksICIiKS4uLikKIAogCXZhciBoZWFkZXJzIGFuZHJvaWQuV3JpdGFibGVQYXRocwogCWlmIGcucHJvcGVydGllcy5MYW5nID09IGxhbmdKYXZhIHsKQEAgLTI3MiwxNyArMjk2LDYgQEAKIH0KIAogZnVuYyAoZyAqYWlkbEdlblJ1bGUpIERlcHNNdXRhdG9yKGN0eCBhbmRyb2lkLkJvdHRvbVVwTXV0YXRvckNvbnRleHQpIHsKLQkvLyBvcmlnaW5hbCBpbnRlcmZhY2UKLQljdHguQWRkRGVwZW5kZW5jeShjdHguTW9kdWxlKCksIGludGVyZmFjZURlcCwgZy5wcm9wZXJ0aWVzLkJhc2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCi0KLQlpZiAhcHJvcHRvb2xzLkJvb2woZy5wcm9wZXJ0aWVzLlVuc3RhYmxlKSB7Ci0JCS8vIGZvciBjaGVja2FwaSB0aW1lc3RhbXBzCi0JCWN0eC5BZGREZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgYXBpRGVwLCBnLnByb3BlcnRpZXMuQmFzZU5hbWUrYWlkbEFwaVN1ZmZpeCkKLQl9Ci0KLQkvLyBpbXBvcnRlZCBpbnRlcmZhY2VzCi0JY3R4LkFkZERlcGVuZGVuY3koY3R4Lk1vZHVsZSgpLCBpbXBvcnRJbnRlcmZhY2VEZXAsIHdyYXAoIiIsIGcucHJvcGVydGllcy5JbXBvcnRzV2l0aG91dFZlcnNpb24sIGFpZGxJbnRlcmZhY2VTdWZmaXgpLi4uKQotCiAJY3R4LkFkZFJldmVyc2VEZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgbmlsLCBhaWRsTWV0YWRhdGFTaW5nbGV0b25OYW1lKQogfQogCmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2ludGVyZmFjZS5nbyBiL2J1aWxkL2FpZGxfaW50ZXJmYWNlLmdvCmluZGV4IDI1MWQwZDYuLjhkMjc4MjYgMTAwNjQ0Ci0tLSBhL2J1aWxkL2FpZGxfaW50ZXJmYWNlLmdvCisrKyBiL2J1aWxkL2FpZGxfaW50ZXJmYWNlLmdvCkBAIC0yNyw4ICsyNyw4IEBACiAJInNvcnQiCiAJInN0cmNvbnYiCiAJInN0cmluZ3MiCi0JInN5bmMiCiAKKwkiZ2l0aHViLmNvbS9nb29nbGUvYmx1ZXByaW50IgogCSJnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQvcHJvcHRvb2xzIgogKQogCkBAIC00MCw4ICs0MCwxMCBAQAogCWxhbmdDcHAgICAgICAgICAgICAgICAgICAgPSAiY3BwIgogCWxhbmdKYXZhICAgICAgICAgICAgICAgICAgPSAiamF2YSIKIAlsYW5nTmRrICAgICAgICAgICAgICAgICAgID0gIm5kayIKLQlsYW5nTmRrUGxhdGZvcm0gICAgICAgICAgID0gIm5ka19wbGF0Zm9ybSIKIAlsYW5nUnVzdCAgICAgICAgICAgICAgICAgID0gInJ1c3QiCisJLy8gVE9ETyhiLzE2MTQ1NjE5OCkgcmVtb3ZlIHRoZSBOREsgcGxhdGZvcm0gYmFja2VuZCBhcyB0aGUgJ3BsYXRmb3JtJyB2YXJpYW50IG9mIHRoZSBOREsKKwkvLyBiYWNrZW5kIHNlcnZlcyB0aGUgc2FtZSBwdXJwb3NlLgorCWxhbmdOZGtQbGF0Zm9ybSA9ICJuZGtfcGxhdGZvcm0iCiAKIAljdXJyZW50VmVyc2lvbiA9ICJjdXJyZW50IgogKQpAQCAtNTMsMTI4ICs1NSwxMTMgQEAKIGZ1bmMgaW5pdCgpIHsKIAlwY3R4LkltcG9ydCgiYW5kcm9pZC9zb29uZy9hbmRyb2lkIikKIAlwY3R4Lkhvc3RCaW5Ub29sVmFyaWFibGUoImFpZGxDbWQiLCAiYWlkbCIpCisJcGN0eC5Ib3N0QmluVG9vbFZhcmlhYmxlKCJhaWRsSGFzaEdlbiIsICJhaWRsX2hhc2hfZ2VuIikKIAlwY3R4LlNvdXJjZVBhdGhWYXJpYWJsZSgiYWlkbFRvSm5pQ21kIiwgInN5c3RlbS90b29scy9haWRsL2J1aWxkL2FpZGxfdG9fam5pLnB5IikKIAlwY3R4LlNvdXJjZVBhdGhWYXJpYWJsZSgiYWlkbFJ1c3RHbHVlQ21kIiwgInN5c3RlbS90b29scy9haWRsL2J1aWxkL2FpZGxfcnVzdF9nbHVlLnB5IikKIAlhbmRyb2lkLlJlZ2lzdGVyTW9kdWxlVHlwZSgiYWlkbF9pbnRlcmZhY2UiLCBhaWRsSW50ZXJmYWNlRmFjdG9yeSkKLQlhbmRyb2lkLlByZUFyY2hNdXRhdG9ycyhyZWdpc3RlclByZURlcHNNdXRhdG9ycykKLQlhbmRyb2lkLlByZUFyY2hCcDJCdWlsZE11dGF0b3JzKHJlZ2lzdGVyUHJlRGVwc011dGF0b3JzKQotCWFuZHJvaWQuUG9zdERlcHNNdXRhdG9ycyhmdW5jKGN0eCBhbmRyb2lkLlJlZ2lzdGVyTXV0YXRvcnNDb250ZXh0KSB7Ci0JCWN0eC5Cb3R0b21VcCgiY2hlY2tVbnN0YWJsZU1vZHVsZSIsIGNoZWNrVW5zdGFibGVNb2R1bGVNdXRhdG9yKS5QYXJhbGxlbCgpCi0JCWN0eC5Cb3R0b21VcCgicmVjb3JkVmVyc2lvbnMiLCByZWNvcmRWZXJzaW9ucykuUGFyYWxsZWwoKQotCQljdHguQm90dG9tVXAoImNoZWNrRHVwbGljYXRlZFZlcnNpb25zIiwgY2hlY2tEdXBsaWNhdGVkVmVyc2lvbnMpLlBhcmFsbGVsKCkKLQl9KQorCWFuZHJvaWQuUHJlQXJjaE11dGF0b3JzKHJlZ2lzdGVyUHJlQXJjaE11dGF0b3JzKQorCWFuZHJvaWQuUHJlQXJjaEJwMkJ1aWxkTXV0YXRvcnMocmVnaXN0ZXJQcmVBcmNoTXV0YXRvcnMpCisJYW5kcm9pZC5Qb3N0RGVwc011dGF0b3JzKHJlZ2lzdGVyUG9zdERlcHNNdXRhdG9ycykKIH0KIAotZnVuYyByZWdpc3RlclByZURlcHNNdXRhdG9ycyhjdHggYW5kcm9pZC5SZWdpc3Rlck11dGF0b3JzQ29udGV4dCkgeworZnVuYyByZWdpc3RlclByZUFyY2hNdXRhdG9ycyhjdHggYW5kcm9pZC5SZWdpc3Rlck11dGF0b3JzQ29udGV4dCkgeworCWN0eC5Cb3R0b21VcCgiYWRkSW50ZXJmYWNlRGVwcyIsIGFkZEludGVyZmFjZURlcHMpLlBhcmFsbGVsKCkKIAljdHguQm90dG9tVXAoImNoZWNrSW1wb3J0cyIsIGNoZWNrSW1wb3J0cykuUGFyYWxsZWwoKQogCWN0eC5Ub3BEb3duKCJjcmVhdGVBaWRsSW50ZXJmYWNlIiwgY3JlYXRlQWlkbEludGVyZmFjZU11dGF0b3IpLlBhcmFsbGVsKCkKIH0KIAorZnVuYyByZWdpc3RlclBvc3REZXBzTXV0YXRvcnMoY3R4IGFuZHJvaWQuUmVnaXN0ZXJNdXRhdG9yc0NvbnRleHQpIHsKKwljdHguQm90dG9tVXAoImNoZWNrQWlkbEdlbmVyYXRlZE1vZHVsZXMiLCBjaGVja0FpZGxHZW5lcmF0ZWRNb2R1bGVzKS5QYXJhbGxlbCgpCit9CisKIGZ1bmMgY3JlYXRlQWlkbEludGVyZmFjZU11dGF0b3IobWN0eCBhbmRyb2lkLlRvcERvd25NdXRhdG9yQ29udGV4dCkgewogCWlmIGcsIG9rIDo9IG1jdHguTW9kdWxlKCkuKCphaWRsSW1wbGVtZW50YXRpb25HZW5lcmF0b3IpOyBvayB7CiAJCWcuR2VuZXJhdGVJbXBsZW1lbnRhdGlvbihtY3R4KQogCX0KIH0KIAotZnVuYyBjaGVja1Vuc3RhYmxlTW9kdWxlTXV0YXRvcihtY3R4IGFuZHJvaWQuQm90dG9tVXBNdXRhdG9yQ29udGV4dCkgewotCS8vIElmIGl0IGlzIGFuIGFpZGwgaW50ZXJmYWNlLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0cyBkZXBlbmRlbmNpZXMuCi0JaWYgaXNBaWRsTW9kdWxlKG1jdHguTW9kdWxlTmFtZSgpLCBtY3R4LkNvbmZpZygpKSB7Ci0JCXJldHVybgotCX0KLQltY3R4LlZpc2l0RGlyZWN0RGVwc0lmKGZ1bmMobSBhbmRyb2lkLk1vZHVsZSkgYm9vbCB7Ci0JCXJldHVybiBhbmRyb2lkLkluTGlzdChtLk5hbWUoKSwgKnVuc3RhYmxlTW9kdWxlcyhtY3R4LkNvbmZpZygpKSkKLQl9LCBmdW5jKG0gYW5kcm9pZC5Nb2R1bGUpIHsKLQkJaWYgbWN0eC5Nb2R1bGVOYW1lKCkgPT0gbS5OYW1lKCkgewotCQkJcmV0dXJuCi0JCX0KLQkJLy8gVE9ETyhiLzE1NDA2NjY4Nik6IFJlcGxhY2UgaXQgd2l0aCBhIGNvbW1vbiBtZXRob2QgaW5zdGVhZCBvZiBsaXN0aW5nIHVwIG1vZHVsZSB0eXBlcy4KLQkJLy8gVGVzdCBsaWJyYXJpZXMgYXJlIGV4ZW1wdGVkLgotCQlpZiBhbmRyb2lkLkluTGlzdChtY3R4Lk1vZHVsZVR5cGUoKSwgW11zdHJpbmd7ImNjX3Rlc3RfbGlicmFyeSIsICJhbmRyb2lkX3Rlc3QiLCAiY2NfYmVuY2htYXJrIiwgImNjX3Rlc3QifSkgewotCQkJcmV0dXJuCi0JCX0KKy8vIEEgbWFya2VyIHN0cnVjdCBmb3IgQUlETC1nZW5lcmF0ZWQgbGlicmFyeSBtb2R1bGVzCit0eXBlIEFpZGxHZW5lcmF0ZWRNb2R1bGVQcm9wZXJ0aWVzIHN0cnVjdHt9CiAKLQkJbWN0eC5Nb2R1bGVFcnJvcmYobS5OYW1lKCkgKyAiIGlzIGRpc2FsbG93ZWQgaW4gcmVsZWFzZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgdW5zdGFibGUsIGFuZCBpdHMgXCJvd25lclwiIHByb3BlcnR5IGlzIG1pc3NpbmcuIikKLQl9KQorZnVuYyB3cmFwTGlicmFyeUZhY3RvcnkoZmFjdG9yeSBmdW5jKCkgYW5kcm9pZC5Nb2R1bGUpIGZ1bmMoKSBhbmRyb2lkLk1vZHVsZSB7CisJcmV0dXJuIGZ1bmMoKSBhbmRyb2lkLk1vZHVsZSB7CisJCW0gOj0gZmFjdG9yeSgpCisJCS8vIHB1dCBhIG1hcmtlciBzdHJ1Y3QgZm9yIEFJREwtZ2VuZXJhdGVkIG1vZHVsZXMKKwkJbS5BZGRQcm9wZXJ0aWVzKCZBaWRsR2VuZXJhdGVkTW9kdWxlUHJvcGVydGllc3t9KQorCQlyZXR1cm4gbQorCX0KIH0KIAotZnVuYyBpc0FpZGxNb2R1bGUobW9kdWxlTmFtZSBzdHJpbmcsIGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgYm9vbCB7Ci0JZm9yIF8sIGkgOj0gcmFuZ2UgKmFpZGxJbnRlcmZhY2VzKGNvbmZpZykgewotCQlpZiBhbmRyb2lkLkluTGlzdChtb2R1bGVOYW1lLCBpLmludGVybmFsTW9kdWxlTmFtZXMpIHsKK2Z1bmMgaXNBaWRsR2VuZXJhdGVkTW9kdWxlKG1vZHVsZSBhbmRyb2lkLk1vZHVsZSkgYm9vbCB7CisJZm9yIF8sIHByb3BzIDo9IHJhbmdlIG1vZHVsZS5HZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBjaGVjayBpZiB0aGVyZSdzIGEgbWFya2VyIHN0cnVjdAorCQlpZiBfLCBvayA6PSBwcm9wcy4oKkFpZGxHZW5lcmF0ZWRNb2R1bGVQcm9wZXJ0aWVzKTsgb2sgewogCQkJcmV0dXJuIHRydWUKIAkJfQogCX0KIAlyZXR1cm4gZmFsc2UKIH0KIAotZnVuYyByZWNvcmRWZXJzaW9ucyhtY3R4IGFuZHJvaWQuQm90dG9tVXBNdXRhdG9yQ29udGV4dCkgewotCXN3aXRjaCBtY3R4Lk1vZHVsZSgpLih0eXBlKSB7Ci0JY2FzZSAqamF2YS5MaWJyYXJ5OgotCWNhc2UgKmNjLk1vZHVsZToKLQljYXNlICpydXN0Lk1vZHVsZToKLQljYXNlICphaWRsR2VuUnVsZToKLQlkZWZhdWx0OgotCQlyZXR1cm4KLQl9Ci0KLQlpc0FpZGxNb2R1bGUgOj0gaXNBaWRsTW9kdWxlKG1jdHguTW9kdWxlTmFtZSgpLCBtY3R4LkNvbmZpZygpKQotCi0JLy8gRmlyc3QsIGdhdGhlciBhbGwgdGhlIEFJREwgaW50ZXJmYWNlcyBtb2R1bGVzIHRoYXQgYXJlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKLQkvLyBkZXBlbmRlZCBvbiBieSB0aGlzIG1vZHVsZQotCW15QWlkbERlcHMgOj0gbWFrZShtYXBbRGVwSW5mb11ib29sKQotCW1jdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7Ci0JCXN3aXRjaCBkZXAuKHR5cGUpIHsKLQkJY2FzZSAqamF2YS5MaWJyYXJ5OgotCQljYXNlICpjYy5Nb2R1bGU6Ci0JCWNhc2UgKnJ1c3QuTW9kdWxlOgotCQljYXNlICphaWRsR2VuUnVsZToKLQkJCS8vIERlcGVuZGVuY2llcyB0byB0aGUgc291cmNlIG1vZHVsZSBpcyB0cmFja2VkIG9ubHkgd2hlbiBpdCdzIGZyb20gYSBjbGllbnQKLQkJCS8vIG1vZHVsZSwgaS5lLiBub3QgZnJvbSBhbiBBSURMLWdlbmVyYXRlZCBzdHViIGxpYnJhcnkKLQkJCWlmIGlzQWlkbE1vZHVsZSB7Ci0JCQkJcmV0dXJuCi0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4KLQkJfQotCQlkZXBOYW1lIDo9IG1jdHguT3RoZXJNb2R1bGVOYW1lKGRlcCkKLQkJaXNTb3VyY2UgOj0gc3RyaW5ncy5IYXNTdWZmaXgoZGVwTmFtZSwgIi1zb3VyY2UiKQotCQlkZXBOYW1lID0gc3RyaW5ncy5UcmltU3VmZml4KGRlcE5hbWUsICItc291cmNlIikKLQkJLy8gSWYgdGhpcyBtb2R1bGUgZGVwZW5kcyBvbiBvbmUgb2YgdGhlIGFpZGwgaW50ZXJmYWNlIG1vZHVsZSwgcmVjb3JkIGl0Ci0JCWZvciBfLCBpIDo9IHJhbmdlICphaWRsSW50ZXJmYWNlcyhtY3R4LkNvbmZpZygpKSB7Ci0JCQlpZiBhbmRyb2lkLkluTGlzdChkZXBOYW1lLCBpLmludGVybmFsTW9kdWxlTmFtZXMpIHsKLQkJCQlpZmFjZU5hbWUgOj0gaS5Nb2R1bGVCYXNlLk5hbWUoKQotCQkJCXZlckxhbmcgOj0gZGVwTmFtZVtsZW4oaWZhY2VOYW1lKTpdCi0JCQkJbXlBaWRsRGVwc1tEZXBJbmZve2lmYWNlTmFtZSwgdmVyTGFuZywgaXNTb3VyY2V9XSA9IHRydWUKLQkJCQlicmVhawotCQkJfQotCQl9Ci0JCS8vIElmIGRlcCBpcyBpbiBhaWRsRGVwcywgdGhhdCBtZWFucyBkZXAgaGFzIGRpcmVjdCBvciBpbmRpcmVjdCBkZXBlbmRlbmNpZXMgdG8gQUlETCBpbnRlcmZhY2VzCi0JCS8vIFRoYXQgYmVjb21lcyB0aGlzIG1vZHVsZSdzIGFpZGxEZXBzIGFzIHdlbGwKLQkJYWlkbERlcHNNdXRleC5STG9jaygpCi0JCWlmIGRlcHNPZkRlcCwgb2sgOj0gYWlkbERlcHMobWN0eC5Db25maWcoKSlbZGVwXTsgb2sgewotCQkJZm9yIF8sIGQgOj0gcmFuZ2UgZGVwc09mRGVwIHsKLQkJCQlteUFpZGxEZXBzW2RdID0gdHJ1ZQotCQkJfQotCQl9Ci0JCWFpZGxEZXBzTXV0ZXguUlVubG9jaygpCi0JfSkKLQotCWlmIGxlbihteUFpZGxEZXBzKSA9PSAwIHsKLQkJLy8gVGhpcyBzaG91bGQgYmUgdXN1YWwgY2FzZS4KLQkJcmV0dXJuCi0JfQotCi0JLy8gVGhlbiwgcmVjb3JkIHRoZSBhaWRsIGRlcHMgb2YgdGhpcyBtb2R1bGUgdG8gdGhlIGdsb2JhbCBtYXAgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieQotCS8vIG5leHQgcnVucyBvZiB0aGlzIG11dGF0b3IgZm9yIHRoZSBtb2R1bGVzIHRoYXQgZGVwZW5kIG9uIHRoaXMgbW9kdWxlLgotCXZhciBsaXN0IFtdRGVwSW5mbwotCWZvciBkIDo9IHJhbmdlIG15QWlkbERlcHMgewotCQlsaXN0ID0gYXBwZW5kKGxpc3QsIGQpCi0JfQotCWFpZGxEZXBzTXV0ZXguTG9jaygpCi0JYWlkbERlcHMobWN0eC5Db25maWcoKSlbbWN0eC5Nb2R1bGUoKV0gPSBsaXN0Ci0JYWlkbERlcHNNdXRleC5VbmxvY2soKQorLy8gQWlsZFZlcnNpb25JbmZvIGtlZXBzIHRoZSAqLXNvdXJjZSBtb2R1bGUgZm9yIGVhY2ggKGFpZGxfaW50ZXJmYWNlICYgbGFuZykgYW5kIHRoZSBsaXN0IG9mCisvLyBub3QtZnJvemVuIHZlcnNpb25zICh3aGljaCBzaG91bGRuJ3QgYmUgdXNlZCBieSBvdGhlciBtb2R1bGVzKQordHlwZSBBaWxkVmVyc2lvbkluZm8gc3RydWN0IHsKKwlub3RGcm96ZW4gW11zdHJpbmcKKwlzb3VyY2VNYXAgbWFwW3N0cmluZ11zdHJpbmcKIH0KIAotZnVuYyBjaGVja0R1cGxpY2F0ZWRWZXJzaW9ucyhtY3R4IGFuZHJvaWQuQm90dG9tVXBNdXRhdG9yQ29udGV4dCkgewordmFyIEFpZGxWZXJzaW9uSW5mb1Byb3ZpZGVyID0gYmx1ZXByaW50Lk5ld011dGF0b3JQcm92aWRlcihBaWxkVmVyc2lvbkluZm97fSwgImNoZWNrQWlkbEdlbmVyYXRlZE1vZHVsZXMiKQorCisvLyBNZXJnZXMgYG90aGVyYCB2ZXJzaW9uIGluZm8gaW50byB0aGlzIG9uZS4KKy8vIFJldHVybnMgdGhlIHBhaXIgb2YgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgd2hlbiB0aGVyZSdzIGNvbmZsaWN0LiBPdGhlcndpc2UgcmV0dXJucyBuaWwuCisvLyBGb3IgZXhhbXBsZSwgd2hlbiBhIG1vZHVsZSBkZXBlbmRzIG9uICdmb28tVjItbmRrJywgdGhlIG1hcCBjb250YWlucyBhbiBlbnRyeSBvZiAoZm9vLCBmb28tVjItbmRrLXNvdXJjZSkuCisvLyBNZXJnaW5nIChmb28sIGZvby1WMS1uZGstc291cmNlKSBhbmQgKGZvbywgZm9vLVYyLW5kay1zb3VyY2UpIHdpbGwgZmFpbCBhbmQgcmV0dXJucworLy8ge2Zvby1WMS1uZGstc291cmNlLCBmb28tVjItbmRrLXNvdXJjZX0uCitmdW5jIChpbmZvICpBaWxkVmVyc2lvbkluZm8pIG1lcmdlKG90aGVyIEFpbGRWZXJzaW9uSW5mbykgW11zdHJpbmcgeworCWluZm8ubm90RnJvemVuID0gYXBwZW5kKGluZm8ubm90RnJvemVuLCBvdGhlci5ub3RGcm96ZW4uLi4pCisKKwlpZiBvdGhlci5zb3VyY2VNYXAgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlpZiBpbmZvLnNvdXJjZU1hcCA9PSBuaWwgeworCQlpbmZvLnNvdXJjZU1hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJfQorCWZvciBpZmFjZU5hbWUsIG90aGVyU291cmNlTmFtZSA6PSByYW5nZSBvdGhlci5zb3VyY2VNYXAgeworCQlpZiBzb3VyY2VOYW1lLCBvayA6PSBpbmZvLnNvdXJjZU1hcFtpZmFjZU5hbWVdOyBvayB7CisJCQlpZiBzb3VyY2VOYW1lICE9IG90aGVyU291cmNlTmFtZSB7CisJCQkJcmV0dXJuIFtdc3RyaW5ne3NvdXJjZU5hbWUsIG90aGVyU291cmNlTmFtZX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWluZm8uc291cmNlTWFwW2lmYWNlTmFtZV0gPSBvdGhlclNvdXJjZU5hbWUKKwkJfQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgcmVwb3J0VXNpbmdOb3RGcm96ZW5FcnJvcihjdHggYW5kcm9pZC5CYXNlTW9kdWxlQ29udGV4dCwgbm90RnJvemVuIFtdc3RyaW5nKSB7CisJLy8gVE9ETyhiLzE1NDA2NjY4Nik6IFJlcGxhY2UgaXQgd2l0aCBhIGNvbW1vbiBtZXRob2QgaW5zdGVhZCBvZiBsaXN0aW5nIHVwIG1vZHVsZSB0eXBlcy4KKwkvLyBUZXN0IGxpYnJhcmllcyBhcmUgZXhlbXB0ZWQuCisJaWYgYW5kcm9pZC5Jbkxpc3QoY3R4Lk1vZHVsZVR5cGUoKSwgW11zdHJpbmd7ImNjX3Rlc3RfbGlicmFyeSIsICJhbmRyb2lkX3Rlc3QiLCAiY2NfYmVuY2htYXJrIiwgImNjX3Rlc3QifSkgeworCQlyZXR1cm4KKwl9CisJZm9yIF8sIG5hbWUgOj0gcmFuZ2Ugbm90RnJvemVuIHsKKwkJY3R4Lk1vZHVsZUVycm9yZigiJXYgaXMgZGlzYWxsb3dlZCBpbiByZWxlYXNlIHZlcnNpb24gYmVjYXVzZSBpdCBpcyB1bnN0YWJsZSwgYW5kIGl0cyBcIm93bmVyXCIgcHJvcGVydHkgaXMgbWlzc2luZy4iLAorCQkJbmFtZSkKKwl9Cit9CisKK2Z1bmMgcmVwb3J0TXVsdGlwbGVWZXJzaW9uRXJyb3IoY3R4IGFuZHJvaWQuQmFzZU1vZHVsZUNvbnRleHQsIHZpb2xhdG9ycyBbXXN0cmluZykgeworCXNvcnQuU3RyaW5ncyh2aW9sYXRvcnMpCisJY3R4Lk1vZHVsZUVycm9yZigiZGVwZW5kcyBvbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBhaWRsX2ludGVyZmFjZTogJXMiLCBzdHJpbmdzLkpvaW4odmlvbGF0b3JzLCAiLCAiKSkKKwljdHguV2Fsa0RlcHMoZnVuYyhjaGlsZCBhbmRyb2lkLk1vZHVsZSwgcGFyZW50IGFuZHJvaWQuTW9kdWxlKSBib29sIHsKKwkJaWYgYW5kcm9pZC5Jbkxpc3QoY2hpbGQuTmFtZSgpLCB2aW9sYXRvcnMpIHsKKwkJCWN0eC5Nb2R1bGVFcnJvcmYoIkRlcGVuZGVuY3kgcGF0aDogJXMiLCBjdHguR2V0UGF0aFN0cmluZyh0cnVlKSkKKwkJCXJldHVybiBmYWxzZQorCQl9CisJCXJldHVybiB0cnVlCisJfSkKK30KKworZnVuYyBjaGVja0FpZGxHZW5lcmF0ZWRNb2R1bGVzKG1jdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CiAJc3dpdGNoIG1jdHguTW9kdWxlKCkuKHR5cGUpIHsKIAljYXNlICpqYXZhLkxpYnJhcnk6CiAJY2FzZSAqY2MuTW9kdWxlOgpAQCAtMTgzLDQ3ICsxNzAsMzcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4KIAl9Ci0KLQlhaWRsRGVwc011dGV4LlJMb2NrKCkKLQlteUFpZGxEZXBzIDo9IGFpZGxEZXBzKG1jdHguQ29uZmlnKCkpW21jdHguTW9kdWxlKCldCi0JYWlkbERlcHNNdXRleC5SVW5sb2NrKCkKLQlpZiBteUFpZGxEZXBzID09IG5pbCB8fCBsZW4obXlBaWRsRGVwcykgPT0gMCB7Ci0JCXJldHVybiAvLyBUaGlzIHNob3VsZCBiZSB0aGUgdXN1YWwgY2FzZQorCWlmIGdlbiwgb2sgOj0gbWN0eC5Nb2R1bGUoKS4oKmFpZGxHZW5SdWxlKTsgb2sgeworCQl2YXIgbm90RnJvemVuIFtdc3RyaW5nCisJCWlmIGdlbi5wcm9wZXJ0aWVzLk5vdEZyb3plbiB7CisJCQlub3RGcm96ZW4gPSBbXXN0cmluZ3tzdHJpbmdzLlRyaW1TdWZmaXgobWN0eC5Nb2R1bGVOYW1lKCksICItc291cmNlIil9CisJCX0KKwkJbWN0eC5TZXRQcm92aWRlcihBaWRsVmVyc2lvbkluZm9Qcm92aWRlciwgQWlsZFZlcnNpb25JbmZveworCQkJbm90RnJvemVuOiBub3RGcm96ZW4sCisJCQlzb3VyY2VNYXA6IG1hcFtzdHJpbmddc3RyaW5neworCQkJCWdlbi5wcm9wZXJ0aWVzLkJhc2VOYW1lICsgIi0iICsgZ2VuLnByb3BlcnRpZXMuTGFuZzogZ2VuLk5hbWUoKSwKKwkJCX0sCisJCX0pCisJCXJldHVybgogCX0KLQotCS8vIExhc3RseSwgcmVwb3J0IGFuIGVycm9yIGlmIHRoZXJlIGlzIGFueSBkdXBsaWNhdGVkIHZlcnNpb25zIG9mIHRoZSBzYW1lIGludGVyZmFjZSAqIGxhbmcKLQlmb3IgXywgbGFuZyA6PSByYW5nZSBbXXN0cmluZ3tsYW5nSmF2YSwgbGFuZ0NwcCwgbGFuZ05kaywgbGFuZ05ka1BsYXRmb3JtfSB7Ci0JCS8vIGludGVyZmFjZU5hbWUgLT4gdmVyTGFuZyAtPiBsaXN0IG9mIG1vZHVsZSBuYW1lcwotCQl2ZXJzaW9uc09mIDo9IG1ha2UobWFwW3N0cmluZ11tYXBbc3RyaW5nXVtdc3RyaW5nKQotCQlmb3IgXywgZGVwIDo9IHJhbmdlIG15QWlkbERlcHMgewotCQkJaWYgIXN0cmluZ3MuSGFzU3VmZml4KGRlcC52ZXJMYW5nLCBsYW5nKSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCXZlcnNpb25zIDo9IHZlcnNpb25zT2ZbZGVwLmlmYWNlTmFtZV0KLQkJCWlmIHZlcnNpb25zID09IG5pbCB7Ci0JCQkJdmVyc2lvbnMgPSBtYWtlKG1hcFtzdHJpbmddW11zdHJpbmcpCi0JCQkJdmVyc2lvbnNPZltkZXAuaWZhY2VOYW1lXSA9IHZlcnNpb25zCi0JCQl9Ci0JCQl2ZXJzaW9uc1tkZXAudmVyTGFuZ10gPSBhcHBlbmQodmVyc2lvbnNbZGVwLnZlckxhbmddLCBkZXAubW9kdWxlTmFtZSgpKQotCQl9Ci0KLQkJZm9yIF8sIHZlcnNpb25zIDo9IHJhbmdlIHZlcnNpb25zT2YgewotCQkJaWYgbGVuKHZlcnNpb25zKSA+PSAyIHsKLQkJCQl2YXIgdmlvbGF0b3JzIFtdc3RyaW5nCi0JCQkJZm9yIF8sIG1vZHVsZXMgOj0gcmFuZ2UgdmVyc2lvbnMgewotCQkJCQl2aW9sYXRvcnMgPSBhcHBlbmQodmlvbGF0b3JzLCBtb2R1bGVzLi4uKQotCQkJCX0KLQkJCQl2aW9sYXRvcnMgPSBhbmRyb2lkLlNvcnRlZFVuaXF1ZVN0cmluZ3ModmlvbGF0b3JzKQotCQkJCW1jdHguTW9kdWxlRXJyb3JmKCJkZXBlbmRzIG9uIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGFpZGxfaW50ZXJmYWNlOiAlcyIsIHN0cmluZ3MuSm9pbih2aW9sYXRvcnMsICIsICIpKQotCQkJCW1jdHguV2Fsa0RlcHMoZnVuYyhjaGlsZCBhbmRyb2lkLk1vZHVsZSwgcGFyZW50IGFuZHJvaWQuTW9kdWxlKSBib29sIHsKLQkJCQkJaWYgYW5kcm9pZC5Jbkxpc3QoY2hpbGQuTmFtZSgpLCB2aW9sYXRvcnMpIHsKLQkJCQkJCW1jdHguTW9kdWxlRXJyb3JmKCJEZXBlbmRlbmN5IHBhdGg6ICVzIiwgbWN0eC5HZXRQYXRoU3RyaW5nKHRydWUpKQotCQkJCQkJcmV0dXJuIGZhbHNlCi0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWUKLQkJCQl9KQorCS8vIENvbGxlY3QvbWVyZ2UgQWlsZFZlcnNpb25JbmZvcyBmcm9tIGRpcmVjdCBkZXBlbmRlbmNpZXMKKwl2YXIgaW5mbyBBaWxkVmVyc2lvbkluZm8KKwltY3R4LlZpc2l0RGlyZWN0RGVwcyhmdW5jKGRlcCBhbmRyb2lkLk1vZHVsZSkgeworCQlpZiBtY3R4Lk90aGVyTW9kdWxlSGFzUHJvdmlkZXIoZGVwLCBBaWRsVmVyc2lvbkluZm9Qcm92aWRlcikgeworCQkJb3RoZXJJbmZvIDo9IG1jdHguT3RoZXJNb2R1bGVQcm92aWRlcihkZXAsIEFpZGxWZXJzaW9uSW5mb1Byb3ZpZGVyKS4oQWlsZFZlcnNpb25JbmZvKQorCQkJaWYgdmlvbGF0b3JzIDo9IGluZm8ubWVyZ2Uob3RoZXJJbmZvKTsgdmlvbGF0b3JzICE9IG5pbCB7CisJCQkJcmVwb3J0TXVsdGlwbGVWZXJzaW9uRXJyb3IobWN0eCwgdmlvbGF0b3JzKQogCQkJfQogCQl9CisJfSkKKwlpZiAhaXNBaWRsR2VuZXJhdGVkTW9kdWxlKG1jdHguTW9kdWxlKCkpICYmIGxlbihpbmZvLm5vdEZyb3plbikgPiAwIHsKKwkJcmVwb3J0VXNpbmdOb3RGcm96ZW5FcnJvcihtY3R4LCBpbmZvLm5vdEZyb3plbikKKwl9CisJaWYgbWN0eC5GYWlsZWQoKSB7CisJCXJldHVybgorCX0KKwlpZiBpbmZvLnNvdXJjZU1hcCAhPSBuaWwgfHwgbGVuKGluZm8ubm90RnJvemVuKSA+IDAgeworCQltY3R4LlNldFByb3ZpZGVyKEFpZGxWZXJzaW9uSW5mb1Byb3ZpZGVyLCBpbmZvKQogCX0KIH0KIApAQCAtMjM4LDcgKzIxNSw3IEBACiAJfQogCiAJaWYgbGVuKHNyY3MpID09IDAgewotCQljdHguUHJvcGVydHlFcnJvcmYoInNyY3MiLCAiTm8gc291cmNlcyBwcm92aWRlZC4iKQorCQljdHguUHJvcGVydHlFcnJvcmYoInNyY3MiLCAiTm8gc291cmNlcyBwcm92aWRlZCBpbiAldiIsIHJvb3QpCiAJfQogCiAJLy8gZ2F0aGVyIGJhc2UgZGlyZWN0b3JpZXMgZnJvbSBpbnB1dCAuYWlkbCBmaWxlcwpAQCAtMjc1LDExICsyNTIsNiBAQAogCS8vIEZvciBuYXRpdmUgbW9kdWxlcywgdGhlIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldCB3aGVuIGEgbW9kdWxlIGlzIGEgcGFydCBvZiBtYWlubGluZSBtb2R1bGVzKEFQRVgpLgogCS8vIEZvcndhcmRlZCB0byBnZW5lcmF0ZWQgamF2YS9uYXRpdmUgbW9kdWxlLgogCU1pbl9zZGtfdmVyc2lvbiAqc3RyaW5nCi0KLQkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgYXJlIGF2YWlsYWJsZSBvciBub3QuIFdoZW4gc2V0IHRvIHRydWUsCi0JLy8gdGhlIHNvdXJjZSBmaWxlcyBjYW4gYmUgYWRkZWQgdG8gYHNyY3NgIHByb3BlcnR5IHZpYSBgOjxpZmFjZW5hbWU+LTxiYWNrZW5kPi1zb3VyY2VgLAotCS8vIGUuZy4sICI6bXlhaWRsLWphdmEtc291cmNlIgotCVNyY3NfYXZhaWxhYmxlICpib29sCiB9CiAKIHR5cGUgQ29tbW9uTmF0aXZlQmFja2VuZFByb3BlcnRpZXMgc3RydWN0IHsKQEAgLTMyMSw2ICsyOTMsOSBAQAogCS8vIFdoZXRoZXIgdGhlIGxpYnJhcnkgY2FuIGJlIGluc3RhbGxlZCBvbiB0aGUgcHJvZHVjdCBpbWFnZS4KIAlQcm9kdWN0X2F2YWlsYWJsZSAqYm9vbAogCisJLy8gV2hldGhlciB0aGUgbGlicmFyeSBjYW4gYmUgaW5zdGFsbGVkIG9uIHRoZSByZWNvdmVyeSBpbWFnZS4KKwlSZWNvdmVyeV9hdmFpbGFibGUgKmJvb2wKKwogCS8vIFdoZXRoZXIgdGhlIGxpYnJhcnkgY2FuIGJlIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBpbnRvIHRoZSBzYW1lIHByb2Nlc3MKIAlEb3VibGVfbG9hZGFibGUgKmJvb2wKIApAQCAtMzQ0LDEyICszMTksNiBAQAogCS8vIEl0IGNvdWxkIGJlIGFuIGFpZGxfaW50ZXJmYWNlIHNvbGVseSBvciB3aXRoIHZlcnNpb24oc3VjaCBhcyAtVjEpCiAJSW1wb3J0cyBbXXN0cmluZwogCi0JLy8gTGlzdCBvZiBhaWRsX2ludGVyZmFjZSBtb2R1bGVzIHRoYXQgdGhpcyB1c2VzLiBJdCB0cmltcyB2ZXJzaW9uIHN1ZmZpeCBpbiAnSW1wb3J0cycgZmllbGQuCi0JSW1wb3J0c1dpdGhvdXRWZXJzaW9uIFtdc3RyaW5nIGBibHVlcHJpbnQ6Im11dGF0ZWQiYAotCi0JLy8gVXNlZCBieSBnZW4gZGVwZW5kZW5jeSB0byBmaWxsIG91dCBhaWRsIGluY2x1ZGUgcGF0aAotCUZ1bGxfaW1wb3J0X3BhdGhzIFtdc3RyaW5nIGBibHVlcHJpbnQ6Im11dGF0ZWQiYAotCiAJLy8gU3RhYmlsaXR5IHByb21pc2UuIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzICJ2aW50ZiIuCiAJLy8gSWYgdGhpcyBpcyB1bnNldCwgdGhpcyBjb3JyZXNwb25kcyB0byBhbiBpbnRlcmZhY2Ugd2l0aCBzdGFiaWxpdHkgd2l0aGluCiAJLy8gdGhpcyBjb21waWxhdGlvbiBjb250ZXh0IChzbyBhbiBpbnRlcmZhY2UgbG9hZGVkIGhlcmUgY2FuIG9ubHkgYmUgdXNlZApAQCAtMzYyLDYgKzMzMSwxMiBAQAogCS8vIHRoZSBsaXN0IGlzIGNvbnNpZGVyZWQgYXMgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24uCiAJVmVyc2lvbnMgW11zdHJpbmcKIAorCS8vIFRoZSBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIHNkayB0aGF0IHRoZSBjb21waWxlZCBhcnRpZmFjdHMgd2lsbCBydW4gYWdhaW5zdAorCS8vIEZvciBuYXRpdmUgbW9kdWxlcywgdGhlIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldCB3aGVuIGEgbW9kdWxlIGlzIGEgcGFydCBvZiBtYWlubGluZSBtb2R1bGVzKEFQRVgpLgorCS8vIEZvcndhcmRlZCB0byBnZW5lcmF0ZWQgamF2YS9uYXRpdmUgbW9kdWxlLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5CisJLy8gYmFja2VuZC48bmFtZT4ubWluX3Nka192ZXJzaW9uLgorCU1pbl9zZGtfdmVyc2lvbiAqc3RyaW5nCisKIAlCYWNrZW5kIHN0cnVjdCB7CiAJCS8vIEJhY2tlbmQgb2YgdGhlIGNvbXBpbGVyIGdlbmVyYXRpbmcgY29kZSBmb3IgSmF2YSBjbGllbnRzLgogCQkvLyBXaGVuIGVuYWJsZWQsIHRoaXMgY3JlYXRlcyBhIHRhcmdldCBjYWxsZWQgIjxuYW1lPi1qYXZhIi4KQEAgLTM3Myw2ICszNDgsMTEgQEAKIAkJCS8vIFdoZXRoZXIgdG8gY29tcGlsZSBhZ2FpbnN0IHBsYXRmb3JtIEFQSXMgaW5zdGVhZCBvZgogCQkJLy8gYW4gU0RLLgogCQkJUGxhdGZvcm1fYXBpcyAqYm9vbAorCQkJLy8gV2hldGhlciBSUEMgZmVhdHVyZXMgYXJlIGVuYWJsZWQgKHJlcXVpcmVzIEFQSSBsZXZlbCAzMikKKwkJCS8vIFRPRE8oYi8xNzU4MTk1MzUpOiBlbmFibGUgdGhpcyBhdXRvbWF0aWNhbGx5PworCQkJR2VuX3JwYyAqYm9vbAorCQkJLy8gTGludCBwcm9wZXJ0aWVzIGZvciBnZW5lcmF0ZWQgamF2YSBtb2R1bGUKKwkJCWphdmEuTGludFByb3BlcnRpZXMKIAkJfQogCQkvLyBCYWNrZW5kIG9mIHRoZSBjb21waWxlciBnZW5lcmF0aW5nIGNvZGUgZm9yIEMrKyBjbGllbnRzIHVzaW5nCiAJCS8vIGxpYmJpbmRlciAodW5zdGFibGUgQysrIGludGVyZmFjZSkKQEAgLTM4MCwxOSArMzYwLDE4IEBACiAJCUNwcCBzdHJ1Y3QgewogCQkJQ29tbW9uTmF0aXZlQmFja2VuZFByb3BlcnRpZXMKIAkJfQotCQkvLyBCYWNrZW5kIG9mIHRoZSBjb21waWxlciBnZW5lcmF0aW5nIGNvZGUgZm9yIEMrKyBjbGllbnRzIHVzaW5nCi0JCS8vIGxpYmJpbmRlcl9uZGsgKHN0YWJsZSBDIGludGVyZmFjZSB0byBzeXN0ZW0ncyBsaWJiaW5kZXIpCi0JCS8vIFdoZW4gZW5hYmxlZCwgdGhpcyBjcmVhdGVzIGEgdGFyZ2V0IGNhbGxlZCAiPG5hbWU+LW5kayIKLQkJLy8gKGZvciBhcHBzKSBhbmQgIjxuYW1lPi1uZGtfcGxhdGZvcm0iIChmb3IgcGxhdGZvcm0gdXNhZ2UpLgorCQkvLyBCYWNrZW5kIG9mIHRoZSBjb21waWxlciBnZW5lcmF0aW5nIGNvZGUgZm9yIEMrKyBjbGllbnRzIHVzaW5nIGxpYmJpbmRlcl9uZGsKKwkJLy8gKHN0YWJsZSBDIGludGVyZmFjZSB0byBzeXN0ZW0ncyBsaWJiaW5kZXIpIFdoZW4gZW5hYmxlZCwgdGhpcyBjcmVhdGVzIGEgdGFyZ2V0CisJCS8vIGNhbGxlZCAiPG5hbWU+LVY8dmVyPi1uZGsiIChmb3IgYm90aCBhcHBzIGFuZCBwbGF0Zm9ybSkgYW5kCisJCS8vICI8bmFtZT4tVjx2ZXI+LW5ka19wbGF0Zm9ybSIgKGZvciBwbGF0Zm9ybSBvbmx5KS4KKwkJLy8gVE9ETyhiLzE2MTQ1NjE5OCk6IHJlbW92ZSB0aGUgbmRrX3BsYXRmb3JtIGJhY2tlbmQgYXMgdGhlIG5kayBiYWNrZW5kIGNhbiBzZXJ2ZQorCQkvLyB0aGUgc2FtZSBwdXJwb3NlLgogCQlOZGsgc3RydWN0IHsKIAkJCUNvbW1vbk5hdGl2ZUJhY2tlbmRQcm9wZXJ0aWVzCiAKLQkJCS8vIEN1cnJlbnRseSwgYWxsIG5kay1zdXBwb3J0ZWQgaW50ZXJmYWNlcyBnZW5lcmF0ZSB0d28gdmFyaWFudHM6Ci0JCQkvLyAtIG5kayAtIGZvciBhcHBzIHRvIHVzZSwgYWdhaW5zdCBhbiBOREsKLQkJCS8vIC0gbmRrX3BsYXRmb3JtIC0gZm9yIHRoZSBwbGF0Zm9ybSB0byB1c2UKLQkJCS8vCi0JCQkvLyBUaGlzIGFkZHMgYW4gb3B0aW9uIHRvIGRpc2FibGUgdGhlICduZGsnIHZhcmlhbnQgaW4gY2FzZXMgd2hlcmUgQVBJcwotCQkJLy8gb25seSBhdmFpbGFibGUgaW4gdGhlIHBsYXRmb3JtIHZlcnNpb24gd29yay4KKwkJCS8vIElmIHNldCB0byBmYWxzZSwgdGhlIG5kayBiYWNrZW5kIGlzIGV4Y2x1c2l2ZSB0byBwbGF0Zm9ybSBhbmQgaXMgbm90CisJCQkvLyBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zLiBEZWZhdWx0IGlzIHRydWUgKGkuZS4gYXZhaWxhYmxlIHRvIGJvdGgKKwkJCS8vIGFwcGxpY2F0aW9ucyBhbmQgcGxhdGZvcm0pLgogCQkJQXBwc19lbmFibGVkICpib29sCiAJCX0KIAkJLy8gQmFja2VuZCBvZiB0aGUgY29tcGlsZXIgZ2VuZXJhdGluZyBjb2RlIGZvciBSdXN0IGNsaWVudHMuCkBAIC00MjIsNjEgKzQwMSwxNjMgQEAKIAogCS8vIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRoYXQgYXJlIGNyZWF0ZWQgZm9yIHRoaXMgaW50ZXJmYWNlCiAJaW50ZXJuYWxNb2R1bGVOYW1lcyBbXXN0cmluZworCisJLy8gbWFwIGZvciB2ZXJzaW9uIHRvIHByZXByb2Nlc3NlZC5haWRsIGZpbGUuCisJLy8gVGhlcmUncyB0d28gYWRkaXRpb25hbCBhbGlhcyBmb3IgdmVyc2lvbnM6CisJLy8gLSAiIihlbXB0eSkgaXMgZm9yIFRvVAorCS8vIC0gImxhdGVzdCIgaXMgZm9yIGkubGF0ZXN0VmVyc2lvbigpCisJcHJlcHJvY2Vzc2VkIG1hcFtzdHJpbmddYW5kcm9pZC5Xcml0YWJsZVBhdGgKIH0KIAogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgc2hvdWxkR2VuZXJhdGVKYXZhQmFja2VuZCgpIGJvb2wgewogCS8vIGV4cGxpY2l0bHkgdHJ1ZSBpZiBub3Qgc3BlY2lmaWVkIHRvIGdpdmUgZWFybHkgd2FybmluZyB0byBkZXZzCi0JcmV0dXJuIGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuRW5hYmxlZCA9PSBuaWwgfHwgKmkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuRW5hYmxlZAorCXJldHVybiBwcm9wdG9vbHMuQm9vbERlZmF1bHQoaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5FbmFibGVkLCB0cnVlKQogfQogCiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBzaG91bGRHZW5lcmF0ZUNwcEJhY2tlbmQoKSBib29sIHsKIAkvLyBleHBsaWNpdGx5IHRydWUgaWYgbm90IHNwZWNpZmllZCB0byBnaXZlIGVhcmx5IHdhcm5pbmcgdG8gZGV2cwotCXJldHVybiBpLnByb3BlcnRpZXMuQmFja2VuZC5DcHAuRW5hYmxlZCA9PSBuaWwgfHwgKmkucHJvcGVydGllcy5CYWNrZW5kLkNwcC5FbmFibGVkCisJcmV0dXJuIHByb3B0b29scy5Cb29sRGVmYXVsdChpLnByb3BlcnRpZXMuQmFja2VuZC5DcHAuRW5hYmxlZCwgdHJ1ZSkKIH0KIAogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgc2hvdWxkR2VuZXJhdGVOZGtCYWNrZW5kKCkgYm9vbCB7CiAJLy8gZXhwbGljaXRseSB0cnVlIGlmIG5vdCBzcGVjaWZpZWQgdG8gZ2l2ZSBlYXJseSB3YXJuaW5nIHRvIGRldnMKLQlyZXR1cm4gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLkVuYWJsZWQgPT0gbmlsIHx8ICppLnByb3BlcnRpZXMuQmFja2VuZC5OZGsuRW5hYmxlZAorCXJldHVybiBwcm9wdG9vbHMuQm9vbERlZmF1bHQoaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLkVuYWJsZWQsIHRydWUpCiB9CiAKKy8vIFJldHVybnMgd2hldGhlciB0aGUgbmRrIGJhY2tlbmQgc3VwcG9ydHMgYXBwbGljYXRpb25zIG9yIG5vdC4gRGVmYXVsdCBpcyBgdHJ1ZWAuIGBmYWxzZWAgaXMKKy8vIHJldHVybmVkIHdoZW4gYGFwcHNfZW5hYmxlZGAgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2Ugb3IgdGhlIGludGVyZmFjZSBpcyBleGNsdXNpdmUgdG8gdmVuZG9yCisvLyAoaS5lLiBgdmVuZG9yOiB0cnVlYCkuIE5vdGUgdGhhdCB0aGUgbmRrX3BsYXRmb3JtIGJhY2tlbmQgKHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKQorLy8gaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMuIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbHdheXMgZXhjbHVzaXZlIGZvciB0aGUgcGxhdGZvcm0sIGFzIGl0cyBuYW1lCisvLyBjbGVhcmx5IHNob3dzLgogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgc2hvdWxkR2VuZXJhdGVBcHBOZGtCYWNrZW5kKCkgYm9vbCB7Ci0JaWYgIWkuc2hvdWxkR2VuZXJhdGVOZGtCYWNrZW5kKCkgewotCQlyZXR1cm4gZmFsc2UKLQl9Ci0JLy8gZXhwbGljaXRseSB0cnVlIGlmIG5vdCBzcGVjaWZpZWQgdG8gZ2l2ZSBlYXJseSB3YXJuaW5nIHRvIGRldnMKLQlyZXR1cm4gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLkFwcHNfZW5hYmxlZCA9PSBuaWwgfHwgKmkucHJvcGVydGllcy5CYWNrZW5kLk5kay5BcHBzX2VuYWJsZWQKKwlyZXR1cm4gaS5zaG91bGRHZW5lcmF0ZU5ka0JhY2tlbmQoKSAmJgorCQlwcm9wdG9vbHMuQm9vbERlZmF1bHQoaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLkFwcHNfZW5hYmxlZCwgdHJ1ZSkgJiYKKwkJIWkuU29jU3BlY2lmaWMoKQogfQogCiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBzaG91bGRHZW5lcmF0ZVJ1c3RCYWNrZW5kKCkgYm9vbCB7CiAJcmV0dXJuIGkucHJvcGVydGllcy5CYWNrZW5kLlJ1c3QuRW5hYmxlZCAhPSBuaWwgJiYgKmkucHJvcGVydGllcy5CYWNrZW5kLlJ1c3QuRW5hYmxlZAogfQogCi1mdW5jIChpICphaWRsSW50ZXJmYWNlKSBnYXRoZXJJbnRlcmZhY2UobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCkgewotCWFpZGxJbnRlcmZhY2VzIDo9IGFpZGxJbnRlcmZhY2VzKG1jdHguQ29uZmlnKCkpCi0JYWlkbEludGVyZmFjZU11dGV4LkxvY2soKQotCWRlZmVyIGFpZGxJbnRlcmZhY2VNdXRleC5VbmxvY2soKQotCSphaWRsSW50ZXJmYWNlcyA9IGFwcGVuZCgqYWlkbEludGVyZmFjZXMsIGkpCitmdW5jIChpICphaWRsSW50ZXJmYWNlKSBtaW5TZGtWZXJzaW9uKGxhbmcgc3RyaW5nKSAqc3RyaW5nIHsKKwl2YXIgdmVyICpzdHJpbmcKKwlzd2l0Y2ggbGFuZyB7CisJY2FzZSBsYW5nQ3BwOgorCQl2ZXIgPSBpLnByb3BlcnRpZXMuQmFja2VuZC5DcHAuTWluX3Nka192ZXJzaW9uCisJY2FzZSBsYW5nSmF2YToKKwkJdmVyID0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5NaW5fc2RrX3ZlcnNpb24KKwljYXNlIGxhbmdOZGssIGxhbmdOZGtQbGF0Zm9ybToKKwkJdmVyID0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLk1pbl9zZGtfdmVyc2lvbgorCWNhc2UgbGFuZ1J1c3Q6CisJCXZlciA9IGkucHJvcGVydGllcy5CYWNrZW5kLlJ1c3QuTWluX3Nka192ZXJzaW9uCisJZGVmYXVsdDoKKwkJcGFuaWMoZm10LkVycm9yZigidW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgYmFja2VuZCAlcVxuIiwgbGFuZykpCisJfQorCWlmIHZlciA9PSBuaWwgeworCQlyZXR1cm4gaS5wcm9wZXJ0aWVzLk1pbl9zZGtfdmVyc2lvbgorCX0KKwlyZXR1cm4gdmVyCiB9CiAKLWZ1bmMgYWRkVW5zdGFibGVNb2R1bGUobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgbW9kdWxlTmFtZSBzdHJpbmcpIHsKLQl1bnN0YWJsZU1vZHVsZXMgOj0gdW5zdGFibGVNb2R1bGVzKG1jdHguQ29uZmlnKCkpCi0JdW5zdGFibGVNb2R1bGVNdXRleC5Mb2NrKCkKLQlkZWZlciB1bnN0YWJsZU1vZHVsZU11dGV4LlVubG9jaygpCi0JKnVuc3RhYmxlTW9kdWxlcyA9IGFwcGVuZCgqdW5zdGFibGVNb2R1bGVzLCBtb2R1bGVOYW1lKQorLy8gRGVwIHRvICotYXBpIG1vZHVsZShhaWRsQXBpKQordHlwZSBhcGlEZXBUYWcgc3RydWN0IHsKKwlibHVlcHJpbnQuQmFzZURlcGVuZGVuY3lUYWcKKwluYW1lIHN0cmluZwogfQogCit0eXBlIGltcG9ydEludGVyZmFjZURlcFRhZyBzdHJ1Y3QgeworCWJsdWVwcmludC5CYXNlRGVwZW5kZW5jeVRhZworCWFuSW1wb3J0IHN0cmluZworfQorCit0eXBlIGludGVyZmFjZURlcFRhZyBzdHJ1Y3QgeworCWJsdWVwcmludC5CYXNlRGVwZW5kZW5jeVRhZworfQorCit2YXIgKAorCS8vIERlcCBmcm9tICotc291cmNlIChhaWRsR2VuUnVsZSkgdG8gKi1hcGkgKGFpZGxBcGkpCisJYXBpRGVwID0gYXBpRGVwVGFne25hbWU6ICJhcGkifQorCS8vIERlcCBmcm9tICotYXBpIChhaWRsQXBpKSB0byAqLWFwaSAoYWlkbEFwaSksIHJlcHJlc2VudGluZyBpbXBvcnRlZCBpbnRlcmZhY2VzCisJaW1wb3J0QXBpRGVwID0gYXBpRGVwVGFne25hbWU6ICJpbXBvcnRlZC1hcGkifQorCS8vIERlcCB0byBvcmlnaW5hbCAqLWludGVyZmFjZSAoYWlkbEludGVyZmFjZSkKKwlpbnRlcmZhY2VEZXAgPSBpbnRlcmZhY2VEZXBUYWd7fQorKQorCitmdW5jIGFkZEltcG9ydGVkSW50ZXJmYWNlRGVwcyhjdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0LCBpbXBvcnRzIFtdc3RyaW5nKSB7CisJZm9yIF8sIGFuSW1wb3J0IDo9IHJhbmdlIGltcG9ydHMgeworCQluYW1lLCBfIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnQpCisJCWN0eC5BZGREZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgaW1wb3J0SW50ZXJmYWNlRGVwVGFne2FuSW1wb3J0OiBhbkltcG9ydH0sIG5hbWUrYWlkbEludGVyZmFjZVN1ZmZpeCkKKwl9Cit9CisKKy8vIFJ1biBjdXN0b20gIkRlcHMiIG11dGF0b3IgYmV0d2VlbiBBSURMIG1vZHVsZXMgY3JlYXRlZCBhdCBMb2FkSG9vayBzdGFnZS4KKy8vIFdlIGNhbid0IHVzZSB0aGUgIkRlcHNNdXRhdG9yIiBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzIGJlY2F1c2UKKy8vIC0gV2UgbmVlZCB0byBjcmVhdGUgbGlicmFyeSBtb2R1bGVzIChjYy9qYXZhLy4uLikgYmVmb3JlICJhcmNoIiBtdXRhdG9yLiBOb3RlIHRoYXQgY2NfbGlicmFyeQorLy8gICBzaG91bGQgYmUgbXV0YXRlZCBieSBvcy9pbWFnZS9hcmNoIG11dGF0b3JzIGFzIHdlbGwuCisvLyAtIFdoZW4gY3JlYXRpbmcgbGlicmFyeSBtb2R1bGVzLCB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgb3JpZ2luYWwgaW50ZXJmYWNlIGFuZCBpdHMgaW1wb3J0ZWQKKy8vICAgaW50ZXJmYWNlcyB0byBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiB0byB1c2UuIFNlZSBhaWRsSW50ZXJmYWNlLmdldEltcG9ydFdpdGhWZXJzaW9uLgorZnVuYyBhZGRJbnRlcmZhY2VEZXBzKG1jdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CisJc3dpdGNoIGkgOj0gbWN0eC5Nb2R1bGUoKS4odHlwZSkgeworCWNhc2UgKmFpZGxJbnRlcmZhY2U6CisJCS8vIEluIGZhY3QgdGhpcyBpc24ndCBuZWNlc3NhcnkgYmVjYXVzZSBzb29uZyBjaGVja3MgZGVwZW5kZW5jaWVzIG9uIHVuZGVmaW5lZCBtb2R1bGVzLgorCQkvLyBCdXQgc2luY2UgYWlkbF9pbnRlcmZhY2Ugb3ZlcnJpZGVzIGl0cyBuYW1lIGludGVybmFsbHksIHRoaXMgcHJvdmlkZXMgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCisJCWZvciBfLCBhbkltcG9ydFdpdGhWZXJzaW9uIDo9IHJhbmdlIGkucHJvcGVydGllcy5JbXBvcnRzIHsKKwkJCWFuSW1wb3J0LCBfIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnRXaXRoVmVyc2lvbikKKwkJCWlmICFtY3R4Lk90aGVyTW9kdWxlRXhpc3RzKGFuSW1wb3J0ICsgYWlkbEludGVyZmFjZVN1ZmZpeCkgeworCQkJCWlmICFtY3R4LkNvbmZpZygpLkFsbG93TWlzc2luZ0RlcGVuZGVuY2llcygpIHsKKwkJCQkJbWN0eC5Qcm9wZXJ0eUVycm9yZigiaW1wb3J0cyIsICJJbXBvcnQgZG9lcyBub3QgZXhpc3Q6ICIrYW5JbXBvcnQpCisJCQkJfQorCQkJfQorCQl9CisJCWlmIG1jdHguRmFpbGVkKCkgeworCQkJcmV0dXJuCisJCX0KKwkJYWRkSW1wb3J0ZWRJbnRlcmZhY2VEZXBzKG1jdHgsIGkucHJvcGVydGllcy5JbXBvcnRzKQorCWNhc2UgKmFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvcjoKKwkJbWN0eC5BZGREZXBlbmRlbmN5KGksIGludGVyZmFjZURlcCwgaS5wcm9wZXJ0aWVzLkFpZGxJbnRlcmZhY2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCisJCWFkZEltcG9ydGVkSW50ZXJmYWNlRGVwcyhtY3R4LCBpLnByb3BlcnRpZXMuSW1wb3J0cykKKwljYXNlICpydXN0Lk1vZHVsZToKKwkJZm9yIF8sIHByb3BzIDo9IHJhbmdlIGkuR2V0UHJvcGVydGllcygpIHsKKwkJCWlmIHNwLCBvayA6PSBwcm9wcy4oKmFpZGxSdXN0U291cmNlUHJvdmlkZXJQcm9wZXJ0aWVzKTsgb2sgeworCQkJCW1jdHguQWRkRGVwZW5kZW5jeShpLCBpbnRlcmZhY2VEZXAsIHNwLkFpZGxJbnRlcmZhY2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCisJCQkJYWRkSW1wb3J0ZWRJbnRlcmZhY2VEZXBzKG1jdHgsIHNwLkltcG9ydHMpCisJCQkJYnJlYWsKKwkJCX0KKwkJfQorCWNhc2UgKmFpZGxBcGk6CisJCW1jdHguQWRkRGVwZW5kZW5jeShpLCBpbnRlcmZhY2VEZXAsIGkucHJvcGVydGllcy5CYXNlTmFtZSthaWRsSW50ZXJmYWNlU3VmZml4KQorCQlhZGRJbXBvcnRlZEludGVyZmFjZURlcHMobWN0eCwgaS5wcm9wZXJ0aWVzLkltcG9ydHMpCisJCWZvciBfLCBhbkltcG9ydCA6PSByYW5nZSBpLnByb3BlcnRpZXMuSW1wb3J0cyB7CisJCQluYW1lLCBfIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnQpCisJCQltY3R4LkFkZERlcGVuZGVuY3koaSwgaW1wb3J0QXBpRGVwLCBuYW1lK2FpZGxBcGlTdWZmaXgpCisJCX0KKwljYXNlICphaWRsR2VuUnVsZToKKwkJbWN0eC5BZGREZXBlbmRlbmN5KGksIGludGVyZmFjZURlcCwgaS5wcm9wZXJ0aWVzLkJhc2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgpCisJCWFkZEltcG9ydGVkSW50ZXJmYWNlRGVwcyhtY3R4LCBpLnByb3BlcnRpZXMuSW1wb3J0cykKKwkJaWYgIXByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkgeworCQkJLy8gZm9yIGNoZWNrYXBpIHRpbWVzdGFtcHMKKwkJCW1jdHguQWRkRGVwZW5kZW5jeShpLCBhcGlEZXAsIGkucHJvcGVydGllcy5CYXNlTmFtZSthaWRsQXBpU3VmZml4KQorCQl9CisJfQorfQorCisvLyBjaGVja0ltcG9ydHMgY2hlY2tzIGlmICJpbXBvcnQ6IiBwcm9wZXJ0eSBpcyB2YWxpZC4KKy8vIEluIGZhY3QsIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IGJlY2F1c2UgU29vbmcgY2FuIGNoZWNrL3JlcG9ydCB3aGVuIHdlIGFkZCBhIGRlcGVuZGVuY3kgdG8KKy8vIHVuZGVmaW5lZC91bmtub3duIG1vZHVsZS4gQnV0IG1vZHVsZSBuYW1lcyBhcmUgdmVyeSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBhbmQgbWF5IG5vdCBiZSBlYXN5CisvLyB0byB1bmRlcnN0YW5kLiBGb3IgZXhhbXBsZSwgd2hlbiBmb28gKHdpdGggamF2YSBlbmFibGVkKSBkZXBlbmRzIG9uIGJhciAod2l0aCBqYXZhIGRpc2FibGVkKSwgdGhlCisvLyBlcnJvciBtZXNzYWdlIHdvdWxkIGxvb2sgbGlrZSAiZm9vLVYyLWphdmEgZGVwZW5kcyBvbiB1bmtub3duIG1vZHVsZSBgYmFyLVYzLWphdmFgIiwgd2hpY2ggaXNuJ3QKKy8vIGNsZWFyIHRoYXQgYmFja2VuZC5qYXZhLmVuYWJsZWQgc2hvdWxkIGJlIHR1cm5lZCBvbi4KIGZ1bmMgY2hlY2tJbXBvcnRzKG1jdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CiAJaWYgaSwgb2sgOj0gbWN0eC5Nb2R1bGUoKS4oKmFpZGxJbnRlcmZhY2UpOyBvayB7Ci0JCWZvciBfLCBhbkltcG9ydFdpdGhWZXJzaW9uIDo9IHJhbmdlIGkucHJvcGVydGllcy5JbXBvcnRzIHsKLQkJCWFuSW1wb3J0LCB2ZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oYW5JbXBvcnRXaXRoVmVyc2lvbikKLQkJCW90aGVyIDo9IGxvb2t1cEludGVyZmFjZShhbkltcG9ydCwgbWN0eC5Db25maWcoKSkKLQotCQkJaWYgb3RoZXIgPT0gbmlsIHsKLQkJCQlpZiBtY3R4LkNvbmZpZygpLkFsbG93TWlzc2luZ0RlcGVuZGVuY2llcygpIHsKLQkJCQkJY29udGludWUKLQkJCQl9Ci0JCQkJbWN0eC5Qcm9wZXJ0eUVycm9yZigiaW1wb3J0cyIsICJJbXBvcnQgZG9lcyBub3QgZXhpc3Q6ICIrYW5JbXBvcnQpCisJCW1jdHguVmlzaXREaXJlY3REZXBzKGZ1bmMoZGVwIGFuZHJvaWQuTW9kdWxlKSB7CisJCQl0YWcsIG9rIDo9IG1jdHguT3RoZXJNb2R1bGVEZXBlbmRlbmN5VGFnKGRlcCkuKGltcG9ydEludGVyZmFjZURlcFRhZykKKwkJCWlmICFvayB7CisJCQkJcmV0dXJuCiAJCQl9CisJCQlvdGhlciA6PSBkZXAuKCphaWRsSW50ZXJmYWNlKQorCQkJYW5JbXBvcnQgOj0gb3RoZXIuTW9kdWxlQmFzZS5OYW1lKCkKKwkJCWFuSW1wb3J0V2l0aFZlcnNpb24gOj0gdGFnLmFuSW1wb3J0CisJCQlfLCB2ZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24odGFnLmFuSW1wb3J0KQogCQkJaWYgdmVyc2lvbiAhPSAiIiB7CiAJCQkJY2FuZGlkYXRlVmVyc2lvbnMgOj0gY29uY2F0KG90aGVyLnByb3BlcnRpZXMuVmVyc2lvbnMsIFtdc3RyaW5ne290aGVyLm5leHRWZXJzaW9uKCl9KQogCQkJCWlmICFhbmRyb2lkLkluTGlzdCh2ZXJzaW9uLCBjYW5kaWRhdGVWZXJzaW9ucykgewpAQCAtNTAyLDcgKzU4Myw3IEBACiAJCQkJbWN0eC5Qcm9wZXJ0eUVycm9yZigiYmFja2VuZC5ydXN0LmVuYWJsZWQiLAogCQkJCQkiUnVzdCBiYWNrZW5kIG5vdCBlbmFibGVkIGluIHRoZSBpbXBvcnRlZCBBSURMIGludGVyZmFjZSAlcSIsIGFuSW1wb3J0KQogCQkJfQotCQl9CisJCX0pCiAJfQogfQogCkBAIC02MzIsMTcgKzcxMywxMCBAQAogCWlmIGhhc1ZlcnNpb25TdWZmaXgoaS5Nb2R1bGVCYXNlLk5hbWUoKSkgewogCQltY3R4LlByb3BlcnR5RXJyb3JmKCJuYW1lIiwgImFpZGxfaW50ZXJmYWNlIHNob3VsZCBub3QgaGF2ZSAnLVY8bnVtYmVyPiBzdWZmaXgiKQogCX0KLQlpLnByb3BlcnRpZXMuSW1wb3J0c1dpdGhvdXRWZXJzaW9uID0gdHJpbVZlcnNpb25TdWZmaXhJbkxpc3QoaS5wcm9wZXJ0aWVzLkltcG9ydHMpCiAJaWYgIWlzUmVsYXRpdmVQYXRoKGkucHJvcGVydGllcy5Mb2NhbF9pbmNsdWRlX2RpcikgewogCQltY3R4LlByb3BlcnR5RXJyb3JmKCJsb2NhbF9pbmNsdWRlX2RpciIsICJtdXN0IGJlIHJlbGF0aXZlIHBhdGg6ICIraS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyKQogCX0KLQl2YXIgaW1wb3J0UGF0aHMgW11zdHJpbmcKLQlpbXBvcnRQYXRocyA9IGFwcGVuZChpbXBvcnRQYXRocywgZmlsZXBhdGguSm9pbihtY3R4Lk1vZHVsZURpcigpLCBpLnByb3BlcnRpZXMuTG9jYWxfaW5jbHVkZV9kaXIpKQotCWltcG9ydFBhdGhzID0gYXBwZW5kKGltcG9ydFBhdGhzLCBpLnByb3BlcnRpZXMuSW5jbHVkZV9kaXJzLi4uKQogCi0JaS5wcm9wZXJ0aWVzLkZ1bGxfaW1wb3J0X3BhdGhzID0gaW1wb3J0UGF0aHMKLQotCWkuZ2F0aGVySW50ZXJmYWNlKG1jdHgpCiAJaS5jaGVja1N0YWJpbGl0eShtY3R4KQogCWkuY2hlY2tWZXJzaW9ucyhtY3R4KQogCWkuY2hlY2tWbmRrVXNlVmVyc2lvbihtY3R4KQpAQCAtNjUzLDcgKzcyNyw2IEBACiAJfQogCiAJdmFyIGxpYnMgW11zdHJpbmcKLQlzZGtJc0ZpbmFsIDo9ICFtY3R4LkNvbmZpZygpLkRlZmF1bHRBcHBUYXJnZXRTZGsobWN0eCkuSXNQcmV2aWV3KCkKIAogCXVuc3RhYmxlIDo9IHByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkKIApAQCAtNjY4LDEzICs3NDEsMTggQEAKIAkJfQogCX0KIAorCXNka0lzRmluYWwgOj0gIW1jdHguQ29uZmlnKCkuRGVmYXVsdEFwcFRhcmdldFNkayhtY3R4KS5Jc1ByZXZpZXcoKQorCXJlcXVpcmVGcm96ZW5Ob093bmVyIDo9IGkuT3duZXIoKSA9PSAiIiAmJiAoc2RrSXNGaW5hbCB8fCBtY3R4LkNvbmZpZygpLklzRW52VHJ1ZSgiQUlETF9GUk9aRU5fUkVMIikpCisJcmVxdWlyZUZyb3plbldpdGhPd25lciA6PSBpLk93bmVyKCkgIT0gIiIgJiYgYW5kcm9pZC5Jbkxpc3QoaS5Pd25lcigpLCBzdHJpbmdzLkZpZWxkcyhtY3R4LkNvbmZpZygpLkdldGVudigiQUlETF9GUk9aRU5fT1dORVJTIikpKQorCXJlcXVpcmVGcm96ZW5CeU93bmVyIDo9IHJlcXVpcmVGcm96ZW5Ob093bmVyIHx8IHJlcXVpcmVGcm96ZW5XaXRoT3duZXIKKwogCS8vIFR3byBkaWZmZXJlbnQgdHlwZXMgb2YgJ3Vuc3RhYmxlJyBoZXJlCiAJLy8gLSAndW5zdGFibGU6IHRydWUnIG1lYW5pbmcgdGhlIG1vZHVsZSBpcyBuZXZlciBzdGFibGUKIAkvLyAtIGN1cnJlbnQgdW5mcm96ZW4gVG9UIHZlcnNpb24KIAkvLwogCS8vIE9FTSBicmFuY2hlcyBtYXkgcmVtb3ZlICdpLk93bmVyKCknIGhlcmUgdG8gYXBwbHkgdGhlIGNoZWNrIHRvIGFsbCBpbnRlcmZhY2VzLCBpbgogCS8vIGFkZGl0aW9uIHRvIGNvcmUgcGxhdGZvcm0gaW50ZXJmYWNlcy4gT3RoZXJ3aXNlLCB3ZSByZWx5IG9uIHZ0c190cmVibGVfdmludGZfdmVuZG9yX3Rlc3QuCi0JcmVxdWlyZUZyb3plblZlcnNpb24gOj0gIXVuc3RhYmxlICYmIHNka0lzRmluYWwgJiYgaS5Pd25lcigpID09ICIiCisJcmVxdWlyZUZyb3plblZlcnNpb24gOj0gIXVuc3RhYmxlICYmIHJlcXVpcmVGcm96ZW5CeU93bmVyCiAKIAkvLyBzdXJmYWNlIGVycm9yIGVhcmx5LCBtYWluIGNoZWNrIGlzIHZpYSBjaGVja1Vuc3RhYmxlTW9kdWxlTXV0YXRvcgogCWlmIHJlcXVpcmVGcm96ZW5WZXJzaW9uICYmICFpLmhhc1ZlcnNpb24oKSB7CkBAIC02ODQsMjEgKzc2MiwyNCBAQAogCXZlcnNpb25zIDo9IGkucHJvcGVydGllcy5WZXJzaW9ucwogCW5leHRWZXJzaW9uIDo9IGkubmV4dFZlcnNpb24oKQogCXNob3VsZEdlbmVyYXRlTGFuZ0JhY2tlbmRNYXAgOj0gbWFwW3N0cmluZ11ib29sewotCQlsYW5nQ3BwOiAgICAgICAgIGkuc2hvdWxkR2VuZXJhdGVDcHBCYWNrZW5kKCksCi0JCWxhbmdOZGs6ICAgICAgICAgaS5zaG91bGRHZW5lcmF0ZUFwcE5ka0JhY2tlbmQoKSwKLQkJbGFuZ05ka1BsYXRmb3JtOiBpLnNob3VsZEdlbmVyYXRlTmRrQmFja2VuZCgpLAotCQlsYW5nSmF2YTogICAgICAgIGkuc2hvdWxkR2VuZXJhdGVKYXZhQmFja2VuZCgpLAotCQlsYW5nUnVzdDogICAgICAgIGkuc2hvdWxkR2VuZXJhdGVSdXN0QmFja2VuZCgpfQorCQlsYW5nQ3BwOiAgaS5zaG91bGRHZW5lcmF0ZUNwcEJhY2tlbmQoKSwKKwkJbGFuZ05kazogIGkuc2hvdWxkR2VuZXJhdGVOZGtCYWNrZW5kKCksCisJCWxhbmdKYXZhOiBpLnNob3VsZEdlbmVyYXRlSmF2YUJhY2tlbmQoKSwKKwkJbGFuZ1J1c3Q6IGkuc2hvdWxkR2VuZXJhdGVSdXN0QmFja2VuZCgpfQorCisJLy8gVGhlIG5ka19wbGF0Zm9ybSBiYWNrZW5kIGlzIGdlbmVyYXRlZCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgd2lsbAorCS8vIGV2ZW50dWFsbHkgYmUgY29tcGxldGVseSByZW1vdmVkIHRoZSBkZXZpY2VzIGluIHRoZSBsb25nIHRhaWwgYXJlIGdvbmUuCisJaWYgbWN0eC5EZXZpY2VDb25maWcoKS5HZW5lcmF0ZUFpZGxOZGtQbGF0Zm9ybUJhY2tlbmQoKSB7CisJCXNob3VsZEdlbmVyYXRlTGFuZ0JhY2tlbmRNYXBbbGFuZ05ka1BsYXRmb3JtXSA9IGkuc2hvdWxkR2VuZXJhdGVOZGtCYWNrZW5kKCkKKwl9CisKIAlmb3IgbGFuZywgc2hvdWxkR2VuZXJhdGUgOj0gcmFuZ2Ugc2hvdWxkR2VuZXJhdGVMYW5nQmFja2VuZE1hcCB7CiAJCWlmICFzaG91bGRHZW5lcmF0ZSB7CiAJCQljb250aW51ZQogCQl9Ci0JCWxpYnMgPSBhcHBlbmQobGlicywgYWRkTGlicmFyeShtY3R4LCBpLCBuZXh0VmVyc2lvbiwgbGFuZykpCi0JCWlmIHJlcXVpcmVGcm96ZW5WZXJzaW9uIHsKLQkJCWFkZFVuc3RhYmxlTW9kdWxlKG1jdHgsIGxpYnNbbGVuKGxpYnMpLTFdKQotCQl9CisJCWxpYnMgPSBhcHBlbmQobGlicywgYWRkTGlicmFyeShtY3R4LCBpLCBuZXh0VmVyc2lvbiwgbGFuZywgcmVxdWlyZUZyb3plblZlcnNpb24pKQogCQlmb3IgXywgdmVyc2lvbiA6PSByYW5nZSB2ZXJzaW9ucyB7Ci0JCQlsaWJzID0gYXBwZW5kKGxpYnMsIGFkZExpYnJhcnkobWN0eCwgaSwgdmVyc2lvbiwgbGFuZykpCisJCQlsaWJzID0gYXBwZW5kKGxpYnMsIGFkZExpYnJhcnkobWN0eCwgaSwgdmVyc2lvbiwgbGFuZywgZmFsc2UpKQogCQl9CiAJfQogCkBAIC03NDIsODYgKzgyMyw5MiBAQAogCX0KIH0KIAotLy8gc3Jjc1Zpc2liaWxpdHkgZ2l2ZXMgdGhlIHZhbHVlIGZvciB0aGUgYHZpc2liaWxpdHlgIHByb3BlcnR5IG9mIHRoZSBzb3VyY2UgZ2VuIG1vZHVsZSBmb3IgdGhlCi0vLyBsYW5ndWFnZSBiYWNrZW5kIGBsYW5nYC4gQnkgZGVmYXVsdCwgdGhlIHNvdXJjZSBnZW4gbW9kdWxlIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBjbGllbnRzIG9mCi0vLyBhaWRsX2ludGVyZmFjZSAoYmVjYXVzZSBpdCdzIGFuIGltcGwgZGV0YWlsKSwgYnV0IHdoZW4gYGJhY2tlbmQuPGJhY2tlbmQ+LnNyY3NfYXZhaWxhYmxlYCBpcyBzZXQKLS8vIHRvIHRydWUsIHRoZSBzb3VyY2UgZ2VuIG1vZHVsZSBmb2xsb3dzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUuCi1mdW5jIHNyY3NWaXNpYmlsaXR5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGxhbmcgc3RyaW5nKSBbXXN0cmluZyB7Ci0JaWYgYSwgb2sgOj0gbWN0eC5Nb2R1bGUoKS4oKmFpZGxJbnRlcmZhY2UpOyAhb2sgewotCQlwYW5pYyhmbXQuRXJyb3JmKCIlcSBpcyBub3QgYWlkbF9pbnRlcmZhY2UiLCBtY3R4Lk1vZHVsZSgpLlN0cmluZygpKSkKLQl9IGVsc2UgewotCQlpZiBwcm9wdG9vbHMuQm9vbChhLmNvbW1vbkJhY2tlbmRQcm9wZXJ0aWVzKGxhbmcpLlNyY3NfYXZhaWxhYmxlKSB7Ci0JCQkvLyBSZXR1cm5pbmcgbmlsIHNvIHRoYXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNvdXJjZSBtb2R1bGUgZGVmYXVsdHMgdG8gdGhlCi0JCQkvLyB0aGUgcGFja2FnZS1sZXZlbCBkZWZhdWx0IHZpc2liaWxpdHkuIFRoaXMgd2F5LCB0aGUgc291cmNlIG1vZHVsZSBnZXRzCi0JCQkvLyB0aGUgc2FtZSB2aXNpYmlsaXR5IGFzIHRoZSBsaWJyYXJ5IG1vZHVsZXMuCi0JCQlyZXR1cm4gbmlsCi0JCX0KLQl9Ci0JcmV0dXJuIFtdc3RyaW5newotCQkiLy8iICsgbWN0eC5Nb2R1bGVEaXIoKSwKLQkJLy8gc3lzdGVtL3Rvb2xzL2FpZGwvYnVpbGQgaXMgYWx3YXlzIGFkZGVkIGJlY2F1c2UgYWlkbF9tZXRhZGF0YV9qc29uIGluIHRoZQotCQkvLyBkaXJlY3RvcnkgaGFzIGRlcGVuZGVuY2llcyB0byBhbGwgYWlkbF9pbnRlcmZhY2UgbW9kdWxlcy4KLQkJIi8vc3lzdGVtL3Rvb2xzL2FpZGwvYnVpbGQiLAotCX0KLX0KLQogZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgTmFtZSgpIHN0cmluZyB7CiAJcmV0dXJuIGkuTW9kdWxlQmFzZS5OYW1lKCkgKyBhaWRsSW50ZXJmYWNlU3VmZml4CiB9CisKIGZ1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIEdlbmVyYXRlQW5kcm9pZEJ1aWxkQWN0aW9ucyhjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0KSB7Ci0JYWlkbFJvb3QgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlU3JjKGN0eCwgaS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyKQotCWZvciBfLCBzcmMgOj0gcmFuZ2UgYW5kcm9pZC5QYXRoc0Zvck1vZHVsZVNyYyhjdHgsIGkucHJvcGVydGllcy5TcmNzKSB7Ci0JCWJhc2VEaXIgOj0gZ2V0QmFzZURpcihjdHgsIHNyYywgYWlkbFJvb3QpCi0JCXJlbFBhdGgsIF8gOj0gZmlsZXBhdGguUmVsKGJhc2VEaXIsIHNyYy5TdHJpbmcoKSkKLQkJY29tcHV0ZWRUeXBlIDo9IHN0cmluZ3MuVHJpbVN1ZmZpeChzdHJpbmdzLlJlcGxhY2VBbGwocmVsUGF0aCwgIi8iLCAiLiIpLCAiLmFpZGwiKQorCXNyY3MsIF8gOj0gZ2V0UGF0aHMoY3R4LCBpLnByb3BlcnRpZXMuU3JjcywgaS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyKQorCWZvciBfLCBzcmMgOj0gcmFuZ2Ugc3JjcyB7CisJCWNvbXB1dGVkVHlwZSA6PSBzdHJpbmdzLlRyaW1TdWZmaXgoc3RyaW5ncy5SZXBsYWNlQWxsKHNyYy5SZWwoKSwgIi8iLCAiLiIpLCAiLmFpZGwiKQogCQlpLmNvbXB1dGVkVHlwZXMgPSBhcHBlbmQoaS5jb21wdXRlZFR5cGVzLCBjb21wdXRlZFR5cGUpCiAJfQorCisJaS5wcmVwcm9jZXNzZWQgPSBtYWtlKG1hcFtzdHJpbmddYW5kcm9pZC5Xcml0YWJsZVBhdGgpCisJLy8gZ2VuZXJhdGUgKGxlbih2ZXJzaW9ucykgKyAxKSBwcmVwcm9jZXNzZWQuYWlkbCBmaWxlcworCWZvciBfLCB2ZXJzaW9uIDo9IHJhbmdlIGNvbmNhdChpLnByb3BlcnRpZXMuVmVyc2lvbnMsIFtdc3RyaW5ne2kubmV4dFZlcnNpb24oKX0pIHsKKwkJaS5wcmVwcm9jZXNzZWRbdmVyc2lvbl0gPSBpLmJ1aWxkUHJlcHJvY2Vzc2VkKGN0eCwgdmVyc2lvbikKKwl9CisJLy8gaGVscGZ1bCBhbGlhc2VzCisJaWYgIXByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkgeworCQlpZiBpLmhhc1ZlcnNpb24oKSB7CisJCQlpLnByZXByb2Nlc3NlZFsibGF0ZXN0Il0gPSBpLnByZXByb2Nlc3NlZFtpLmxhdGVzdFZlcnNpb24oKV0KKwkJfSBlbHNlIHsKKwkJCS8vIHdoZW4gd2UgaGF2ZSBubyBmcm96ZW4gdmVyc2lvbnMgeWV0LCB1c2UgIm5leHQgdmVyc2lvbiIgYXMgbGF0ZXN0CisJCQlpLnByZXByb2Nlc3NlZFsibGF0ZXN0Il0gPSBpLnByZXByb2Nlc3NlZFtpLm5leHRWZXJzaW9uKCldCisJCX0KKwkJaS5wcmVwcm9jZXNzZWRbIiJdID0gaS5wcmVwcm9jZXNzZWRbaS5uZXh0VmVyc2lvbigpXQorCX0KIH0KKworLy8gaW1wb3J0ZWQgaW50ZXJmYWNlcworLy8gVE9ETyhiLzE0NjQzNjI1MSkgdXNlIGltcG9ydHMgaW4gdmVyc2lvbnNfd2l0aF9pbmZvCisvLyBGb3IgZXhhbXBsZSwgZm9vLVYxIHNob3VsZCB1c2UgYmFyLVYxIHdoaWxlIGZvby1WMiBzaG91bGQgdXNlIGJhci1WMgorLy8gICBuYW1lOiAiZm9vIiwKKy8vICAgdmVyc2lvbnNfd2l0aF9pbmZvOiBbCisvLyAgICAgeyB2ZXJzaW9uOiAiMSIsIGltcG9ydHM6IFsiYmFyLVYxIl19LAorLy8gICAgIHsgdmVyc2lvbjogIjIiLCBpbXBvcnRzOiBbImJhci1WMiJdfSwKKy8vICAgXQorZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgZ2V0SW1wb3J0cyh2ZXJzaW9uIHN0cmluZykgbWFwW3N0cmluZ11zdHJpbmcgeworCWltcG9ydHMgOj0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl1c2VMYXRlc3RTdGFibGUgOj0gIXByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5VbnN0YWJsZSkgJiYgdmVyc2lvbiAhPSAiIiAmJiB2ZXJzaW9uICE9IGkubmV4dFZlcnNpb24oKQorCWZvciBfLCBpbXBvcnRTdHJpbmcgOj0gcmFuZ2UgaS5wcm9wZXJ0aWVzLkltcG9ydHMgeworCQluYW1lLCB0YXJnZXRWZXJzaW9uIDo9IHBhcnNlTW9kdWxlV2l0aFZlcnNpb24oaW1wb3J0U3RyaW5nKQorCQlpZiB0YXJnZXRWZXJzaW9uID09ICIiICYmIHVzZUxhdGVzdFN0YWJsZSB7CisJCQl0YXJnZXRWZXJzaW9uID0gImxhdGVzdCIKKwkJfQorCQlpbXBvcnRzW25hbWVdID0gdGFyZ2V0VmVyc2lvbgorCX0KKwlyZXR1cm4gaW1wb3J0cworfQorCisvLyBnZW5lcmF0ZSBwcmVwcm9jZXNzZWQuYWlkbCB3aGljaCBjb250YWlucyBvbmx5IHR5cGVzIHdpdGggZXZhbHVhdGVkIGNvbnN0YW50cy4KKy8vICJpbXBvcnRzIiB3aWxsIHVzZSBwcmVwcm9jZXNzZWQuYWlkbCB3aXRoIC1wIGZsYWcgdG8gYXZvaWQgcGFyc2luZyB0aGUgZW50aXJlIHRyYW5zaXRpdmUgbGlzdAorLy8gb2YgZGVwZW5kZW5jaWVzLgorZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgYnVpbGRQcmVwcm9jZXNzZWQoY3R4IGFuZHJvaWQuTW9kdWxlQ29udGV4dCwgdmVyc2lvbiBzdHJpbmcpIGFuZHJvaWQuV3JpdGFibGVQYXRoIHsKKwlkZXBzIDo9IGdldERlcHMoY3R4LCBpLmdldEltcG9ydHModmVyc2lvbikpCisKKwlwcmVwcm9jZXNzZWQgOj0gYW5kcm9pZC5QYXRoRm9yTW9kdWxlT3V0KGN0eCwgdmVyc2lvbiwgInByZXByb2Nlc3NlZC5haWRsIikKKwlyYiA6PSBhbmRyb2lkLk5ld1J1bGVCdWlsZGVyKHBjdHgsIGN0eCkKKwlzcmNzLCByb290X2RpciA6PSBpLnNyY3NGb3JWZXJzaW9uKGN0eCwgdmVyc2lvbikKKworCWlmIGxlbihzcmNzKSA9PSAwIHsKKwkJY3R4LlByb3BlcnR5RXJyb3JmKCJzcmNzIiwgIk5vIHNvdXJjZXMgZm9yIGEgcHJldmlvdXMgdmVyc2lvbiBpbiAldi4gV2FzIGEgdmVyc2lvbiBtYW51YWxseSBhZGRlZCB0byAuYnAgZmlsZT8gVGhpcyBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IDxtb2R1bGU+LWZyZWV6ZS1hcGkuIiwgcm9vdF9kaXIpCisJfQorCisJcGF0aHMsIGltcG9ydHMgOj0gZ2V0UGF0aHMoY3R4LCBzcmNzLCByb290X2RpcikKKworCXByZXByb2Nlc3NDb21tYW5kIDo9IHJiLkNvbW1hbmQoKS5CdWlsdFRvb2woImFpZGwiKS4KKwkJRmxhZ1dpdGhPdXRwdXQoIi0tcHJlcHJvY2VzcyAiLCBwcmVwcm9jZXNzZWQpLgorCQlGbGFnKCItLXN0cnVjdHVyZWQiKQorCWlmIGkucHJvcGVydGllcy5TdGFiaWxpdHkgIT0gbmlsIHsKKwkJcHJlcHJvY2Vzc0NvbW1hbmQuRmxhZ1dpdGhBcmcoIi0tc3RhYmlsaXR5ICIsICppLnByb3BlcnRpZXMuU3RhYmlsaXR5KQorCX0KKwlwcmVwcm9jZXNzQ29tbWFuZC5GbGFnRm9yRWFjaElucHV0KCItcCIsIGRlcHMucHJlcHJvY2Vzc2VkKQorCXByZXByb2Nlc3NDb21tYW5kLkZsYWdGb3JFYWNoQXJnKCItSSIsIGNvbmNhdChpbXBvcnRzLCBpLnByb3BlcnRpZXMuSW5jbHVkZV9kaXJzKSkKKwlwcmVwcm9jZXNzQ29tbWFuZC5JbnB1dHMocGF0aHMpCisJbmFtZSA6PSBpLkJhc2VNb2R1bGVOYW1lKCkKKwlpZiB2ZXJzaW9uICE9ICIiIHsKKwkJbmFtZSArPSAiLyIgKyB2ZXJzaW9uCisJfQorCXJiLkJ1aWxkKCJleHBvcnRfIituYW1lLCAiZXhwb3J0IHR5cGVzIGZvciAiK25hbWUpCisJcmV0dXJuIHByZXByb2Nlc3NlZAorfQorCiBmdW5jIChpICphaWRsSW50ZXJmYWNlKSBEZXBzTXV0YXRvcihjdHggYW5kcm9pZC5Cb3R0b21VcE11dGF0b3JDb250ZXh0KSB7CiAJY3R4LkFkZFJldmVyc2VEZXBlbmRlbmN5KGN0eC5Nb2R1bGUoKSwgbmlsLCBhaWRsTWV0YWRhdGFTaW5nbGV0b25OYW1lKQogfQogCi12YXIgKAotCWFpZGxJbnRlcmZhY2VzS2V5ICAgPSBhbmRyb2lkLk5ld09uY2VLZXkoImFpZGxJbnRlcmZhY2VzIikKLQl1bnN0YWJsZU1vZHVsZXNLZXkgID0gYW5kcm9pZC5OZXdPbmNlS2V5KCJ1bnN0YWJsZU1vZHVsZXMiKQotCWFpZGxEZXBzS2V5ICAgICAgICAgPSBhbmRyb2lkLk5ld09uY2VLZXkoImFpZGxEZXBzIikKLQlhaWRsSW50ZXJmYWNlTXV0ZXggIHN5bmMuTXV0ZXgKLQl1bnN0YWJsZU1vZHVsZU11dGV4IHN5bmMuTXV0ZXgKLQlhaWRsRGVwc011dGV4ICAgICAgIHN5bmMuUldNdXRleAotKQotCi1mdW5jIGFpZGxJbnRlcmZhY2VzKGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgKltdKmFpZGxJbnRlcmZhY2UgewotCXJldHVybiBjb25maWcuT25jZShhaWRsSW50ZXJmYWNlc0tleSwgZnVuYygpIGludGVyZmFjZXt9IHsKLQkJcmV0dXJuICZbXSphaWRsSW50ZXJmYWNle30KLQl9KS4oKltdKmFpZGxJbnRlcmZhY2UpCi19Ci0KLWZ1bmMgdW5zdGFibGVNb2R1bGVzKGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgKltdc3RyaW5nIHsKLQlyZXR1cm4gY29uZmlnLk9uY2UodW5zdGFibGVNb2R1bGVzS2V5LCBmdW5jKCkgaW50ZXJmYWNle30gewotCQlyZXR1cm4gJltdc3RyaW5ne30KLQl9KS4oKltdc3RyaW5nKQotfQotCi10eXBlIERlcEluZm8gc3RydWN0IHsKLQlpZmFjZU5hbWUgc3RyaW5nCi0JdmVyTGFuZyAgIHN0cmluZwotCWlzU291cmNlICBib29sCi19Ci0KLWZ1bmMgKGQgRGVwSW5mbykgbW9kdWxlTmFtZSgpIHN0cmluZyB7Ci0JbmFtZSA6PSBkLmlmYWNlTmFtZSArIGQudmVyTGFuZwotCWlmIGQuaXNTb3VyY2UgewotCQluYW1lICs9ICItc291cmNlIgotCX0KLQlyZXR1cm4gbmFtZQotfQotCi1mdW5jIGFpZGxEZXBzKGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgbWFwW2FuZHJvaWQuTW9kdWxlXVtdRGVwSW5mbyB7Ci0JcmV0dXJuIGNvbmZpZy5PbmNlKGFpZGxEZXBzS2V5LCBmdW5jKCkgaW50ZXJmYWNle30gewotCQlyZXR1cm4gbWFrZShtYXBbYW5kcm9pZC5Nb2R1bGVdW11EZXBJbmZvKQotCX0pLihtYXBbYW5kcm9pZC5Nb2R1bGVdW11EZXBJbmZvKQotfQotCiBmdW5jIGFpZGxJbnRlcmZhY2VGYWN0b3J5KCkgYW5kcm9pZC5Nb2R1bGUgewogCWkgOj0gJmFpZGxJbnRlcmZhY2V7fQogCWkuQWRkUHJvcGVydGllcygmaS5wcm9wZXJ0aWVzKQpAQCAtODI5LDEyICs5MTYsMyBAQAogCWFuZHJvaWQuQWRkTG9hZEhvb2soaSwgZnVuYyhjdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQpIHsgYWlkbEludGVyZmFjZUhvb2soY3R4LCBpKSB9KQogCXJldHVybiBpCiB9Ci0KLWZ1bmMgbG9va3VwSW50ZXJmYWNlKG5hbWUgc3RyaW5nLCBjb25maWcgYW5kcm9pZC5Db25maWcpICphaWRsSW50ZXJmYWNlIHsKLQlmb3IgXywgaSA6PSByYW5nZSAqYWlkbEludGVyZmFjZXMoY29uZmlnKSB7Ci0JCWlmIGkuTW9kdWxlQmFzZS5OYW1lKCkgPT0gbmFtZSB7Ci0JCQlyZXR1cm4gaQotCQl9Ci0JfQotCXJldHVybiBuaWwKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfaW50ZXJmYWNlX2JhY2tlbmRzLmdvIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2VfYmFja2VuZHMuZ28KaW5kZXggNzliNjYyNS4uYWM0ZmNlNCAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9pbnRlcmZhY2VfYmFja2VuZHMuZ28KKysrIGIvYnVpbGQvYWlkbF9pbnRlcmZhY2VfYmFja2VuZHMuZ28KQEAgLTI2LDE2ICsyNiwxNiBAQAogCSJnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQvcHJvcHRvb2xzIgogKQogCi1mdW5jIGFkZExpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcsIGxhbmcgc3RyaW5nKSBzdHJpbmcgeworZnVuYyBhZGRMaWJyYXJ5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGkgKmFpZGxJbnRlcmZhY2UsIHZlcnNpb24gc3RyaW5nLCBsYW5nIHN0cmluZywgbm90RnJvemVuIGJvb2wpIHN0cmluZyB7CiAJaWYgbGFuZyA9PSBsYW5nSmF2YSB7Ci0JCXJldHVybiBhZGRKYXZhTGlicmFyeShtY3R4LCBpLCB2ZXJzaW9uKQorCQlyZXR1cm4gYWRkSmF2YUxpYnJhcnkobWN0eCwgaSwgdmVyc2lvbiwgbm90RnJvemVuKQogCX0gZWxzZSBpZiBsYW5nID09IGxhbmdSdXN0IHsKLQkJcmV0dXJuIGFkZFJ1c3RMaWJyYXJ5KG1jdHgsIGksIHZlcnNpb24pCisJCXJldHVybiBhZGRSdXN0TGlicmFyeShtY3R4LCBpLCB2ZXJzaW9uLCBub3RGcm96ZW4pCiAJfQotCXJldHVybiBhZGRDcHBMaWJyYXJ5KG1jdHgsIGksIHZlcnNpb24sIGxhbmcpCisJcmV0dXJuIGFkZENwcExpYnJhcnkobWN0eCwgaSwgdmVyc2lvbiwgbGFuZywgbm90RnJvemVuKQogfQogCi1mdW5jIGFkZENwcExpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcsIGxhbmcgc3RyaW5nKSBzdHJpbmcgeworZnVuYyBhZGRDcHBMaWJyYXJ5KG1jdHggYW5kcm9pZC5Mb2FkSG9va0NvbnRleHQsIGkgKmFpZGxJbnRlcmZhY2UsIHZlcnNpb24gc3RyaW5nLCBsYW5nIHN0cmluZywgbm90RnJvemVuIGJvb2wpIHN0cmluZyB7CiAJY3BwU291cmNlR2VuIDo9IGkudmVyc2lvbmVkTmFtZSh2ZXJzaW9uKSArICItIiArIGxhbmcgKyAiLXNvdXJjZSIKIAljcHBNb2R1bGVHZW4gOj0gaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pICsgIi0iICsgbGFuZwogCkBAIC03MywzMCArNzMsMzIgQEAKIAltY3R4LkNyZWF0ZU1vZHVsZShhaWRsR2VuRmFjdG9yeSwgJm5hbWVQcm9wZXJ0aWVzewogCQlOYW1lOiBwcm9wdG9vbHMuU3RyaW5nUHRyKGNwcFNvdXJjZUdlbiksCiAJfSwgJmFpZGxHZW5Qcm9wZXJ0aWVzewotCQlTcmNzOiAgICAgICAgICAgICAgICAgIHNyY3MsCi0JCUFpZGxSb290OiAgICAgICAgICAgICAgYWlkbFJvb3QsCi0JCUlzVG9UOiAgICAgICAgICAgICAgICAgdmVyc2lvbiA9PSBpLm5leHRWZXJzaW9uKCksCi0JCUltcG9ydHNXaXRob3V0VmVyc2lvbjogaS5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiwKLQkJU3RhYmlsaXR5OiAgICAgICAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAotCQlMYW5nOiAgICAgICAgICAgICAgICAgIGxhbmcsCi0JCUJhc2VOYW1lOiAgICAgICAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKLQkJR2VuTG9nOiAgICAgICAgICAgICAgICBnZW5Mb2csCi0JCVZlcnNpb246ICAgICAgICAgICAgICAgaS52ZXJzaW9uRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCi0JCUdlblRyYWNlOiAgICAgICAgICAgICAgZ2VuVHJhY2UsCi0JCVVuc3RhYmxlOiAgICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAotCQlWaXNpYmlsaXR5OiAgICAgICAgICAgIHNyY3NWaXNpYmlsaXR5KG1jdHgsIGxhbmcpLAotCQlGbGFnczogICAgICAgICAgICAgICAgIGkuZmxhZ3NGb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKKwkJU3JjczogICAgICAgICAgICBzcmNzLAorCQlBaWRsUm9vdDogICAgICAgIGFpZGxSb290LAorCQlJbXBvcnRzOiAgICAgICAgIGkucHJvcGVydGllcy5JbXBvcnRzLAorCQlTdGFiaWxpdHk6ICAgICAgIGkucHJvcGVydGllcy5TdGFiaWxpdHksCisJCU1pbl9zZGtfdmVyc2lvbjogaS5taW5TZGtWZXJzaW9uKGxhbmcpLAorCQlMYW5nOiAgICAgICAgICAgIGxhbmcsCisJCUJhc2VOYW1lOiAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKKwkJR2VuTG9nOiAgICAgICAgICBnZW5Mb2csCisJCVZlcnNpb246ICAgICAgICAgaS52ZXJzaW9uRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCisJCUdlblRyYWNlOiAgICAgICAgZ2VuVHJhY2UsCisJCVVuc3RhYmxlOiAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAorCQlOb3RGcm96ZW46ICAgICAgIG5vdEZyb3plbiwKKwkJRmxhZ3M6ICAgICAgICAgICBpLmZsYWdzRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCiAJfSkKIAogCWltcG9ydEV4cG9ydERlcGVuZGVuY2llcyA6PSBbXXN0cmluZ3t9CiAJdmFyIHNoYXJlZExpYkRlcGVuZGVuY3kgW11zdHJpbmcKIAl2YXIgaGVhZGVyTGlicyBbXXN0cmluZwogCXZhciBzZGtWZXJzaW9uICpzdHJpbmcKLQl2YXIgbWluU2RrVmVyc2lvbiAqc3RyaW5nCiAJdmFyIHN0bCAqc3RyaW5nCiAJdmFyIGNwcF9zdGQgKnN0cmluZwogCXZhciBob3N0U3VwcG9ydGVkICpib29sCiAJdmFyIGFkZENmbGFncyBbXXN0cmluZworCXRhcmdldFByb3AgOj0gY2NUYXJnZXRQcm9wZXJ0aWVzeworCQlEYXJ3aW46IGRhcndpblByb3BlcnRpZXN7RW5hYmxlZDogcHJvcHRvb2xzLkJvb2xQdHIoZmFsc2UpfSwKKwl9CiAKIAlpZiBsYW5nID09IGxhbmdDcHAgewogCQlpbXBvcnRFeHBvcnREZXBlbmRlbmNpZXMgPSBhcHBlbmQoaW1wb3J0RXhwb3J0RGVwZW5kZW5jaWVzLCAibGliYmluZGVyIiwgImxpYnV0aWxzIikKQEAgLTEwNCwyNCArMTA2LDI2IEBACiAJCQlzaGFyZWRMaWJEZXBlbmRlbmN5ID0gYXBwZW5kKHNoYXJlZExpYkRlcGVuZGVuY3ksICJsaWJjdXRpbHMiKQogCQl9CiAJCWhvc3RTdXBwb3J0ZWQgPSBpLnByb3BlcnRpZXMuSG9zdF9zdXBwb3J0ZWQKLQkJbWluU2RrVmVyc2lvbiA9IGkucHJvcGVydGllcy5CYWNrZW5kLkNwcC5NaW5fc2RrX3ZlcnNpb24KLQl9IGVsc2UgaWYgbGFuZyA9PSBsYW5nTmRrIHsKKwl9IGVsc2UgaWYgbGFuZyA9PSBsYW5nTmRrIHx8IGxhbmcgPT0gbGFuZ05ka1BsYXRmb3JtIHsKIAkJaW1wb3J0RXhwb3J0RGVwZW5kZW5jaWVzID0gYXBwZW5kKGltcG9ydEV4cG9ydERlcGVuZGVuY2llcywgImxpYmJpbmRlcl9uZGsiKQorCQlub25BcHBQcm9wcyA6PSBpbWFnZVByb3BlcnRpZXN7CisJCQlDZmxhZ3M6IFtdc3RyaW5neyItREJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVCJ9LAorCQl9CiAJCWlmIGdlblRyYWNlIHsKIAkJCXNoYXJlZExpYkRlcGVuZGVuY3kgPSBhcHBlbmQoc2hhcmVkTGliRGVwZW5kZW5jeSwgImxpYmFuZHJvaWQiKQorCQkJbm9uQXBwUHJvcHMuRXhjbHVkZV9zaGFyZWRfbGlicyA9IFtdc3RyaW5neyJsaWJhbmRyb2lkIn0KKwkJCW5vbkFwcFByb3BzLkhlYWRlcl9saWJzID0gW11zdHJpbmd7ImxpYmFuZHJvaWRfYWlkbHRyYWNlIn0KKwkJCW5vbkFwcFByb3BzLlNoYXJlZF9saWJzID0gW11zdHJpbmd7ImxpYmN1dGlscyJ9CiAJCX0KLQkJc2RrVmVyc2lvbiA9IHByb3B0b29scy5TdHJpbmdQdHIoImN1cnJlbnQiKQotCQlzdGwgPSBwcm9wdG9vbHMuU3RyaW5nUHRyKCJjKytfc2hhcmVkIikKLQkJbWluU2RrVmVyc2lvbiA9IGkucHJvcGVydGllcy5CYWNrZW5kLk5kay5NaW5fc2RrX3ZlcnNpb24KLQl9IGVsc2UgaWYgbGFuZyA9PSBsYW5nTmRrUGxhdGZvcm0gewotCQlpbXBvcnRFeHBvcnREZXBlbmRlbmNpZXMgPSBhcHBlbmQoaW1wb3J0RXhwb3J0RGVwZW5kZW5jaWVzLCAibGliYmluZGVyX25kayIpCi0JCWlmIGdlblRyYWNlIHsKLQkJCWhlYWRlckxpYnMgPSBhcHBlbmQoaGVhZGVyTGlicywgImxpYmFuZHJvaWRfYWlkbHRyYWNlIikKLQkJCXNoYXJlZExpYkRlcGVuZGVuY3kgPSBhcHBlbmQoc2hhcmVkTGliRGVwZW5kZW5jeSwgImxpYmN1dGlscyIpCi0JCX0KKwkJdGFyZ2V0UHJvcC5QbGF0Zm9ybSA9IG5vbkFwcFByb3BzCisJCXRhcmdldFByb3AuVmVuZG9yID0gbm9uQXBwUHJvcHMKKwkJdGFyZ2V0UHJvcC5Qcm9kdWN0ID0gbm9uQXBwUHJvcHMKIAkJaG9zdFN1cHBvcnRlZCA9IGkucHJvcGVydGllcy5Ib3N0X3N1cHBvcnRlZAotCQlhZGRDZmxhZ3MgPSBhcHBlbmQoYWRkQ2ZsYWdzLCAiLURCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQiKQotCQltaW5TZGtWZXJzaW9uID0gaS5wcm9wZXJ0aWVzLkJhY2tlbmQuTmRrLk1pbl9zZGtfdmVyc2lvbgorCQlpZiBsYW5nID09IGxhbmdOZGsgJiYgaS5zaG91bGRHZW5lcmF0ZUFwcE5ka0JhY2tlbmQoKSB7CisJCQlzZGtWZXJzaW9uID0gcHJvcHRvb2xzLlN0cmluZ1B0cigiY3VycmVudCIpCisJCQkvLyBEb24ndCB3b3JyeSEgVGhpcyBtYXBzIHRvIGxpYmMrKy5zbyBmb3IgdGhlIHBsYXRmb3JtIHZhcmlhbnQuCisJCQlzdGwgPSBwcm9wdG9vbHMuU3RyaW5nUHRyKCJjKytfc2hhcmVkIikKKwkJfQogCX0gZWxzZSB7CiAJCXBhbmljKCJVbnJlY29nbml6ZWQgbGFuZ3VhZ2U6ICIgKyBsYW5nKQogCX0KQEAgLTEyOSw2ICsxMzMsNyBAQAogCXZlbmRvckF2YWlsYWJsZSA6PSBpLnByb3BlcnRpZXMuVmVuZG9yX2F2YWlsYWJsZQogCW9kbUF2YWlsYWJsZSA6PSBpLnByb3BlcnRpZXMuT2RtX2F2YWlsYWJsZQogCXByb2R1Y3RBdmFpbGFibGUgOj0gaS5wcm9wZXJ0aWVzLlByb2R1Y3RfYXZhaWxhYmxlCisJcmVjb3ZlcnlBdmFpbGFibGUgOj0gaS5wcm9wZXJ0aWVzLlJlY292ZXJ5X2F2YWlsYWJsZQogCWlmIGxhbmcgPT0gbGFuZ0NwcCB7CiAJCS8vIFZlbmRvciBhbmQgcHJvZHVjdCBtb2R1bGVzIGNhbm5vdCB1c2UgdGhlIGxpYmJpbmRlciAoY3BwKSBiYWNrZW5kIG9mIEFJREwgaW4gYQogCQkvLyB3YXkgdGhhdCBpcyBzdGFibGUuIFNvLCBpbiBvcmRlciB0byBwcmV2ZW50IGFjY2lkZW50YWwgdXNhZ2Ugb2YgdGhlc2UgbGlicmFyeSBieQpAQCAtMTQ1LDMxICsxNTAsMjAgQEAKIAkJcHJvZHVjdEF2YWlsYWJsZSA9IG5pbAogCX0KIAotCWlmIGxhbmcgPT0gbGFuZ05kayB7Ci0JCS8vIFRPRE8oYi8xMjExNTc1NTUpOiB3aGVuIHRoZSBOREsgdmFyaWFudCBpcyBpdHMgb3duIHZhcmlhbnQsIHRoZXNlIHdvdWxkbid0IGludGVyYWN0LAotCQkvLyBidXQgd2UgY2FuJ3QgY3JlYXRlIGEgdmVuZG9yIG9yIHByb2R1Y3QgdmVyc2lvbiBvZiBhbiBOREsgdmFyaWFudAotCQkvLwotCQkvLyBuaWwgKHVuc3BlY2lmaWVkKSBpcyB1c2VkIGluc3RlYWQgb2YgZmFsc2Ugc28gdGhhdCB0aGlzIGNhbid0IGNvbmZsaWN0IHdpdGgKLQkJLy8gJ3ZlbmRvcjogdHJ1ZScsIGZvciBpbnN0YW5jZS4KLQkJdmVuZG9yQXZhaWxhYmxlID0gbmlsCi0JCW9kbUF2YWlsYWJsZSA9IG5pbAotCQlwcm9kdWN0QXZhaWxhYmxlID0gbmlsCi0JCW92ZXJyaWRlVm5ka1Byb3BlcnRpZXMuVm5kay5FbmFibGVkID0gcHJvcHRvb2xzLkJvb2xQdHIoZmFsc2UpCi0JCW92ZXJyaWRlVm5ka1Byb3BlcnRpZXMuVm5kay5TdXBwb3J0X3N5c3RlbV9wcm9jZXNzID0gcHJvcHRvb2xzLkJvb2xQdHIoZmFsc2UpCi0JfQotCiAJbWN0eC5DcmVhdGVNb2R1bGUoYWlkbEltcGxlbWVudGF0aW9uR2VuZXJhdG9yRmFjdG9yeSwgJm5hbWVQcm9wZXJ0aWVzewogCQlOYW1lOiBwcm9wdG9vbHMuU3RyaW5nUHRyKGNwcE1vZHVsZUdlbiArICItZ2VuZXJhdG9yIiksCiAJfSwgJmFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvclByb3BlcnRpZXN7CiAJCUxhbmc6ICAgICAgICAgICAgICBsYW5nLAogCQlBaWRsSW50ZXJmYWNlTmFtZTogaS5Nb2R1bGVCYXNlLk5hbWUoKSwKIAkJVmVyc2lvbjogICAgICAgICAgIHZlcnNpb24sCisJCUltcG9ydHM6ICAgICAgICAgICBpLnByb3BlcnRpZXMuSW1wb3J0cywKIAkJTW9kdWxlUHJvcGVydGllczogW11pbnRlcmZhY2V7fXsKIAkJCSZjY1Byb3BlcnRpZXN7CiAJCQkJTmFtZTogICAgICAgICAgICAgICAgICAgICAgcHJvcHRvb2xzLlN0cmluZ1B0cihjcHBNb2R1bGVHZW4pLAogCQkJCVZlbmRvcl9hdmFpbGFibGU6ICAgICAgICAgIHZlbmRvckF2YWlsYWJsZSwKIAkJCQlPZG1fYXZhaWxhYmxlOiAgICAgICAgICAgICBvZG1BdmFpbGFibGUsCiAJCQkJUHJvZHVjdF9hdmFpbGFibGU6ICAgICAgICAgcHJvZHVjdEF2YWlsYWJsZSwKKwkJCQlSZWNvdmVyeV9hdmFpbGFibGU6ICAgICAgICByZWNvdmVyeUF2YWlsYWJsZSwKIAkJCQlIb3N0X3N1cHBvcnRlZDogICAgICAgICAgICBob3N0U3VwcG9ydGVkLAogCQkJCURlZmF1bHRzOiAgICAgICAgICAgICAgICAgIFtdc3RyaW5neyJhaWRsLWNwcC1tb2R1bGUtZGVmYXVsdHMifSwKIAkJCQlEb3VibGVfbG9hZGFibGU6ICAgICAgICAgICBpLnByb3BlcnRpZXMuRG91YmxlX2xvYWRhYmxlLApAQCAtMTg0LDIxICsxNzgsOSBAQAogCQkJCUNwcF9zdGQ6ICAgICAgICAgICAgICAgICAgIGNwcF9zdGQsCiAJCQkJQ2ZsYWdzOiAgICAgICAgICAgICAgICAgICAgYXBwZW5kKGFkZENmbGFncywgIi1XZXh0cmEiLCAiLVdhbGwiLCAiLVdlcnJvciIsICItV2V4dHJhLXNlbWkiKSwKIAkJCQlBcGV4X2F2YWlsYWJsZTogICAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLkFwZXhfYXZhaWxhYmxlLAotCQkJCU1pbl9zZGtfdmVyc2lvbjogICAgICAgICAgIG1pblNka1ZlcnNpb24sCi0JCQkJVXNlQXBleE5hbWVNYWNybzogICAgICAgICAgdHJ1ZSwKLQkJCQlUYXJnZXQ6IGNjVGFyZ2V0UHJvcGVydGllc3sKLQkJCQkJLy8gQ3VycmVudGx5IG5lY2Vzc2FyeSBmb3IgaG9zdCBidWlsZHMKLQkJCQkJLy8gVE9ETyhiLzMxNTU5MDk1KTogYmlvbmljIG9uIGhvc3Qgc2hvdWxkIGRlZmluZSB0aGlzCi0JCQkJCS8vIFRPRE8oYi8xNDY0MzYyNTEpOiBkZWZhdWx0IGlzbid0IGFwcGxpZWQgYmVjYXVzZSB0aGUgbW9kdWxlIGlzIGNyZWF0ZWQKLQkJCQkJLy8gaW4gUHJlQXJjaE11dGF0b3JzLCB3aGVuIGltcG9ydCBiZWhhdmlvciBiZWNvbWVzIGV4cGxpY2l0LCB0aGUgbG9naWMgY2FuCi0JCQkJCS8vIGJlIG1vdmVkIGJhY2sgdG8gTG9hZEhvb2sKLQkJCQkJSG9zdDogaG9zdFByb3BlcnRpZXN7Q2ZsYWdzOiBbXXN0cmluZ3sKLQkJCQkJCSItRF9fSU5UUk9EVUNFRF9JTihuKT0iLAotCQkJCQkJIi1EX19hc3NlcnQoYSxiLGMpPSIsCi0JCQkJCQkvLyBXZSB3YW50IGFsbCB0aGUgQVBJcyB0byBiZSBhdmFpbGFibGUgb24gdGhlIGhvc3QuCi0JCQkJCQkiLURfX0FORFJPSURfQVBJX189MTAwMDAifX0sCi0JCQkJCURhcndpbjogcGVyVGFyZ2V0UHJvcGVydGllc3tFbmFibGVkOiBwcm9wdG9vbHMuQm9vbFB0cihmYWxzZSl9fSwKLQkJCQlUaWR5OiBwcm9wdG9vbHMuQm9vbFB0cih0cnVlKSwKKwkJCQlNaW5fc2RrX3ZlcnNpb246ICAgICAgICAgICBpLm1pblNka1ZlcnNpb24obGFuZyksCisJCQkJVGFyZ2V0OiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcCwKKwkJCQlUaWR5OiAgICAgICAgICAgICAgICAgICAgICBwcm9wdG9vbHMuQm9vbFB0cih0cnVlKSwKIAkJCQkvLyBEbyB0aGUgdGlkeSBjaGVjayBvbmx5IGZvciB0aGUgZ2VuZXJhdGVkIGhlYWRlcnMKIAkJCQlUaWR5X2ZsYWdzOiAgICAgICAgICAgIFtdc3RyaW5neyItLWhlYWRlci1maWx0ZXI9IiArIGFuZHJvaWQuUGF0aEZvck91dHB1dChtY3R4KS5TdHJpbmcoKSArICIuKiJ9LAogCQkJCVRpZHlfY2hlY2tzX2FzX2Vycm9yczogW11zdHJpbmd7IioifSwKQEAgLTIxMSw3ICsxOTMsNyBAQAogCXJldHVybiBjcHBNb2R1bGVHZW4KIH0KIAotZnVuYyBhZGRKYXZhTGlicmFyeShtY3R4IGFuZHJvaWQuTG9hZEhvb2tDb250ZXh0LCBpICphaWRsSW50ZXJmYWNlLCB2ZXJzaW9uIHN0cmluZykgc3RyaW5nIHsKK2Z1bmMgYWRkSmF2YUxpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcsIG5vdEZyb3plbiBib29sKSBzdHJpbmcgewogCWphdmFTb3VyY2VHZW4gOj0gaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pICsgIi1qYXZhLXNvdXJjZSIKIAlqYXZhTW9kdWxlR2VuIDo9IGkudmVyc2lvbmVkTmFtZSh2ZXJzaW9uKSArICItamF2YSIKIAlzcmNzLCBhaWRsUm9vdCA6PSBpLnNyY3NGb3JWZXJzaW9uKG1jdHgsIHZlcnNpb24pCkBAIC0yMjEsMjggKzIwMywzNCBAQAogCQkvLyBEb24ndCBjcmVhdGUgYSBsaWJyYXJ5IGZvciB0aGUgeWV0LXRvLWJlLWZyb3plbiB2ZXJzaW9uLgogCQlyZXR1cm4gIiIKIAl9Ci0KKwltaW5TZGtWZXJzaW9uIDo9IGkubWluU2RrVmVyc2lvbihsYW5nSmF2YSkKIAlzZGtWZXJzaW9uIDo9IGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuU2RrX3ZlcnNpb24KIAlpZiAhcHJvcHRvb2xzLkJvb2woaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5QbGF0Zm9ybV9hcGlzKSAmJiBzZGtWZXJzaW9uID09IG5pbCB7CiAJCS8vIHBsYXRmb3JtIGFwaXMgcmVxdWlyZXMgbm8gZGVmYXVsdAogCQlzZGtWZXJzaW9uID0gcHJvcHRvb2xzLlN0cmluZ1B0cigic3lzdGVtX2N1cnJlbnQiKQogCX0KKwkvLyB1c2Ugc2RrVmVyc2lvbiBpZiBtaW5TZGtWZXJzaW9uIGlzIG5vdCBzZXQKKwlpZiBzZGtWZXJzaW9uICE9IG5pbCAmJiBtaW5TZGtWZXJzaW9uID09IG5pbCB7CisJCW1pblNka1ZlcnNpb24gPSBwcm9wdG9vbHMuU3RyaW5nUHRyKGFuZHJvaWQuU2RrU3BlY0Zyb20obWN0eCwgKnNka1ZlcnNpb24pLkFwaUxldmVsLlN0cmluZygpKQorCX0KIAogCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxHZW5GYWN0b3J5LCAmbmFtZVByb3BlcnRpZXN7CiAJCU5hbWU6IHByb3B0b29scy5TdHJpbmdQdHIoamF2YVNvdXJjZUdlbiksCiAJfSwgJmFpZGxHZW5Qcm9wZXJ0aWVzewotCQlTcmNzOiAgICAgICAgICAgICAgICAgIHNyY3MsCi0JCUFpZGxSb290OiAgICAgICAgICAgICAgYWlkbFJvb3QsCi0JCUlzVG9UOiAgICAgICAgICAgICAgICAgdmVyc2lvbiA9PSBpLm5leHRWZXJzaW9uKCksCi0JCUltcG9ydHNXaXRob3V0VmVyc2lvbjogaS5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiwKLQkJU3RhYmlsaXR5OiAgICAgICAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAotCQlMYW5nOiAgICAgICAgICAgICAgICAgIGxhbmdKYXZhLAotCQlCYXNlTmFtZTogICAgICAgICAgICAgIGkuTW9kdWxlQmFzZS5OYW1lKCksCi0JCVZlcnNpb246ICAgICAgICAgICAgICAgaS52ZXJzaW9uRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCi0JCUdlblRyYWNlOiAgICAgICAgICAgICAgcHJvcHRvb2xzLkJvb2woaS5wcm9wZXJ0aWVzLkdlbl90cmFjZSksCi0JCVVuc3RhYmxlOiAgICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAotCQlWaXNpYmlsaXR5OiAgICAgICAgICAgIHNyY3NWaXNpYmlsaXR5KG1jdHgsIGxhbmdKYXZhKSwKLQkJRmxhZ3M6ICAgICAgICAgICAgICAgICBpLmZsYWdzRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCisJCVNyY3M6ICAgICAgICAgICAgc3JjcywKKwkJQWlkbFJvb3Q6ICAgICAgICBhaWRsUm9vdCwKKwkJSW1wb3J0czogICAgICAgICBpLnByb3BlcnRpZXMuSW1wb3J0cywKKwkJU3RhYmlsaXR5OiAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAorCQlNaW5fc2RrX3ZlcnNpb246IG1pblNka1ZlcnNpb24sCisJCVBsYXRmb3JtX2FwaXM6ICAgcHJvcHRvb2xzLkJvb2woaS5wcm9wZXJ0aWVzLkJhY2tlbmQuSmF2YS5QbGF0Zm9ybV9hcGlzKSwKKwkJTGFuZzogICAgICAgICAgICBsYW5nSmF2YSwKKwkJQmFzZU5hbWU6ICAgICAgICBpLk1vZHVsZUJhc2UuTmFtZSgpLAorCQlWZXJzaW9uOiAgICAgICAgIGkudmVyc2lvbkZvckFpZGxHZW5SdWxlKHZlcnNpb24pLAorCQlHZW5ScGM6ICAgICAgICAgIHByb3B0b29scy5Cb29sKGkucHJvcGVydGllcy5CYWNrZW5kLkphdmEuR2VuX3JwYyksCisJCUdlblRyYWNlOiAgICAgICAgcHJvcHRvb2xzLkJvb2woaS5wcm9wZXJ0aWVzLkdlbl90cmFjZSksCisJCVVuc3RhYmxlOiAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAorCQlOb3RGcm96ZW46ICAgICAgIG5vdEZyb3plbiwKKwkJRmxhZ3M6ICAgICAgICAgICBpLmZsYWdzRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCiAJfSkKIAogCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvckZhY3RvcnksICZuYW1lUHJvcGVydGllc3sKQEAgLTI1MSw2ICsyMzksNyBAQAogCQlMYW5nOiAgICAgICAgICAgICAgbGFuZ0phdmEsCiAJCUFpZGxJbnRlcmZhY2VOYW1lOiBpLk1vZHVsZUJhc2UuTmFtZSgpLAogCQlWZXJzaW9uOiAgICAgICAgICAgdmVyc2lvbiwKKwkJSW1wb3J0czogICAgICAgICAgIGkucHJvcGVydGllcy5JbXBvcnRzLAogCQlNb2R1bGVQcm9wZXJ0aWVzOiBbXWludGVyZmFjZXt9eyZqYXZhUHJvcGVydGllc3sKIAkJCU5hbWU6ICAgICAgICAgICAgcHJvcHRvb2xzLlN0cmluZ1B0cihqYXZhTW9kdWxlR2VuKSwKIAkJCUluc3RhbGxhYmxlOiAgICAgcHJvcHRvb2xzLkJvb2xQdHIodHJ1ZSksCkBAIC0yNTksMTQgKzI0OCwxNCBAQAogCQkJUGxhdGZvcm1fYXBpczogICBpLnByb3BlcnRpZXMuQmFja2VuZC5KYXZhLlBsYXRmb3JtX2FwaXMsCiAJCQlTcmNzOiAgICAgICAgICAgIFtdc3RyaW5neyI6IiArIGphdmFTb3VyY2VHZW59LAogCQkJQXBleF9hdmFpbGFibGU6ICBpLnByb3BlcnRpZXMuQmFja2VuZC5KYXZhLkFwZXhfYXZhaWxhYmxlLAotCQkJTWluX3Nka192ZXJzaW9uOiBpLnByb3BlcnRpZXMuQmFja2VuZC5KYXZhLk1pbl9zZGtfdmVyc2lvbiwKLQkJfX0sCisJCQlNaW5fc2RrX3ZlcnNpb246IGkubWluU2RrVmVyc2lvbihsYW5nSmF2YSksCisJCX0sICZpLnByb3BlcnRpZXMuQmFja2VuZC5KYXZhLkxpbnRQcm9wZXJ0aWVzfSwKIAl9KQogCiAJcmV0dXJuIGphdmFNb2R1bGVHZW4KIH0KIAotZnVuYyBhZGRSdXN0TGlicmFyeShtY3R4IGFuZHJvaWQuTG9hZEhvb2tDb250ZXh0LCBpICphaWRsSW50ZXJmYWNlLCB2ZXJzaW9uIHN0cmluZykgc3RyaW5nIHsKK2Z1bmMgYWRkUnVzdExpYnJhcnkobWN0eCBhbmRyb2lkLkxvYWRIb29rQ29udGV4dCwgaSAqYWlkbEludGVyZmFjZSwgdmVyc2lvbiBzdHJpbmcsIG5vdEZyb3plbiBib29sKSBzdHJpbmcgewogCXJ1c3RTb3VyY2VHZW4gOj0gaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pICsgIi1ydXN0LXNvdXJjZSIKIAlydXN0TW9kdWxlR2VuIDo9IGkudmVyc2lvbmVkTmFtZSh2ZXJzaW9uKSArICItcnVzdCIKIAlzcmNzLCBhaWRsUm9vdCA6PSBpLnNyY3NGb3JWZXJzaW9uKG1jdHgsIHZlcnNpb24pCkBAIC0yODAsMzAgKzI2OSwzMiBAQAogCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxHZW5GYWN0b3J5LCAmbmFtZVByb3BlcnRpZXN7CiAJCU5hbWU6IHByb3B0b29scy5TdHJpbmdQdHIocnVzdFNvdXJjZUdlbiksCiAJfSwgJmFpZGxHZW5Qcm9wZXJ0aWVzewotCQlTcmNzOiAgICAgICAgICAgICAgICAgIHNyY3MsCi0JCUFpZGxSb290OiAgICAgICAgICAgICAgYWlkbFJvb3QsCi0JCUltcG9ydHNXaXRob3V0VmVyc2lvbjogaS5wcm9wZXJ0aWVzLkltcG9ydHNXaXRob3V0VmVyc2lvbiwKLQkJSXNUb1Q6ICAgICAgICAgICAgICAgICB2ZXJzaW9uID09IGkubmV4dFZlcnNpb24oKSwKLQkJU3RhYmlsaXR5OiAgICAgICAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAotCQlMYW5nOiAgICAgICAgICAgICAgICAgIGxhbmdSdXN0LAotCQlCYXNlTmFtZTogICAgICAgICAgICAgIGkuTW9kdWxlQmFzZS5OYW1lKCksCi0JCVZlcnNpb246ICAgICAgICAgICAgICAgaS52ZXJzaW9uRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCi0JCVVuc3RhYmxlOiAgICAgICAgICAgICAgaS5wcm9wZXJ0aWVzLlVuc3RhYmxlLAotCQlWaXNpYmlsaXR5OiAgICAgICAgICAgIHNyY3NWaXNpYmlsaXR5KG1jdHgsIGxhbmdSdXN0KSwKLQkJRmxhZ3M6ICAgICAgICAgICAgICAgICBpLmZsYWdzRm9yQWlkbEdlblJ1bGUodmVyc2lvbiksCisJCVNyY3M6ICAgICAgICAgICAgc3JjcywKKwkJQWlkbFJvb3Q6ICAgICAgICBhaWRsUm9vdCwKKwkJSW1wb3J0czogICAgICAgICBpLnByb3BlcnRpZXMuSW1wb3J0cywKKwkJU3RhYmlsaXR5OiAgICAgICBpLnByb3BlcnRpZXMuU3RhYmlsaXR5LAorCQlNaW5fc2RrX3ZlcnNpb246IGkubWluU2RrVmVyc2lvbihsYW5nUnVzdCksCisJCUxhbmc6ICAgICAgICAgICAgbGFuZ1J1c3QsCisJCUJhc2VOYW1lOiAgICAgICAgaS5Nb2R1bGVCYXNlLk5hbWUoKSwKKwkJVmVyc2lvbjogICAgICAgICBpLnZlcnNpb25Gb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKKwkJVW5zdGFibGU6ICAgICAgICBpLnByb3BlcnRpZXMuVW5zdGFibGUsCisJCU5vdEZyb3plbjogICAgICAgbm90RnJvemVuLAorCQlGbGFnczogICAgICAgICAgIGkuZmxhZ3NGb3JBaWRsR2VuUnVsZSh2ZXJzaW9uKSwKIAl9KQogCiAJdmVyc2lvbmVkUnVzdE5hbWUgOj0gZml4UnVzdE5hbWUoaS52ZXJzaW9uZWROYW1lKHZlcnNpb24pKQogCXJ1c3RDcmF0ZU5hbWUgOj0gZml4UnVzdE5hbWUoaS5Nb2R1bGVCYXNlLk5hbWUoKSkKIAotCW1jdHguQ3JlYXRlTW9kdWxlKGFpZGxSdXN0TGlicmFyeUZhY3RvcnksICZydXN0UHJvcGVydGllc3sKLQkJTmFtZTogICAgICAgICAgIHByb3B0b29scy5TdHJpbmdQdHIocnVzdE1vZHVsZUdlbiksCi0JCUNyYXRlX25hbWU6ICAgICBydXN0Q3JhdGVOYW1lLAotCQlTdGVtOiAgICAgICAgICAgcHJvcHRvb2xzLlN0cmluZ1B0cigibGliIiArIHZlcnNpb25lZFJ1c3ROYW1lKSwKLQkJRGVmYXVsdHM6ICAgICAgIFtdc3RyaW5neyJhaWRsLXJ1c3QtbW9kdWxlLWRlZmF1bHRzIn0sCi0JCUhvc3Rfc3VwcG9ydGVkOiBpLnByb3BlcnRpZXMuSG9zdF9zdXBwb3J0ZWQsCi0JCUFwZXhfYXZhaWxhYmxlOiBpLnByb3BlcnRpZXMuQmFja2VuZC5SdXN0LkFwZXhfYXZhaWxhYmxlLAotCQlUYXJnZXQ6ICAgICAgICAgcnVzdFRhcmdldFByb3BlcnRpZXN7RGFyd2luOiBwZXJUYXJnZXRQcm9wZXJ0aWVze0VuYWJsZWQ6IHByb3B0b29scy5Cb29sUHRyKGZhbHNlKX19LAorCW1jdHguQ3JlYXRlTW9kdWxlKHdyYXBMaWJyYXJ5RmFjdG9yeShhaWRsUnVzdExpYnJhcnlGYWN0b3J5KSwgJnJ1c3RQcm9wZXJ0aWVzeworCQlOYW1lOiAgICAgICAgICAgICBwcm9wdG9vbHMuU3RyaW5nUHRyKHJ1c3RNb2R1bGVHZW4pLAorCQlDcmF0ZV9uYW1lOiAgICAgICBydXN0Q3JhdGVOYW1lLAorCQlTdGVtOiAgICAgICAgICAgICBwcm9wdG9vbHMuU3RyaW5nUHRyKCJsaWIiICsgdmVyc2lvbmVkUnVzdE5hbWUpLAorCQlEZWZhdWx0czogICAgICAgICBbXXN0cmluZ3siYWlkbC1ydXN0LW1vZHVsZS1kZWZhdWx0cyJ9LAorCQlIb3N0X3N1cHBvcnRlZDogICBpLnByb3BlcnRpZXMuSG9zdF9zdXBwb3J0ZWQsCisJCVZlbmRvcl9hdmFpbGFibGU6IGkucHJvcGVydGllcy5WZW5kb3JfYXZhaWxhYmxlLAorCQlBcGV4X2F2YWlsYWJsZTogICBpLnByb3BlcnRpZXMuQmFja2VuZC5SdXN0LkFwZXhfYXZhaWxhYmxlLAorCQlNaW5fc2RrX3ZlcnNpb246ICBpLm1pblNka1ZlcnNpb24obGFuZ1J1c3QpLAorCQlUYXJnZXQ6ICAgICAgICAgICBydXN0VGFyZ2V0UHJvcGVydGllc3tEYXJ3aW46IGRhcndpblByb3BlcnRpZXN7RW5hYmxlZDogcHJvcHRvb2xzLkJvb2xQdHIoZmFsc2UpfX0sCiAJfSwgJnJ1c3QuU291cmNlUHJvdmlkZXJQcm9wZXJ0aWVzewogCQlTb3VyY2Vfc3RlbTogcHJvcHRvb2xzLlN0cmluZ1B0cih2ZXJzaW9uZWRSdXN0TmFtZSksCiAJfSwgJmFpZGxSdXN0U291cmNlUHJvdmlkZXJQcm9wZXJ0aWVzewpAQCAtMzMxLDcgKzMyMiw3IEBACiAJcmV0dXJuIG5hbWUgKyAiLVYiICsgdmVyc2lvbgogfQogCi1mdW5jIChpICphaWRsSW50ZXJmYWNlKSBzcmNzRm9yVmVyc2lvbihtY3R4IGFuZHJvaWQuTG9hZEhvb2tDb250ZXh0LCB2ZXJzaW9uIHN0cmluZykgKHNyY3MgW11zdHJpbmcsIGFpZGxSb290IHN0cmluZykgeworZnVuYyAoaSAqYWlkbEludGVyZmFjZSkgc3Jjc0ZvclZlcnNpb24obWN0eCBhbmRyb2lkLkVhcmx5TW9kdWxlQ29udGV4dCwgdmVyc2lvbiBzdHJpbmcpIChzcmNzIFtdc3RyaW5nLCBhaWRsUm9vdCBzdHJpbmcpIHsKIAlpZiB2ZXJzaW9uID09IGkubmV4dFZlcnNpb24oKSB7CiAJCXJldHVybiBpLnByb3BlcnRpZXMuU3JjcywgaS5wcm9wZXJ0aWVzLkxvY2FsX2luY2x1ZGVfZGlyCiAJfSBlbHNlIHsKQEAgLTM4NywxMSArMzc4LDEwIEBACiAvLyBUb1QgdmVyc2lvbihpbmNsdWRpbmcgdW5zdGFibGUpICAgICB8IHdoYXRldmVyICAgICAgICAgICAgICAgIHwgVG9UIHZlcnNpb24odW5zdGFibGUgaWYgdW5zdGFibGUpCiAvLyBvdGhlcndpc2UgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoYXRldmVyICAgICAgICAgICAgICAgIHwgdGhlIGxhdGVzdCBzdGFibGUgdmVyc2lvbgogLy8gSW4gdGhlIGNhc2UgdGhhdCBpbXBvcnQgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIHdoaWNoIGl0IHdhbnRzIHRvIHVzZSwgdXNlIHRoYXQgdmVyc2lvbi4KLWZ1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIGdldEltcG9ydFdpdGhWZXJzaW9uKHZlcnNpb24gc3RyaW5nLCBhbkltcG9ydCBzdHJpbmcsIGNvbmZpZyBhbmRyb2lkLkNvbmZpZykgc3RyaW5nIHsKK2Z1bmMgKGkgKmFpZGxJbnRlcmZhY2UpIGdldEltcG9ydFdpdGhWZXJzaW9uKHZlcnNpb24gc3RyaW5nLCBhbkltcG9ydCBzdHJpbmcsIG90aGVyICphaWRsSW50ZXJmYWNlKSBzdHJpbmcgewogCWlmIGhhc1ZlcnNpb25TdWZmaXgoYW5JbXBvcnQpIHsKIAkJcmV0dXJuIGFuSW1wb3J0CiAJfQotCW90aGVyIDo9IGxvb2t1cEludGVyZmFjZShhbkltcG9ydCwgY29uZmlnKQogCWlmIHByb3B0b29scy5Cb29sKG90aGVyLnByb3BlcnRpZXMuVW5zdGFibGUpIHsKIAkJcmV0dXJuIGFuSW1wb3J0CiAJfQpAQCAtNDAxLDYgKzM5MSwyMSBAQAogCXJldHVybiBvdGhlci52ZXJzaW9uZWROYW1lKG90aGVyLmxhdGVzdFZlcnNpb24oKSkKIH0KIAorLy8gQXNzdW1pbmcgdGhhdCB0aGUgY29udGV4dCBtb2R1bGUgaGFzIGRlcHMgdG8gaXRzIG9yaWdpbmFsIGFpZGxfaW50ZXJmYWNlIGFuZCBpbXBvcnRlZAorLy8gYWlkbF9pbnRlcmZhY2UgbW9kdWxlcyB3aXRoIGludGVyZmFjZURlcFRhZyBhbmQgaW1wb3J0SW50ZXJmYWNlRGVwVGFnLCByZXR1cm5zIHRoZSBsaXN0IG9mCisvLyBpbXBvcnRlZCBpbnRlcmZhY2VzIHdpdGggdmVyc2lvbnMuCitmdW5jIGdldEltcG9ydHNXaXRoVmVyc2lvbihjdHggYW5kcm9pZC5CYXNlTXV0YXRvckNvbnRleHQsIGludGVyZmFjZU5hbWUsIHZlcnNpb24gc3RyaW5nKSBbXXN0cmluZyB7CisJaSA6PSBjdHguR2V0RGlyZWN0RGVwV2l0aFRhZyhpbnRlcmZhY2VOYW1lK2FpZGxJbnRlcmZhY2VTdWZmaXgsIGludGVyZmFjZURlcCkuKCphaWRsSW50ZXJmYWNlKQorCXZhciBpbXBvcnRzIFtdc3RyaW5nCisJY3R4LlZpc2l0RGlyZWN0RGVwcyhmdW5jKGRlcCBhbmRyb2lkLk1vZHVsZSkgeworCQlpZiB0YWcsIG9rIDo9IGN0eC5PdGhlck1vZHVsZURlcGVuZGVuY3lUYWcoZGVwKS4oaW1wb3J0SW50ZXJmYWNlRGVwVGFnKTsgb2sgeworCQkJb3RoZXIgOj0gZGVwLigqYWlkbEludGVyZmFjZSkKKwkJCWltcG9ydHMgPSBhcHBlbmQoaW1wb3J0cywgaS5nZXRJbXBvcnRXaXRoVmVyc2lvbih2ZXJzaW9uLCB0YWcuYW5JbXBvcnQsIG90aGVyKSkKKwkJfQorCX0pCisJcmV0dXJuIGltcG9ydHMKK30KKwogZnVuYyBhaWRsSW1wbGVtZW50YXRpb25HZW5lcmF0b3JGYWN0b3J5KCkgYW5kcm9pZC5Nb2R1bGUgewogCWcgOj0gJmFpZGxJbXBsZW1lbnRhdGlvbkdlbmVyYXRvcnt9CiAJZy5BZGRQcm9wZXJ0aWVzKCZnLnByb3BlcnRpZXMpCkBAIC00MTcsNiArNDIyLDcgQEAKIAlMYW5nICAgICAgICAgICAgICBzdHJpbmcKIAlBaWRsSW50ZXJmYWNlTmFtZSBzdHJpbmcKIAlWZXJzaW9uICAgICAgICAgICBzdHJpbmcKKwlJbXBvcnRzICAgICAgICAgICBbXXN0cmluZwogCU1vZHVsZVByb3BlcnRpZXMgIFtdaW50ZXJmYWNle30KIH0KIApAQCAtNDI3LDI3ICs0MzMsMTcgQEAKIH0KIAogZnVuYyAoZyAqYWlkbEltcGxlbWVudGF0aW9uR2VuZXJhdG9yKSBHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGN0eCBhbmRyb2lkLlRvcERvd25NdXRhdG9yQ29udGV4dCkgewotCWkgOj0gbG9va3VwSW50ZXJmYWNlKGcucHJvcGVydGllcy5BaWRsSW50ZXJmYWNlTmFtZSwgY3R4LkNvbmZpZygpKQotCXZlcnNpb24gOj0gZy5wcm9wZXJ0aWVzLlZlcnNpb24KLQlsYW5nIDo9IGcucHJvcGVydGllcy5MYW5nCisJaW1wb3J0cyA6PSB3cmFwKCIiLCBnZXRJbXBvcnRzV2l0aFZlcnNpb24oY3R4LCBnLnByb3BlcnRpZXMuQWlkbEludGVyZmFjZU5hbWUsIGcucHJvcGVydGllcy5WZXJzaW9uKSwgIi0iK2cucHJvcGVydGllcy5MYW5nKQogCWlmIGcucHJvcGVydGllcy5MYW5nID09IGxhbmdKYXZhIHsKLQkJaW1wb3J0cyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oaS5wcm9wZXJ0aWVzLkltcG9ydHMpKQotCQlmb3IgaWR4LCBhbkltcG9ydCA6PSByYW5nZSBpLnByb3BlcnRpZXMuSW1wb3J0cyB7Ci0JCQlpbXBvcnRzW2lkeF0gPSBpLmdldEltcG9ydFdpdGhWZXJzaW9uKHZlcnNpb24sIGFuSW1wb3J0LCBjdHguQ29uZmlnKCkpICsgIi0iICsgbGFuZ0phdmEKLQkJfQogCQlpZiBwLCBvayA6PSBnLnByb3BlcnRpZXMuTW9kdWxlUHJvcGVydGllc1swXS4oKmphdmFQcm9wZXJ0aWVzKTsgb2sgewogCQkJcC5TdGF0aWNfbGlicyA9IGltcG9ydHMKIAkJfQotCQljdHguQ3JlYXRlTW9kdWxlKGphdmEuTGlicmFyeUZhY3RvcnksIGcucHJvcGVydGllcy5Nb2R1bGVQcm9wZXJ0aWVzLi4uKQorCQljdHguQ3JlYXRlTW9kdWxlKHdyYXBMaWJyYXJ5RmFjdG9yeShqYXZhLkxpYnJhcnlGYWN0b3J5KSwgZy5wcm9wZXJ0aWVzLk1vZHVsZVByb3BlcnRpZXMuLi4pCiAJfSBlbHNlIHsKLQkJaW1wb3J0cyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oaS5wcm9wZXJ0aWVzLkltcG9ydHMpKQotCQlmb3IgaWR4LCBhbkltcG9ydCA6PSByYW5nZSBpLnByb3BlcnRpZXMuSW1wb3J0cyB7Ci0JCQlpbXBvcnRzW2lkeF0gPSBpLmdldEltcG9ydFdpdGhWZXJzaW9uKHZlcnNpb24sIGFuSW1wb3J0LCBjdHguQ29uZmlnKCkpICsgIi0iICsgbGFuZwotCQl9CiAJCWlmIHAsIG9rIDo9IGcucHJvcGVydGllcy5Nb2R1bGVQcm9wZXJ0aWVzWzBdLigqY2NQcm9wZXJ0aWVzKTsgb2sgewogCQkJcC5TaGFyZWRfbGlicyA9IGFwcGVuZChwLlNoYXJlZF9saWJzLCBpbXBvcnRzLi4uKQogCQkJcC5FeHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzID0gYXBwZW5kKHAuRXhwb3J0X3NoYXJlZF9saWJfaGVhZGVycywgaW1wb3J0cy4uLikKIAkJfQotCQljdHguQ3JlYXRlTW9kdWxlKGNjLkxpYnJhcnlGYWN0b3J5LCBnLnByb3BlcnRpZXMuTW9kdWxlUHJvcGVydGllcy4uLikKKwkJY3R4LkNyZWF0ZU1vZHVsZSh3cmFwTGlicmFyeUZhY3RvcnkoY2MuTGlicmFyeUZhY3RvcnkpLCBnLnByb3BlcnRpZXMuTW9kdWxlUHJvcGVydGllcy4uLikKIAl9CiB9CmRpZmYgLS1naXQgYS9idWlsZC9haWRsX2ludGVyZmFjZV9tZXRhZGF0YV9zaW5nbGV0b24uZ28gYi9idWlsZC9haWRsX2ludGVyZmFjZV9tZXRhZGF0YV9zaW5nbGV0b24uZ28KaW5kZXggODRmZDgzNC4uOWUyZTAxNCAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF9pbnRlcmZhY2VfbWV0YWRhdGFfc2luZ2xldG9uLmdvCisrKyBiL2J1aWxkL2FpZGxfaW50ZXJmYWNlX21ldGFkYXRhX3NpbmdsZXRvbi5nbwpAQCAtMzEsMTEgKzMxLDEzIEBACiAJCQlgZWNobyAiXCJuYW1lXCI6IFwiJHtuYW1lfVwiLCIgJiYgYCArCiAJCQlgZWNobyAiXCJzdGFiaWxpdHlcIjogXCIke3N0YWJpbGl0eX1cIiwiICYmIGAgKwogCQkJYGVjaG8gIlwidHlwZXNcIjogWyR7dHlwZXN9XSwiICYmIGAgKwotCQkJYGVjaG8gIlwiaGFzaGVzXCI6IFske2hhc2hlc31dIiAmJiBgICsKKwkJCWBlY2hvICJcImhhc2hlc1wiOiBbJHtoYXNoZXN9XSwiICYmIGAgKworCQkJYGVjaG8gIlwiaGFzX2RldmVsb3BtZW50XCI6ICR7aGFzX2RldmVsb3BtZW50fSwiICYmIGAgKworCQkJYGVjaG8gIlwidmVyc2lvbnNcIjogWyR7dmVyc2lvbnN9XSIgJiYgYCArCiAJCQlgZWNobyAnfScgYCArCiAJCQlgO30gPj4gJHtvdXR9YCwKIAkJRGVzY3JpcHRpb246ICJBSURMIG1ldGFkYXRhOiAke291dH0iLAotCX0sICJuYW1lIiwgInN0YWJpbGl0eSIsICJ0eXBlcyIsICJoYXNoZXMiKQorCX0sICJuYW1lIiwgInN0YWJpbGl0eSIsICJ0eXBlcyIsICJoYXNoZXMiLCAiaGFzX2RldmVsb3BtZW50IiwgInZlcnNpb25zIikKIAogCWpvaW5Kc29uT2JqZWN0c1RvQXJyYXlSdWxlID0gcGN0eC5TdGF0aWNSdWxlKCJqb2luSnNvbk9iamVjdHNUb0FycmF5UnVsZSIsIGJsdWVwcmludC5SdWxlUGFyYW1zewogCQlSc3BmaWxlOiAgICAgICAgIiRvdXQucnNwIiwKQEAgLTc4LDkgKzgwLDExIEBACiAJfQogCiAJdHlwZSBNb2R1bGVJbmZvIHN0cnVjdCB7Ci0JCVN0YWJpbGl0eSAgICAgc3RyaW5nCi0JCUNvbXB1dGVkVHlwZXMgW11zdHJpbmcKLQkJSGFzaEZpbGVzICAgICBbXXN0cmluZworCQlTdGFiaWxpdHkgICAgICBzdHJpbmcKKwkJQ29tcHV0ZWRUeXBlcyAgW11zdHJpbmcKKwkJSGFzaEZpbGVzICAgICAgW11zdHJpbmcKKwkJSGFzRGV2ZWxvcG1lbnQgYW5kcm9pZC5Xcml0YWJsZVBhdGgKKwkJVmVyc2lvbnMgICAgICAgW11zdHJpbmcKIAl9CiAKIAkvLyBuYW1lIC0+IE1vZHVsZUluZm8KQEAgLTk1LDYgKzk5LDcgQEAKIAkJCWluZm8gOj0gbW9kdWxlSW5mb3NbdC5Nb2R1bGVCYXNlLk5hbWUoKV0KIAkJCWluZm8uU3RhYmlsaXR5ID0gcHJvcHRvb2xzLlN0cmluZ0RlZmF1bHQodC5wcm9wZXJ0aWVzLlN0YWJpbGl0eSwgIiIpCiAJCQlpbmZvLkNvbXB1dGVkVHlwZXMgPSB0LmNvbXB1dGVkVHlwZXMKKwkJCWluZm8uVmVyc2lvbnMgPSB0LnByb3BlcnRpZXMuVmVyc2lvbnMKIAkJCW1vZHVsZUluZm9zW3QuTW9kdWxlQmFzZS5OYW1lKCldID0gaW5mbwogCQljYXNlICphaWRsR2VuUnVsZToKIAkJCWluZm8gOj0gbW9kdWxlSW5mb3NbdC5wcm9wZXJ0aWVzLkJhc2VOYW1lXQpAQCAtMTAyLDYgKzEwNywxMCBAQAogCQkJCWluZm8uSGFzaEZpbGVzID0gYXBwZW5kKGluZm8uSGFzaEZpbGVzLCB0Lmhhc2hGaWxlLlN0cmluZygpKQogCQkJfQogCQkJbW9kdWxlSW5mb3NbdC5wcm9wZXJ0aWVzLkJhc2VOYW1lXSA9IGluZm8KKwkJY2FzZSAqYWlkbEFwaToKKwkJCWluZm8gOj0gbW9kdWxlSW5mb3NbdC5wcm9wZXJ0aWVzLkJhc2VOYW1lXQorCQkJaW5mby5IYXNEZXZlbG9wbWVudCA9IHQuaGFzRGV2ZWxvcG1lbnQKKwkJCW1vZHVsZUluZm9zW3QucHJvcGVydGllcy5CYXNlTmFtZV0gPSBpbmZvCiAJCX0KIAogCX0pCkBAIC0xMTYsMjEgKzEyNSwzMSBAQAogCQkvLyBvYmplY3RzIHBlciB2ZXJzaW9uIGFuZCBzdWItb2JqZWN0cyBwZXIgYmFja2VuZCwgd2UgY291bGQKIAkJLy8gYXZvaWQgbmVlZGluZyB0byBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMuCiAJCWluZm8uSGFzaEZpbGVzID0gYW5kcm9pZC5GaXJzdFVuaXF1ZVN0cmluZ3MoaW5mby5IYXNoRmlsZXMpCisJCXJlYWRIYXNoZXMgOj0gIiIKKwkJaWYgbGVuKGluZm8uSGFzaEZpbGVzKSA+IDAgeworCQkJcmVhZEhhc2hlcyA9ICIkJChzZWQgJ3MvLiovXCImXCIsLycgIiArIHN0cmluZ3MuSm9pbihpbmZvLkhhc2hGaWxlcywgIiAiKSArCisJCQkJInwgdHIgJ1xcbicgJyAnIHwgc2VkICdzLywgJCQvLycpIgorCQl9CiAKIAkJaW1wbGljaXRzIDo9IGFuZHJvaWQuUGF0aHNGb3JTb3VyY2UoY3R4LCBpbmZvLkhhc2hGaWxlcykKKwkJaGFzRGV2ZWxvcG1lbnRWYWx1ZSA6PSAidHJ1ZSIKKwkJaWYgaW5mby5IYXNEZXZlbG9wbWVudCAhPSBuaWwgeworCQkJaGFzRGV2ZWxvcG1lbnRWYWx1ZSA9ICIkJChpZiBbIFwiJCQoY2F0ICIgKyBpbmZvLkhhc0RldmVsb3BtZW50LlN0cmluZygpICsKKwkJCQkiKVwiID0gXCIxXCIgXTsgdGhlbiBlY2hvIHRydWU7IGVsc2UgZWNobyBmYWxzZTsgZmkpIgorCQl9CiAKIAkJY3R4LkJ1aWxkKHBjdHgsIGFuZHJvaWQuQnVpbGRQYXJhbXN7CiAJCQlSdWxlOiAgICAgIGFpZGxNZXRhZGF0YVJ1bGUsCiAJCQlJbXBsaWNpdHM6IGltcGxpY2l0cywKKwkJCUlucHV0OiAgICAgaW5mby5IYXNEZXZlbG9wbWVudCwKIAkJCU91dHB1dDogICAgbWV0YWRhdGFQYXRoLAogCQkJQXJnczogbWFwW3N0cmluZ11zdHJpbmd7Ci0JCQkJIm5hbWUiOiAgICAgIG5hbWUsCi0JCQkJInN0YWJpbGl0eSI6IGluZm8uU3RhYmlsaXR5LAotCQkJCSJ0eXBlcyI6ICAgICBzdHJpbmdzLkpvaW4od3JhcChgXCJgLCBpbmZvLkNvbXB1dGVkVHlwZXMsIGBcImApLCAiLCAiKSwKLQkJCQkiaGFzaGVzIjogc3RyaW5ncy5Kb2luKAotCQkJCQl3cmFwKGBcIiQkKHJlYWQgLXIgPCBgLAotCQkJCQkJaW5mby5IYXNoRmlsZXMsCi0JCQkJCQlgIGhhc2ggZXh0cmE7IHByaW50ZiAnJXMnICQkaGFzaClcImApLCAiLCAiKSwKKwkJCQkibmFtZSI6ICAgICAgICAgICAgbmFtZSwKKwkJCQkic3RhYmlsaXR5IjogICAgICAgaW5mby5TdGFiaWxpdHksCisJCQkJInR5cGVzIjogICAgICAgICAgIHN0cmluZ3MuSm9pbih3cmFwKGBcImAsIGluZm8uQ29tcHV0ZWRUeXBlcywgYFwiYCksICIsICIpLAorCQkJCSJoYXNoZXMiOiAgICAgICAgICByZWFkSGFzaGVzLAorCQkJCSJoYXNfZGV2ZWxvcG1lbnQiOiBoYXNEZXZlbG9wbWVudFZhbHVlLAorCQkJCSJ2ZXJzaW9ucyI6ICAgICAgICBzdHJpbmdzLkpvaW4oaW5mby5WZXJzaW9ucywgIiwgIiksCiAJCQl9LAogCQl9KQogCX0KZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfcnVzdF9nbHVlLnB5IGIvYnVpbGQvYWlkbF9ydXN0X2dsdWUucHkKaW5kZXggZWYzMWMzYi4uYWNiZDg3MSAxMDA3NTUKLS0tIGEvYnVpbGQvYWlkbF9ydXN0X2dsdWUucHkKKysrIGIvYnVpbGQvYWlkbF9ydXN0X2dsdWUucHkKQEAgLTcxLDkgKzcxLDExIEBACiAgICAgICAgIG5vZGUuZmlsZXMuYXBwZW5kKChpbl9uYW1lLCBpbnApKQogCiAgIHdpdGggb3BlbihvdXRwdXQsICJ3IikgYXMgbGliX3JzX2ZpbGU6CisgICAgIyBFbmFibGUgY3VzdG9tIGF0dHJpYnV0ZXMgZm9yICMhW3J1c3RmbXQ6OnNraXBdCisgICAgbGliX3JzX2ZpbGUud3JpdGUoIiMhW2ZlYXR1cmUoY3VzdG9tX2lubmVyX2F0dHJpYnV0ZXMpXVxuIikKICAgICBsaWJfcnNfZmlsZS53cml0ZSgiIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXVxuIikKICAgICBsaWJfcnNfZmlsZS53cml0ZSgiIyFbYWxsb3cobWlzc2luZ19kb2NzKV1cbiIpCi0gICAgbGliX3JzX2ZpbGUud3JpdGUoInB1YiB1c2UgYmluZGVyOjpwdWJsaWNfYXBpIGFzIGJpbmRlcjtcbiIpCisgICAgbGliX3JzX2ZpbGUud3JpdGUoInB1YiB1c2UgYmluZGVyO1xuIikKIAogICAgIGxpYl9yc19maWxlLndyaXRlKCJwdWIgbW9kIGFpZGwge1xuIikKICAgICByb290X21vZHVsZS5lbWl0KGxpYl9yc19maWxlLCBpbmRlbnQ9IiAgIikKZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfcnVzdF9zb3VyY2VfcHJvdmlkZXIuZ28gYi9idWlsZC9haWRsX3J1c3Rfc291cmNlX3Byb3ZpZGVyLmdvCmluZGV4IGVhYjQ1ZjEuLjE2MDUwZmIgMTAwNjQ0Ci0tLSBhL2J1aWxkL2FpZGxfcnVzdF9zb3VyY2VfcHJvdmlkZXIuZ28KKysrIGIvYnVpbGQvYWlkbF9ydXN0X3NvdXJjZV9wcm92aWRlci5nbwpAQCAtOTYsMTEgKzk2LDggQEAKIGZ1bmMgKHNwICphaWRsUnVzdFNvdXJjZVByb3ZpZGVyKSBTb3VyY2VQcm92aWRlckRlcHMoY3R4IHJ1c3QuRGVwc0NvbnRleHQsIGRlcHMgcnVzdC5EZXBzKSBydXN0LkRlcHMgewogCWRlcHMgPSBzcC5CYXNlU291cmNlUHJvdmlkZXIuU291cmNlUHJvdmlkZXJEZXBzKGN0eCwgZGVwcykKIAlkZXBzLlJ1c3RsaWJzID0gYXBwZW5kKGRlcHMuUnVzdGxpYnMsICJsaWJiaW5kZXJfcnMiLCAibGlibGF6eV9zdGF0aWMiKQotCWFpIDo9IGxvb2t1cEludGVyZmFjZShzcC5wcm9wZXJ0aWVzLkFpZGxJbnRlcmZhY2VOYW1lLCBjdHguQ29uZmlnKCkpCi0JZm9yIF8sIGRlcCA6PSByYW5nZSBzcC5wcm9wZXJ0aWVzLkltcG9ydHMgewotCQlkZXBzLlJ1c3RsaWJzID0gYXBwZW5kKGRlcHMuUnVzdGxpYnMsIGFpLmdldEltcG9ydFdpdGhWZXJzaW9uKHNwLnByb3BlcnRpZXMuVmVyc2lvbiwgZGVwLCBjdHguQ29uZmlnKCkpKyItIitsYW5nUnVzdCkKLQl9Ci0KKwlkZXBzLlJ1c3RsaWJzID0gYXBwZW5kKGRlcHMuUnVzdGxpYnMsIHdyYXAoIiIsIGdldEltcG9ydHNXaXRoVmVyc2lvbihjdHgsIHNwLnByb3BlcnRpZXMuQWlkbEludGVyZmFjZU5hbWUsIHNwLnByb3BlcnRpZXMuVmVyc2lvbiksICItIitsYW5nUnVzdCkuLi4pCisJZGVwcy5Qcm9jTWFjcm9zID0gYXBwZW5kKGRlcHMuUHJvY01hY3JvcywgImxpYmFzeW5jX3RyYWl0IikKIAkvLyBBZGQgYSBkZXBlbmNlbmN5IHRvIHRoZSBzb3VyY2UgbW9kdWxlICgqLXJ1c3Qtc291cmNlKSBkaXJlY3RseSB2aWEgYGN0eGAgYmVjYXVzZQogCS8vIHRoZSBzb3VyY2UgbW9kdWxlIGlzIHNwZWNpZmljIHRvIGFpZGxSdXN0U291cmNlUHJvdmlkZXIgYW5kIHdlIGRvbid0IHdhbnQgdGhlIHJ1c3QgbW9kdWxlCiAJLy8gdG8ga25vdyBhYm91dCBpdC4KZGlmZiAtLWdpdCBhL2J1aWxkL2FpZGxfdGVzdC5nbyBiL2J1aWxkL2FpZGxfdGVzdC5nbwppbmRleCAzMjVjYmRhLi4yZDVkYzE3IDEwMDY0NAotLS0gYS9idWlsZC9haWRsX3Rlc3QuZ28KKysrIGIvYnVpbGQvYWlkbF90ZXN0LmdvCkBAIC0yNSw3ICsyNSw2IEBACiAJImdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludC9wcm9wdG9vbHMiCiAKIAkiYW5kcm9pZC9zb29uZy9hbmRyb2lkIgotCSJhbmRyb2lkL3Nvb25nL2FwZXgiCiAJImFuZHJvaWQvc29vbmcvY2MiCiAJImFuZHJvaWQvc29vbmcvZ2VucnVsZSIKIAkiYW5kcm9pZC9zb29uZy9qYXZhIgpAQCAtNTQsNiArNTMsMTMgQEAKIAl9KQogfQogCitmdW5jIHNldFRlc3RGcmVlemVFbnYoKSBhbmRyb2lkLkZpeHR1cmVQcmVwYXJlciB7CisJcmV0dXJuIGFuZHJvaWQuRml4dHVyZU1lcmdlRW52KG1hcFtzdHJpbmddc3RyaW5neworCQkiQUlETF9GUk9aRU5fUkVMIjogICAgInRydWUiLAorCQkiQUlETF9GUk9aRU5fT1dORVJTIjogImFvc3AgdGVzdCIsCisJfSkKK30KKwogZnVuYyBfdGVzdEFpZGwodCAqdGVzdGluZy5ULCBicCBzdHJpbmcsIGN1c3RvbWl6ZXJzIC4uLmFuZHJvaWQuRml4dHVyZVByZXBhcmVyKSBhbmRyb2lkLkZpeHR1cmVQcmVwYXJlciB7CiAJdC5IZWxwZXIoKQogCkBAIC02Myw2ICs2OSw3IEBACiAJCWNjLlByZXBhcmVGb3JUZXN0V2l0aENjRGVmYXVsdE1vZHVsZXMsCiAJCWphdmEuUHJlcGFyZUZvclRlc3RXaXRoSmF2YURlZmF1bHRNb2R1bGVzLAogCQlnZW5ydWxlLlByZXBhcmVGb3JUZXN0V2l0aEdlblJ1bGVCdWlsZENvbXBvbmVudHMsCisJCWFuZHJvaWQuUHJlcGFyZUZvclRlc3RXaXRoTmFtZXNwYWNlLAogCSkKIAogCWJwID0gYnAgKyBgCkBAIC04MCwxNSArODcsMTggQEAKIAkJfQogCQljY19saWJyYXJ5IHsKIAkJCW5hbWU6ICJsaWJiaW5kZXIiLAorCQkJcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogCQl9CiAJCWNjX2xpYnJhcnkgewogCQkJbmFtZTogImxpYnV0aWxzIiwKKwkJCXJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKIAkJfQogCQljY19saWJyYXJ5IHsKIAkJCW5hbWU6ICJsaWJjdXRpbHMiLAogCQl9CiAJCWNjX2xpYnJhcnkgewogCQkJbmFtZTogImxpYmJpbmRlcl9uZGsiLAorCQkJcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogCQkJc3R1YnM6IHsKIAkJCQl2ZXJzaW9uczogWyIyOSJdLAogCQkJfQpAQCAtMTI4LDggKzEzOCwxMyBAQAogCQkJY3JhdGVfbmFtZTogImJpbmRlciIsCiAJCQlzcmNzOiBbIiJdLAogCQl9CisJCXJ1c3RfcHJvY19tYWNybyB7CisJCQluYW1lOiAibGliYXN5bmNfdHJhaXQiLAorCQkJY3JhdGVfbmFtZTogImFzeW5jX3RyYWl0IiwKKwkJCXNyY3M6IFsiIl0sCisJCQlub19zdGRsaWJzOiB0cnVlLAorCQl9CiAJYAotCiAJcHJlcGFyZXJzID0gYXBwZW5kKHByZXBhcmVycywgYW5kcm9pZC5GaXh0dXJlV2l0aFJvb3RBbmRyb2lkQnAoYnApKQogCXByZXBhcmVycyA9IGFwcGVuZChwcmVwYXJlcnMsIGFuZHJvaWQuRml4dHVyZUFkZFRleHRGaWxlKCJzeXN0ZW0vdG9vbHMvYWlkbC9idWlsZC9BbmRyb2lkLmJwIiwgYAogCQlhaWRsX2ludGVyZmFjZXNfbWV0YWRhdGEgewpAQCAtMTUwLDcgKzE2NSw2IEBACiAJcHJlcGFyZXJzID0gYXBwZW5kKHByZXBhcmVycywgY3VzdG9taXplcnMuLi4pCiAKIAlwcmVwYXJlcnMgPSBhcHBlbmQocHJlcGFyZXJzLAotCQlhcGV4LlByZXBhcmVGb3JUZXN0V2l0aEFwZXhCdWlsZENvbXBvbmVudHMsCiAJCXJ1c3QuUHJlcGFyZUZvclRlc3RXaXRoUnVzdEJ1aWxkQ29tcG9uZW50cywKIAkJYW5kcm9pZC5GaXh0dXJlUmVnaXN0ZXJXaXRoQ29udGV4dChmdW5jKGN0eCBhbmRyb2lkLlJlZ2lzdHJhdGlvbkNvbnRleHQpIHsKIAkJCWN0eC5SZWdpc3Rlck1vZHVsZVR5cGUoImFpZGxfaW50ZXJmYWNlIiwgYWlkbEludGVyZmFjZUZhY3RvcnkpCkBAIC0xNTgsMTcgKzE3Miw4IEBACiAJCQljdHguUmVnaXN0ZXJNb2R1bGVUeXBlKCJydXN0X2RlZmF1bHRzIiwgZnVuYygpIGFuZHJvaWQuTW9kdWxlIHsKIAkJCQlyZXR1cm4gcnVzdC5EZWZhdWx0c0ZhY3RvcnkoKQogCQkJfSkKLQotCQkJY3R4LlByZUFyY2hNdXRhdG9ycyhmdW5jKGN0eCBhbmRyb2lkLlJlZ2lzdGVyTXV0YXRvcnNDb250ZXh0KSB7Ci0JCQkJY3R4LkJvdHRvbVVwKCJjaGVja0ltcG9ydHMiLCBjaGVja0ltcG9ydHMpCi0JCQkJY3R4LlRvcERvd24oImNyZWF0ZUFpZGxJbnRlcmZhY2UiLCBjcmVhdGVBaWRsSW50ZXJmYWNlTXV0YXRvcikKLQkJCX0pCi0KLQkJCWN0eC5Qb3N0RGVwc011dGF0b3JzKGZ1bmMoY3R4IGFuZHJvaWQuUmVnaXN0ZXJNdXRhdG9yc0NvbnRleHQpIHsKLQkJCQljdHguQm90dG9tVXAoImNoZWNrVW5zdGFibGVNb2R1bGUiLCBjaGVja1Vuc3RhYmxlTW9kdWxlTXV0YXRvcikuUGFyYWxsZWwoKQotCQkJCWN0eC5Cb3R0b21VcCgicmVjb3JkVmVyc2lvbnMiLCByZWNvcmRWZXJzaW9ucykuUGFyYWxsZWwoKQotCQkJCWN0eC5Cb3R0b21VcCgiY2hlY2tEdXBsaWNhdGVkVmVyc2lvbnMiLCBjaGVja0R1cGxpY2F0ZWRWZXJzaW9ucykuUGFyYWxsZWwoKQotCQkJfSkKKwkJCWN0eC5QcmVBcmNoTXV0YXRvcnMocmVnaXN0ZXJQcmVBcmNoTXV0YXRvcnMpCisJCQljdHguUG9zdERlcHNNdXRhdG9ycyhyZWdpc3RlclBvc3REZXBzTXV0YXRvcnMpCiAJCX0pLAogCSkKIApAQCAtMjQ0LDkgKzI0OSwxMCBAQAogCX1gCiAJZXhwZWN0ZWRFcnJvciA6PSBgbW9kdWxlICJmb29faW50ZXJmYWNlIjogdmVyc2lvbnM6IG11c3QgYmUgc2V0IFwobmVlZCB0byBiZSBmcm96ZW5cKSB3aGVuICJ1bnN0YWJsZSIgaXMgZmFsc2UsIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgaXMgUkVMLCBhbmQgIm93bmVyIiBwcm9wZXJ0eSBpcyBtaXNzaW5nLmAKIAl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIHZpbnRmV2l0aG91dFZlcnNpb25CcCwgc2V0UmVsZWFzZUVudigpKQorCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgdmludGZXaXRob3V0VmVyc2lvbkJwLCBzZXRUZXN0RnJlZXplRW52KCkpCiAKIAljdHgsIF8gOj0gdGVzdEFpZGwodCwgdmludGZXaXRob3V0VmVyc2lvbkJwKQotCWFzc2VydE1vZHVsZXNFeGlzdHModCwgY3R4LCAiZm9vLVYxLWphdmEiLCAiZm9vLVYxLXJ1c3QiLCAiZm9vLVYxLWNwcCIsICJmb28tVjEtbmRrIiwgImZvby1WMS1uZGtfcGxhdGZvcm0iKQorCWFzc2VydE1vZHVsZXNFeGlzdHModCwgY3R4LCAiZm9vLVYxLWphdmEiLCAiZm9vLVYxLXJ1c3QiLCAiZm9vLVYxLWNwcCIsICJmb28tVjEtbmRrIikKIH0KIAogLy8gQ2hlY2sgaWYgdXNpbmcgdW5zdGFibGUgdmVyc2lvbiBpbiByZWxlYXNlIGNhdXNlIGFuIGVycm9yLgpAQCAtMjY1LDE1ICsyNzEsMTUgQEAKIAkJbmFtZTogImJhciIsCiAJCWxpYnM6IFsiZm9vLVYyLWphdmEiXSwKIAl9YAorCWZpbGVzIDo9IHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICAgbmlsLAorCX0pCiAKIAlleHBlY3RlZEVycm9yIDo9IGBmb28tVjItamF2YSBpcyBkaXNhbGxvd2VkIGluIHJlbGVhc2UgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIHVuc3RhYmxlLmAKLQl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIHVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewotCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKLQl9KSkKLQotCXRlc3RBaWRsKHQsIHVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKLQkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCi0JfSkpCisJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCB1bnN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCksIGZpbGVzKQorCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgdW5zdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgc2V0VGVzdEZyZWV6ZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbCh0LCB1bnN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBmaWxlcykKIAogCS8vIEEgc3RhYmxlIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gcmVsZWFzZSB2ZXJzaW9uCiAJc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAgOj0gYApAQCAtMjkxLDEzICsyOTcsMzkgQEAKIAkJbGliczogWyJmb28tVjEtamF2YSJdLAogCX1gCiAKLQl0ZXN0QWlkbCh0LCBzdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7Ci0JCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAotCX0pKQorCXRlc3RBaWRsKHQsIHN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIHN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIHN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCBmaWxlcykKK30KIAotCXRlc3RBaWRsKHQsIHN0YWJsZVZlcnNpb25Vc2FnZUluSmF2YUJwLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CitmdW5jIFRlc3RVc2luZ1Vuc3RhYmxlVmVyc2lvbkluZGlyZWN0bHlJblJlbGVhc2UodCAqdGVzdGluZy5UKSB7CisJdW5zdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCA6PSBgCisJYWlkbF9pbnRlcmZhY2UgeworCQluYW1lOiAieHh4IiwKKwkJc3JjczogWyJJRm9vLmFpZGwiXSwKKwkJdmVyc2lvbnM6IFsiMSJdLAorCX0KKwlhaWRsX2ludGVyZmFjZSB7CisJCW5hbWU6ICJmb28iLAorCQlpbXBvcnRzOiBbInh4eC1WMiJdLCAgICAvLyBub3QgT0sKKwkJdmVyc2lvbnM6IFsiMSJdLAorCQlzcmNzOiBbIklGb28uYWlkbCJdLAorCX0KKwlqYXZhX2xpYnJhcnkgeworCQluYW1lOiAiYmFyIiwKKwkJbGliczogWyJmb28tVjEtamF2YSJdLCAgLy8gT0sKKwl9YAorCWZpbGVzIDo9IHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKIAkJImFpZGxfYXBpL2Zvby8xL2Zvby4xLmFpZGwiOiBuaWwsCi0JfSkpCisJCSJhaWRsX2FwaS9mb28vMS8uaGFzaCI6ICAgICAgbmlsLAorCQkiYWlkbF9hcGkveHh4LzEvZm9vLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL3h4eC8xLy5oYXNoIjogICAgICBuaWwsCisJfSkKKworCWV4cGVjdGVkRXJyb3IgOj0gYHh4eC1WMi1qYXZhIGlzIGRpc2FsbG93ZWQgaW4gcmVsZWFzZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgdW5zdGFibGUuYAorCXRlc3RBaWRsRXJyb3IodCwgZXhwZWN0ZWRFcnJvciwgdW5zdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIHVuc3RhYmxlVmVyc2lvblVzYWdlSW5KYXZhQnAsIHNldFRlc3RGcmVlemVFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGwodCwgdW5zdGFibGVWZXJzaW9uVXNhZ2VJbkphdmFCcCwgZmlsZXMpCiB9CiAKIC8vIFRoZSBtb2R1bGUgd2hpY2ggaGFzIG5ldmVyIGJlZW4gZnJvemVuIGFuZCBpcyBub3QgInVuc3RhYmxlIiBpcyBub3QgYWxsb3dlZCBpbiByZWxlYXNlIHZlcnNpb24uCkBAIC0zMTcsNiArMzQ5LDcgQEAKIAogCWV4cGVjdGVkRXJyb3IgOj0gYCJmb29faW50ZXJmYWNlIjogdmVyc2lvbnM6IG11c3QgYmUgc2V0IFwobmVlZCB0byBiZSBmcm96ZW5cKSB3aGVuICJ1bnN0YWJsZSIgaXMgZmFsc2UsIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgaXMgUkVMLCBhbmQgIm93bmVyIiBwcm9wZXJ0eSBpcyBtaXNzaW5nLmAKIAl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSkKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFRlc3RGcmVlemVFbnYoKSkKIAl0ZXN0QWlkbCh0LCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwKQogCiAJbm9uVmVyc2lvbmVkVW5zdGFibGVNb2R1bGVVc2FnZUluSmF2YUJwIDo9IGAKQEAgLTMzNCw5ICszNjcsNTEgQEAKIAl9YAogCiAJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkVW5zdGFibGVNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCkpCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkVW5zdGFibGVNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCkpCiAJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkVW5zdGFibGVNb2R1bGVVc2FnZUluSmF2YUJwKQogfQogCitmdW5jIFRlc3ROb25WZXJzaW9uZWRNb2R1bGVPd25lZEJ5VGVzdFVzYWdlSW5SZWxlYXNlKHQgKnRlc3RpbmcuVCkgeworCW5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAgOj0gYAorCWFpZGxfaW50ZXJmYWNlIHsKKwkJbmFtZTogImZvbyIsCisJCW93bmVyOiAidGVzdCIsCisJCXNyY3M6IFsKKwkJCSJJRm9vLmFpZGwiLAorCQldLAorCX0KKworCWphdmFfbGlicmFyeSB7CisJCW5hbWU6ICJiYXIiLAorCQlsaWJzOiBbImZvby1WMS1qYXZhIl0sCisJfWAKKworCWV4cGVjdGVkRXJyb3IgOj0gYCJmb29faW50ZXJmYWNlIjogdmVyc2lvbnM6IG11c3QgYmUgc2V0IFwobmVlZCB0byBiZSBmcm96ZW5cKSB3aGVuICJ1bnN0YWJsZSIgaXMgZmFsc2UsIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgaXMgUkVMLCBhbmQgIm93bmVyIiBwcm9wZXJ0eSBpcyBtaXNzaW5nLmAKKwl0ZXN0QWlkbCh0LCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCkpCisJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCkpCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCkKK30KKworZnVuYyBUZXN0Tm9uVmVyc2lvbmVkTW9kdWxlT3duZWRCeU90aGVyVXNhZ2VJblJlbGVhc2UodCAqdGVzdGluZy5UKSB7CisJbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCA6PSBgCisJYWlkbF9pbnRlcmZhY2UgeworCQluYW1lOiAiZm9vIiwKKwkJb3duZXI6ICJ1bmtub3duLW93bmVyIiwKKwkJc3JjczogWworCQkJIklGb28uYWlkbCIsCisJCV0sCisJfQorCisJamF2YV9saWJyYXJ5IHsKKwkJbmFtZTogImJhciIsCisJCWxpYnM6IFsiZm9vLVYxLWphdmEiXSwKKwl9YAorCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpKQorCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFRlc3RGcmVlemVFbnYoKSkKKwl0ZXN0QWlkbCh0LCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwKQorfQorCiBmdW5jIFRlc3RJbXBvcnRJblJlbGVhc2UodCAqdGVzdGluZy5UKSB7CiAJaW1wb3J0SW5SZWxlYXNlIDo9IGAKIAlhaWRsX2ludGVyZmFjZSB7CkBAIC0zNDQsNyArNDE5LDcgQEAKIAkJc3JjczogWwogCQkJIklGb28uYWlkbCIsCiAJCV0sCi0JCWltcG9ydHM6IFsiYmFyIl0sCisJCWltcG9ydHM6IFsiYmFyLVYxIl0sCiAJCXZlcnNpb25zOiBbIjEiXSwKIAl9CiAKQEAgLTM1NiwxMyArNDMxLDE2IEBACiAJCXZlcnNpb25zOiBbIjEiXSwKIAl9CiAJYAotCi0JdGVzdEFpZGwodCwgaW1wb3J0SW5SZWxlYXNlLCBzZXRSZWxlYXNlRW52KCksIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwlmaWxlcyA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CiAJCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAogCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgIG5pbCwKIAkJImFpZGxfYXBpL2Jhci8xL2Jhci4xLmFpZGwiOiBuaWwsCiAJCSJhaWRsX2FwaS9iYXIvMS8uaGFzaCI6ICAgICAgbmlsLAotCX0pKQorCX0pCisKKwl0ZXN0QWlkbCh0LCBpbXBvcnRJblJlbGVhc2UsIHNldFJlbGVhc2VFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGwodCwgaW1wb3J0SW5SZWxlYXNlLCBzZXRUZXN0RnJlZXplRW52KCksIGZpbGVzKQorCXRlc3RBaWRsKHQsIGltcG9ydEluUmVsZWFzZSwgZmlsZXMpCiB9CiAKIGZ1bmMgVGVzdFVuc3RhYmxlVmVyc2lvbmVkTW9kdWxlVXNhZ2VJblJlbGVhc2UodCAqdGVzdGluZy5UKSB7CkBAIC0zODIsMTEgKzQ2MCw2NCBAQAogCiAJZXhwZWN0ZWRFcnJvciA6PSBgQW5kcm9pZC5icDoxMDoyOiBtb2R1bGUgXCJiYXJcIiB2YXJpYW50IFwiYW5kcm9pZF9jb21tb25cIjogZm9vLVYyLWphdmEgaXMgZGlzYWxsb3dlZCBpbiByZWxlYXNlIHZlcnNpb24gYmVjYXVzZSBpdCBpcyB1bnN0YWJsZSwgYW5kIGl0cyBcIm93bmVyXCIgcHJvcGVydHkgaXMgbWlzc2luZy5gCiAJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRSZWxlYXNlRW52KCkpCisJdGVzdEFpZGxFcnJvcih0LCBleHBlY3RlZEVycm9yLCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBzZXRUZXN0RnJlZXplRW52KCkpCiAJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewogCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICBuaWwsCiAJfSkpCiB9CiAKK2Z1bmMgVGVzdFVuc3RhYmxlVmVyc2lvbmVkTW9kdWxlT3duZWRCeVRlc3RVc2FnZUluUmVsZWFzZSh0ICp0ZXN0aW5nLlQpIHsKKwlub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwIDo9IGAKKwlhaWRsX2ludGVyZmFjZSB7CisJCW5hbWU6ICJmb28iLAorCQlvd25lcjogInRlc3QiLAorCQlzcmNzOiBbCisJCQkiSUZvby5haWRsIiwKKwkJXSwKKwkJdmVyc2lvbnM6IFsiMSJdLAorCX0KKworCWphdmFfbGlicmFyeSB7CisJCW5hbWU6ICJiYXIiLAorCQlsaWJzOiBbImZvby1WMi1qYXZhIl0sCisJfWAKKwlmaWxlcyA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgIG5pbCwKKwl9KQorCisJZXhwZWN0ZWRFcnJvciA6PSBgQW5kcm9pZC5icDoxMToyOiBtb2R1bGUgXCJiYXJcIiB2YXJpYW50IFwiYW5kcm9pZF9jb21tb25cIjogZm9vLVYyLWphdmEgaXMgZGlzYWxsb3dlZCBpbiByZWxlYXNlIHZlcnNpb24gYmVjYXVzZSBpdCBpcyB1bnN0YWJsZSwgYW5kIGl0cyBcIm93bmVyXCIgcHJvcGVydHkgaXMgbWlzc2luZy5gCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0UmVsZWFzZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbEVycm9yKHQsIGV4cGVjdGVkRXJyb3IsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFRlc3RGcmVlemVFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgZmlsZXMpCit9CisKK2Z1bmMgVGVzdFVuc3RhYmxlVmVyc2lvbmVkTW9kdWxlT3duZWRCeU90aGVyVXNhZ2VJblJlbGVhc2UodCAqdGVzdGluZy5UKSB7CisJbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCA6PSBgCisJYWlkbF9pbnRlcmZhY2UgeworCQluYW1lOiAiZm9vIiwKKwkJb3duZXI6ICJ1bmtub3duLW93bmVyIiwKKwkJc3JjczogWworCQkJIklGb28uYWlkbCIsCisJCV0sCisJCXZlcnNpb25zOiBbIjEiXSwKKwl9CisKKwlqYXZhX2xpYnJhcnkgeworCQluYW1lOiAiYmFyIiwKKwkJbGliczogWyJmb28tVjItamF2YSJdLAorCX1gCisJZmlsZXMgOj0gd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICBuaWwsCisJfSkKKworCXRlc3RBaWRsKHQsIG5vblZlcnNpb25lZE1vZHVsZVVzYWdlSW5KYXZhQnAsIHNldFJlbGVhc2VFbnYoKSwgZmlsZXMpCisJdGVzdEFpZGwodCwgbm9uVmVyc2lvbmVkTW9kdWxlVXNhZ2VJbkphdmFCcCwgc2V0VGVzdEZyZWV6ZUVudigpLCBmaWxlcykKKwl0ZXN0QWlkbCh0LCBub25WZXJzaW9uZWRNb2R1bGVVc2FnZUluSmF2YUJwLCBmaWxlcykKK30KKwogZnVuYyBUZXN0VW5zdGFibGVNb2R1bGVzKHQgKnRlc3RpbmcuVCkgewogCXRlc3RBaWRsRXJyb3IodCwgYG1vZHVsZSAiZm9vX2ludGVyZmFjZSI6IHN0YWJpbGl0eTogbXVzdCBiZSBlbXB0eSB3aGVuICJ1bnN0YWJsZSIgaXMgdHJ1ZWAsIGAKIAkJYWlkbF9pbnRlcmZhY2UgewpAQCAtNDM3LDcgKzU2OCw3IEBACiAJCX0KIAlgKQogCi0JYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tamF2YSIsICJmb28tcnVzdCIsICJmb28tY3BwIiwgImZvby1uZGsiLCAiZm9vLW5ka19wbGF0Zm9ybSIpCisJYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tamF2YSIsICJmb28tcnVzdCIsICJmb28tY3BwIiwgImZvby1uZGsiKQogfQogCiBmdW5jIFRlc3RDcmVhdGVzTW9kdWxlc1dpdGhOb1ZlcnNpb25zKHQgKnRlc3RpbmcuVCkgewpAQCAtNDU1LDEyICs1ODYsMTIgQEAKIAkJfQogCWApCiAKLQlhc3NlcnRNb2R1bGVzRXhpc3RzKHQsIGN0eCwgImZvby1WMS1qYXZhIiwgImZvby1WMS1ydXN0IiwgImZvby1WMS1jcHAiLCAiZm9vLVYxLW5kayIsICJmb28tVjEtbmRrX3BsYXRmb3JtIikKKwlhc3NlcnRNb2R1bGVzRXhpc3RzKHQsIGN0eCwgImZvby1WMS1qYXZhIiwgImZvby1WMS1ydXN0IiwgImZvby1WMS1jcHAiLCAiZm9vLVYxLW5kayIpCiB9CiAKIGZ1bmMgVGVzdENyZWF0ZXNNb2R1bGVzV2l0aEZyb3plblZlcnNpb25zKHQgKnRlc3RpbmcuVCkgewogCS8vIEVhY2ggdmVyc2lvbiBzaG91bGQgYmUgdW5kZXIgYWlkbF9hcGkvPG5hbWU+Lzx2ZXI+Ci0JdGVzdEFpZGxFcnJvcih0LCBgYWlkbF9hcGkvZm9vLzFgLCBgCisJdGVzdEFpZGxFcnJvcih0LCBgTm8gc291cmNlcyBmb3IgYSBwcmV2aW91cyB2ZXJzaW9uIGluIGFpZGxfYXBpL2Zvby8xLiBXYXMgYSB2ZXJzaW9uIG1hbnVhbGx5IGFkZGVkIHRvIC5icCBmaWxlP2AsIGAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogImZvbyIsCiAJCQlzcmNzOiBbCkBAIC00OTQsMTMgKzYyNSwxNCBAQAogCQl9CiAJYCwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewogCQkiYWlkbF9hcGkvZm9vLzEvZm9vLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgICBuaWwsCiAJfSkpCiAKIAkvLyBGb3IgZnJvemVuIHZlcnNpb24gIjEiCi0JYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tVjEtamF2YSIsICJmb28tVjEtcnVzdCIsICJmb28tVjEtY3BwIiwgImZvby1WMS1uZGsiLCAiZm9vLVYxLW5ka19wbGF0Zm9ybSIpCisJYXNzZXJ0TW9kdWxlc0V4aXN0cyh0LCBjdHgsICJmb28tVjEtamF2YSIsICJmb28tVjEtcnVzdCIsICJmb28tVjEtY3BwIiwgImZvby1WMS1uZGsiKQogCiAJLy8gRm9yIFRvVCAoY3VycmVudCkKLQlhc3NlcnRNb2R1bGVzRXhpc3RzKHQsIGN0eCwgImZvby1WMi1qYXZhIiwgImZvby1WMi1ydXN0IiwgImZvby1WMi1jcHAiLCAiZm9vLVYyLW5kayIsICJmb28tVjItbmRrX3BsYXRmb3JtIikKKwlhc3NlcnRNb2R1bGVzRXhpc3RzKHQsIGN0eCwgImZvby1WMi1qYXZhIiwgImZvby1WMi1ydXN0IiwgImZvby1WMi1jcHAiLCAiZm9vLVYyLW5kayIpCiB9CiAKIGZ1bmMgVGVzdEVycm9yc1dpdGhVbnNvcnRlZFZlcnNpb25zKHQgKnRlc3RpbmcuVCkgewpAQCAtNjI4LDcgKzc2MCw5IEBACiAJCX0KIAlgLCB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CiAJCSJhaWRsX2FwaS9mb28vMS9mb28uMS5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgIG5pbCwKIAkJImFpZGxfYXBpL2Zvby8yL2Zvby4yLmFpZGwiOiBuaWwsCisJCSJhaWRsX2FwaS9mb28vMi8uaGFzaCI6ICAgICAgbmlsLAogCX0pKQogCiAJLy8gYWxpYXMgZm9yIHRoZSBsYXRlc3QgZnJvemVuIHZlcnNpb24gKD0yKQpAQCAtNjQ2LDcgKzc4MCw3IEBACiAJYXNzZXJ0T3V0cHV0KCJmb28tVjMtY3BwIiwgbmF0aXZlVmFyaWFudCwgImZvby1WMy1jcHAuc28iKQogCWFzc2VydE91dHB1dCgiZm9vLVYzLXJ1c3QiLCBuYXRpdmVSdXN0VmFyaWFudCwgImxpYmZvb19WMy5keWxpYi5zbyIpCiAKLQkvLyBza2lwIG5kay9uZGtfcGxhdGZvcm0gc2luY2UgdGhleSBmb2xsb3cgdGhlIHNhbWUgcnVsZSB3aXRoIGNwcAorCS8vIHNraXAgbmRrIHNpbmNlIHRoZXkgZm9sbG93IHRoZSBzYW1lIHJ1bGUgd2l0aCBjcHAKIH0KIAogZnVuYyBUZXN0SW1wb3J0cyh0ICp0ZXN0aW5nLlQpIHsKQEAgLTY2OSw3ICs4MDMsNyBAQAogCQkJCSJJRm9vLmFpZGwiLAogCQkJXSwKIAkJCWltcG9ydHM6IFsKLQkJCQkiYmFyIiwKKwkJCQkiYmFyLVYxIiwKIAkJCV0KIAkJfQogCQlhaWRsX2ludGVyZmFjZSB7CkBAIC02OTIsNyArODI2LDcgQEAKIAkJCQkiSUZvby5haWRsIiwKIAkJCV0sCiAJCQlpbXBvcnRzOiBbCi0JCQkJImJhciIsCisJCQkJImJhci1WMSIsCiAJCQldCiAJCX0KIAkJYWlkbF9pbnRlcmZhY2UgewpAQCAtNzIwLDcgKzg1NCw3IEBACiAJCQkJfSwKIAkJCX0sCiAJCQlpbXBvcnRzOiBbCi0JCQkJImJhci4xIiwKKwkJCQkiYmFyLjEtVjEiLAogCQkJXQogCQl9CiAJCWFpZGxfaW50ZXJmYWNlIHsKQEAgLTc0NSw3ICs4NzksNyBAQAogCiAJcnVzdGNSdWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLVYxLXJ1c3QiLCBuYXRpdmVSdXN0VmFyaWFudCkuUnVsZSgicnVzdGMiKQogCWxpYkZsYWdzID0gcnVzdGNSdWxlLkFyZ3NbImxpYkZsYWdzIl0KLQlsaWJCYXIgPSBmaWxlcGF0aC5Kb2luKCJvdXQiLCAic29vbmciLCAiLmludGVybWVkaWF0ZXMiLCAiYmFyLjEtVjEtcnVzdCIsIG5hdGl2ZVJ1c3RWYXJpYW50LCAibGliYmFyXzFfVjEuZHlsaWIuc28iKQorCWxpYkJhciA9IGZpbGVwYXRoLkpvaW4oIm91dCIsICJzb29uZyIsICIuaW50ZXJtZWRpYXRlcyIsICJiYXIuMS1WMS1ydXN0IiwgbmF0aXZlUnVzdFZhcmlhbnQsICJ1bnN0cmlwcGVkIiwgImxpYmJhcl8xX1YxLmR5bGliLnNvIikKIAlsaWJCYXJGbGFnIDo9ICItLWV4dGVybiBiYXJfMT0iICsgbGliQmFyCiAJaWYgIXN0cmluZ3MuQ29udGFpbnMobGliRmxhZ3MsIGxpYkJhckZsYWcpIHsKIAkJdC5FcnJvcmYoIiVxIGlzIG5vdCBmb3VuZCBpbiAlcSIsIGxpYkJhckZsYWcsIGxpYkZsYWdzKQpAQCAtNzU1LDcgKzg4OSw3IEBACiBmdW5jIFRlc3REdXBsaWNhdGVkVmVyc2lvbnModCAqdGVzdGluZy5UKSB7CiAJLy8gZm9vIGRlcGVuZHMgb24gbXlpZmFjZS1WMi1uZGsgdmlhIGRpcmVjdCBkZXAgYW5kIGFsc28gb24KIAkvLyBteWlmYWNlLVYxLW5kayB2aWEgaW5kaXJlY3QgZGVwLiBUaGlzIHNob3VsZCBiZSBwcm9oaWJpdGVkLgotCXRlc3RBaWRsRXJyb3IodCwgYGRlcGVuZHMgb24gbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWlkbF9pbnRlcmZhY2U6IG15aWZhY2UtVjEtbmRrLCBteWlmYWNlLVYyLW5ka2AsIGAKKwl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGFpZGxfaW50ZXJmYWNlOiBteWlmYWNlLVYxLS4qLCBteWlmYWNlLVYyLS4qYCwgYAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZSIsCiAJCQlzcmNzOiBbIklGb28uYWlkbCJdLApAQCAtNzc4LDcgKzkxMiw3IEBACiAJCSJhaWRsX2FwaS9teWlmYWNlLzIvbXlpZmFjZS4yLmFpZGwiOiBuaWwsCiAJCSJhaWRsX2FwaS9teWlmYWNlLzIvLmhhc2giOiAgICAgICAgICBuaWwsCiAJfSkpCi0JdGVzdEFpZGxFcnJvcih0LCBgZGVwZW5kcyBvbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBhaWRsX2ludGVyZmFjZTogbXlpZmFjZS1WMS1uZGssIG15aWZhY2UtVjItbmRrYCwgYAorCXRlc3RBaWRsRXJyb3IodCwgYGRlcGVuZHMgb24gbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWlkbF9pbnRlcmZhY2U6IG15aWZhY2UtVjEtLiosIG15aWZhY2UtVjItLipgLCBgCiAJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCW5hbWU6ICJteWlmYWNlIiwKIAkJCXNyY3M6IFsiSUZvby5haWRsIl0sCkBAIC03ODgsNyArOTIyLDcgQEAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogIm15aWZhY2UyIiwKIAkJCXNyY3M6IFsiSUJhci5haWRsIl0sCi0JCQlpbXBvcnRzOiBbIm15aWZhY2UiXQorCQkJaW1wb3J0czogWyJteWlmYWNlLVYyIl0KIAkJfQogCiAJCWNjX2xpYnJhcnkgewpAQCAtODAwLDIyICs5MzQsMTcgQEAKIAkJImFpZGxfYXBpL215aWZhY2UvMS9teWlmYWNlLjEuYWlkbCI6IG5pbCwKIAkJImFpZGxfYXBpL215aWZhY2UvMS8uaGFzaCI6ICAgICAgICAgIG5pbCwKIAl9KSkKLQl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGFpZGxfaW50ZXJmYWNlOiBteWlmYWNlLVYxLW5kay1zb3VyY2UsIG15aWZhY2UtVjItbmRrYCwgYAorCXRlc3RBaWRsRXJyb3IodCwgYGRlcGVuZHMgb24gbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWlkbF9pbnRlcmZhY2U6IG15aWZhY2UtVjEtLiosIG15aWZhY2UtVjItLipgLCBgCiAJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCW5hbWU6ICJteWlmYWNlIiwKIAkJCXNyY3M6IFsiSUZvby5haWRsIl0sCiAJCQl2ZXJzaW9uczogWyIxIl0sCi0JCQliYWNrZW5kOiB7Ci0JCQkJbmRrOiB7Ci0JCQkJCXNyY3NfYXZhaWxhYmxlOiB0cnVlLAotCQkJCX0sCi0JCQl9LAogCQl9CiAKIAkJYWlkbF9pbnRlcmZhY2UgewogCQkJbmFtZTogIm15aWZhY2UyIiwKIAkJCXNyY3M6IFsiSUJhci5haWRsIl0sCi0JCQlpbXBvcnRzOiBbIm15aWZhY2UiXQorCQkJaW1wb3J0czogWyJteWlmYWNlLVYyIl0KIAkJfQogCiAJCWNjX2xpYnJhcnkgewpAQCAtODI4LDIyICs5NTcsMzIgQEAKIAkJImFpZGxfYXBpL215aWZhY2UvMS9teWlmYWNlLjEuYWlkbCI6IG5pbCwKIAkJImFpZGxfYXBpL215aWZhY2UvMS8uaGFzaCI6ICAgICAgICAgIG5pbCwKIAl9KSkKKwkvLyBPa2F5IHRvIHJlZmVyZW5jZSB0d28gZGlmZmVyZW50CiAJdGVzdEFpZGwodCwgYAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZSIsCiAJCQlzcmNzOiBbIklGb28uYWlkbCJdLAogCQkJdmVyc2lvbnM6IFsiMSJdLAotCQkJYmFja2VuZDogewotCQkJCW5kazogewotCQkJCQlzcmNzX2F2YWlsYWJsZTogdHJ1ZSwKLQkJCQl9LAotCQkJfSwKKwkJfQorCQljY19saWJyYXJ5IHsKKwkJCW5hbWU6ICJmb29iYXIiLAorCQkJc2hhcmVkX2xpYnM6IFsibXlpZmFjZS1WMS1jcHAiLCAibXlpZmFjZS1WMS1uZGsiXSwKKwkJfQorCWAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImFpZGxfYXBpL215aWZhY2UvMS9teWlmYWNlLjEuYWlkbCI6IG5pbCwKKwkJImFpZGxfYXBpL215aWZhY2UvMS8uaGFzaCI6ICAgICAgICAgIG5pbCwKKwl9KSkKKwl0ZXN0QWlkbCh0LCBgCisJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCW5hbWU6ICJteWlmYWNlIiwKKwkJCXNyY3M6IFsiSUZvby5haWRsIl0sCisJCQl2ZXJzaW9uczogWyIxIl0sCiAJCX0KIAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZTIiLAogCQkJc3JjczogWyJJQmFyLmFpZGwiXSwKLQkJCWltcG9ydHM6IFsibXlpZmFjZSJdCisJCQlpbXBvcnRzOiBbIm15aWZhY2UtVjIiXQogCQl9CiAKIAkJY2NfbGlicmFyeSB7CkBAIC04NjYsNyArMTAwNSw3IEBACiAJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCW5hbWU6ICJteWlmYWNlMiIsCiAJCQlzcmNzOiBbIklCYXIuYWlkbCJdLAotCQkJaW1wb3J0czogWyJteWlmYWNlIl0KKwkJCWltcG9ydHM6IFsibXlpZmFjZS1WMiJdCiAJCX0KIAogCQljY19saWJyYXJ5IHsKQEAgLTkxOCw3NSArMTA1NywxNiBAQAogCWApCiB9CiAKLWZ1bmMgVGVzdENjTW9kdWxlV2l0aEFwZXhOYW1lTWFjcm8odCAqdGVzdGluZy5UKSB7CitmdW5jIFRlc3RSZWNvdmVyeUF2YWlsYWJsZSh0ICp0ZXN0aW5nLlQpIHsKIAljdHgsIF8gOj0gdGVzdEFpZGwodCwgYAogCQlhaWRsX2ludGVyZmFjZSB7CiAJCQluYW1lOiAibXlpZmFjZSIsCisJCQlyZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiAJCQlzcmNzOiBbIklGb28uYWlkbCJdLAotCQkJYmFja2VuZDogewotCQkJCW5kazogewotCQkJCQlhcGV4X2F2YWlsYWJsZTogWyJteWFwZXgiXSwKLQkJCQl9LAotCQkJfSwKIAkJfQotCQlhcGV4IHsKLQkJCW5hbWU6ICJteWFwZXgiLAotCQkJa2V5OiAibXlhcGV4LmtleSIsCi0JCQluYXRpdmVfc2hhcmVkX2xpYnM6IFsibXlpZmFjZS1WMS1uZGtfcGxhdGZvcm0iXSwKLQkJCXVwZGF0YWJsZTogZmFsc2UsCi0JCX0KLQkJYXBleF9rZXkgewotCQkJbmFtZTogIm15YXBleC5rZXkiLAotCQkJcHVibGljX2tleTogInRlc3RrZXkuYXZicHVia2V5IiwKLQkJCXByaXZhdGVfa2V5OiAidGVzdGtleS5wZW0iLAotCQl9Ci0JYCwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRlewotCQkic3lzdGVtL3NlcG9saWN5L2FwZXgvbXlhcGV4LWZpbGVfY29udGV4dHMiOiBuaWwsCi0JfSkpCi0KLQljY1J1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJteWlmYWNlLVYxLW5ka19wbGF0Zm9ybSIsICJhbmRyb2lkX2FybTY0X2FybXY4LWFfc3RhdGljX215YXBleCIpLlJ1bGUoImNjIikKLQlhc3NlcnRDb250YWlucyh0LCBjY1J1bGUuQXJnc1siY0ZsYWdzIl0sICItRF9fQU5EUk9JRF9BUEVYX18iKQotCWFzc2VydENvbnRhaW5zKHQsIGNjUnVsZS5BcmdzWyJjRmxhZ3MiXSwgIi1EX19BTkRST0lEX0FQRVhfTkFNRV9fPSdcIm15YXBleFwiJyIpCi0JYXNzZXJ0Q29udGFpbnModCwgY2NSdWxlLkFyZ3NbImNGbGFncyJdLCAiLURfX0FORFJPSURfQVBFWF9NWUFQRVhfXyIpCi19Ci0KLWZ1bmMgVGVzdFNyY3NBdmFpbGFibGUodCAqdGVzdGluZy5UKSB7Ci0JYnAgOj0gYAotCQlhaWRsX2ludGVyZmFjZSB7Ci0JCQluYW1lOiAibXlpZmFjZSIsCi0JCQlzcmNzOiBbIklGb28uYWlkbCJdLAotCQkJYmFja2VuZDogewotCQkJCWphdmE6IHsKLQkJCQkJc3Jjc19hdmFpbGFibGU6ICVzLAotCQkJCX0sCi0JCQkJY3BwOiB7Ci0JCQkJCXNyY3NfYXZhaWxhYmxlOiAlcywKLQkJCQl9LAotCQkJfSwKLQkJfQotCWAKLQljdXN0b21pemVyIDo9IHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKLQkJIm90aGVycGFja2FnZS9BbmRyb2lkLmJwIjogW11ieXRlKGAKLQkJCWphdmFfbGlicmFyeSB7Ci0JCQkJbmFtZTogImphdmFsaWIiLAotCQkJCXNyY3M6IFsiOm15aWZhY2UtVjEtamF2YS1zb3VyY2UiXSwKLQkJCX0KLQkJCWNjX2xpYnJhcnlfc2hhcmVkIHsKLQkJCQluYW1lOiAiY2NsaWIiLAotCQkJCXNyY3M6IFsiOm15aWZhY2UtVjEtY3BwLXNvdXJjZSJdLAotCQkJfQotCQlgKSwKLQl9KQotCWN0eCwgXyA6PSB0ZXN0QWlkbCh0LCBmbXQuU3ByaW50ZihicCwgInRydWUiLCAidHJ1ZSIpLCBjdXN0b21pemVyKQotCWphdmFJbnB1dHMgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJqYXZhbGliIiwgImFuZHJvaWRfY29tbW9uIikuUnVsZSgiamF2YWMiKS5JbnB1dHMuU3RyaW5ncygpCi0JYXNzZXJ0TGlzdENvbnRhaW5zKHQsIGphdmFJbnB1dHMsICJteWlmYWNlLVYxLWphdmEtc291cmNlL2dlbi9JRm9vLmphdmEiKQotCWNjSW5wdXQgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJjY2xpYiIsICJhbmRyb2lkX2FybTY0X2FybXY4LWFfc2hhcmVkIikuUnVsZSgiY2MiKS5JbnB1dC5TdHJpbmcoKQotCWFzc2VydENvbnRhaW5zKHQsIGNjSW5wdXQsICJteWlmYWNlLVYxLWNwcC1zb3VyY2UvZ2VuL0lGb28uY3BwIikKLQotCXRlc3RBaWRsRXJyb3IodCwgYGRlcGVuZHMgb24gLy8uOm15aWZhY2UtVjEtamF2YS1zb3VyY2Ugd2hpY2ggaXMgbm90IHZpc2libGUgdG8gdGhpcyBtb2R1bGVgLAotCQlmbXQuU3ByaW50ZihicCwgImZhbHNlIiwgInRydWUiKSwgY3VzdG9taXplcikKLQl0ZXN0QWlkbEVycm9yKHQsIGBkZXBlbmRzIG9uIC8vLjpteWlmYWNlLVYxLWNwcC1zb3VyY2Ugd2hpY2ggaXMgbm90IHZpc2libGUgdG8gdGhpcyBtb2R1bGVgLAotCQlmbXQuU3ByaW50ZihicCwgInRydWUiLCAiZmFsc2UiKSwgY3VzdG9taXplcikKKwlgKQorCWN0eC5Nb2R1bGVGb3JUZXN0cygibXlpZmFjZS1WMS1uZGsiLCAiYW5kcm9pZF9yZWNvdmVyeV9hcm02NF9hcm12OC1hX3NoYXJlZCIpCisJY3R4Lk1vZHVsZUZvclRlc3RzKCJteWlmYWNlLVYxLWNwcCIsICJhbmRyb2lkX3JlY292ZXJ5X2FybTY0X2FybXY4LWFfc2hhcmVkIikKIH0KIAogZnVuYyBUZXN0UnVzdER1cGxpY2F0ZU5hbWVzKHQgKnRlc3RpbmcuVCkgewpAQCAtMTAwMyw3ICsxMDgzLDg2IEBACiAJYCkKIH0KIAotZnVuYyBUZXN0QWlkbEltcG9ydEZsYWdzRm9ySW5jbHVkZURpcnModCAqdGVzdGluZy5UKSB7CitmdW5jIFRlc3RBaWRsSW1wb3J0RmxhZ3NGb3JJbXBvcnRlZE1vZHVsZXModCAqdGVzdGluZy5UKSB7CisJY3VzdG9taXplciA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJmb28vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImZvby1pZmFjZSIsCisJCQkJc3JjczogWyJhL0Zvby5haWRsIl0sCisJCQkJaW1wb3J0czogWyJiYXItaWZhY2UtVjIiXSwKKwkJCQl2ZXJzaW9uczogWyIxIl0sCisJCQl9CisJCWApLAorCQkiZm9vL2EvRm9vLmFpZGwiOiBuaWwsCisJCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlL2N1cnJlbnQvYS9Gb28uYWlkbCI6IG5pbCwKKwkJImZvby9haWRsX2FwaS9mb28taWZhY2UvMS9hL0Zvby5haWRsIjogICAgICAgbmlsLAorCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xLy5oYXNoIjogICAgICAgICAgICBuaWwsCisKKwkJImJhci9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiYmFyLWlmYWNlIiwKKwkJCQlzcmNzOiBbImIvQmFyLmFpZGwiXSwKKwkJCQlpbXBvcnRzOiBbImJhei1pZmFjZS1WMSJdLAorCQkJCXZlcnNpb25zOiBbIjEiXSwKKwkJCX0KKwkJYCksCisJCSJiYXIvYi9CYXIuYWlkbCI6IG5pbCwKKwkJImJhci9haWRsX2FwaS9iYXItaWZhY2UvY3VycmVudC9iL0Jhci5haWRsIjogbmlsLAorCQkiYmFyL2FpZGxfYXBpL2Jhci1pZmFjZS8xL2IvQmFyLmFpZGwiOiAgICAgICBuaWwsCisJCSJiYXIvYWlkbF9hcGkvYmFyLWlmYWNlLzEvLmhhc2giOiAgICAgICAgICAgIG5pbCwKKworCQkiYmF6L0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJiYXotaWZhY2UiLAorCQkJCXNyY3M6IFsiYi9CYXouYWlkbCJdLAorCQkJCWluY2x1ZGVfZGlyczogWyJiYXotaW5jbHVkZSJdLAorCQkJCXZlcnNpb25zOiBbIjEiXSwKKwkJCX0KKwkJYCksCisJCSJiYXovYi9CYXouYWlkbCI6IG5pbCwKKwkJImJhei9haWRsX2FwaS9iYXotaWZhY2UvY3VycmVudC9iL0Jhei5haWRsIjogbmlsLAorCQkiYmF6L2FpZGxfYXBpL2Jhei1pZmFjZS8xL2IvQmF6LmFpZGwiOiAgICAgICBuaWwsCisJCSJiYXovYWlkbF9hcGkvYmF6LWlmYWNlLzEvLmhhc2giOiAgICAgICAgICAgIG5pbCwKKwl9KQorCWN0eCwgXyA6PSB0ZXN0QWlkbCh0LCBgYCwgY3VzdG9taXplcikKKworCS8vIGNoZWNrYXBpZHVtcCBydWxlIGlzIHRvIGNvbXBhcmUgImNvbXBhdGliaWxpdHkiIGJldHdlZW4gVG9UKGR1bXApIGFuZCAiY3VycmVudCIKKwl7CisJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28taWZhY2UtYXBpIiwgIiIpLk91dHB1dCgiY2hlY2thcGlfZHVtcC50aW1lc3RhbXAiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0VxdWFscyh0LCAiY2hlY2thcGkoZHVtcCA9PSBjdXJyZW50KSBpbXBvcnRzIiwgIiIsIHJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjaGVja2FwaShkdW1wID09IGN1cnJlbnQpIG9wdGlvbmFsRmxhZ3MiLAorCQkJcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmFyL2Jhci1pZmFjZV9pbnRlcmZhY2UvMi9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorCisJLy8gaGFzX2RldmVsb3BtZW50IHJ1bGUgcnVucyAtLWNoZWNrYXBpIGZvciBlcXVhbGl0eSBiZXR3ZWVuIGxhdGVzdCgiMSIpCisJLy8gYW5kIFRvVAorCXsKKwkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1pZmFjZS1hcGkiLCAiIikuT3V0cHV0KCJoYXNfZGV2ZWxvcG1lbnQiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjaGVja2FwaShkdW1wID09IGxhdGVzdCgxKSkgc2hvdWxkIGltcG9ydCBpbXBvcnQncyBwcmVwcm9jZXNzZWQiLAorCQkJcnVsZS5SdWxlUGFyYW1zLkNvbW1hbmQsCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmFyL2Jhci1pZmFjZV9pbnRlcmZhY2UvMi9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorCisJLy8gY29tcGlsZSAodjEpCisJeworCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLVYxLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJhL0Zvby5jcHAiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0VxdWFscyh0LCAiY29tcGlsZShvbGQ9MSkgc2hvdWxkIGltcG9ydCBhaWRsX2FwaS8xIiwgIi1JZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xIiwgcnVsZS5BcmdzWyJpbXBvcnRzIl0pCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImNvbXBpbGUob2xkPTEpIHNob3VsZCBpbXBvcnQgYmFyLnByZXByb2Nlc3NlZCIsCisJCQlydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9iYXIvYmFyLWlmYWNlX2ludGVyZmFjZS8yL3ByZXByb2Nlc3NlZC5haWRsIikKKwl9CisJLy8gY29tcGlsZSBUb1QodjIpCisJeworCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLVYyLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJhL0Zvby5jcHAiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0VxdWFscyh0LCAiY29tcGlsZSh0b3Q9Mikgc2hvdWxkIGltcG9ydCBiYXNlIGRpcnMgb2Ygc3JjcyIsICItSWZvbyIsIHJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjb21waWxlKHRvdD0yKSBzaG91bGQgaW1wb3J0IGJhci5wcmVwcm9jZXNzZWQiLAorCQkJcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmFyL2Jhci1pZmFjZV9pbnRlcmZhY2UvMi9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorfQorCitmdW5jIFRlc3RBaWRsUHJlcHJvY2Vzcyh0ICp0ZXN0aW5nLlQpIHsKIAljdXN0b21pemVyIDo9IHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKIAkJImZvby9BbmRyb2lkLmJwIjogW11ieXRlKGAKIAkJCWFpZGxfaW50ZXJmYWNlIHsKQEAgLTEwMTcsOSArMTE3Niw5IEBACiAJCQkJCQkic3JjL2Zvby9Gb28uYWlkbCIsCiAJCQkJXSwKIAkJCQlpbXBvcnRzOiBbCi0JCQkJCQkiYmFyLWlmYWNlIiwKKwkJCQkJImJhci1pZmFjZSIsCiAJCQkJXSwKLQkJCQl2ZXJzaW9uczogWyIxIiwgIjIiXSwKKwkJCQl1bnN0YWJsZTogdHJ1ZSwKIAkJCX0KIAkJCWFpZGxfaW50ZXJmYWNlIHsKIAkJCQluYW1lOiAiYmFyLWlmYWNlIiwKQEAgLTEwMjcsNDAgKzExODYsNjIgQEAKIAkJCQlzcmNzOiBbCiAJCQkJCQkic3JjL2Jhci9CYXIuYWlkbCIsCiAJCQkJXSwKKwkJCQl1bnN0YWJsZTogdHJ1ZSwKIAkJCX0KIAkJYCksCi0JCSJmb28vc3JjL2Zvby9Gb28uYWlkbCI6ICAgICAgICAgICAgICAgICAgICAgICAgbmlsLAotCQkiZm9vL3NyYy9iYXIvQmFyLmFpZGwiOiAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwKLQkJImZvby9haWRsX2FwaS9mb28taWZhY2UvY3VycmVudC9mb28vRm9vLmFpZGwiOiBuaWwsCi0JCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzEvZm9vL0Zvby5haWRsIjogICAgICAgbmlsLAotCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xLy5oYXNoIjogICAgICAgICAgICAgIG5pbCwKLQkJImZvby9haWRsX2FwaS9mb28taWZhY2UvMi9mb28vRm9vLmFpZGwiOiAgICAgICBuaWwsCi0JCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzIvLmhhc2giOiAgICAgICAgICAgICAgbmlsLAorCQkiZm9vL3NyYy9mb28vRm9vLmFpZGwiOiBuaWwsCisJCSJmb28vc3JjL2Jhci9CYXIuYWlkbCI6IG5pbCwKIAl9KQogCWN0eCwgXyA6PSB0ZXN0QWlkbCh0LCBgYCwgY3VzdG9taXplcikKIAotCS8vIGNvbXBpbGUgZm9yIG9sZGVyIHZlcnNpb24KLQl7Ci0JCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28taWZhY2UtVjEtY3BwLXNvdXJjZSIsICIiKS5PdXRwdXQoImZvby9Gb28uY3BwIikKLQkJaW1wb3J0cyA6PSBzdHJpbmdzLlNwbGl0KHJ1bGUuQXJnc1siaW1wb3J0cyJdLCAiICIpCi0JCWFuZHJvaWQuQXNzZXJ0QXJyYXlTdHJpbmcodCwgInNob3VsZCBpbXBvcnQgZm9vLzEodGFyZ2V0KSBhbmQgYmFyL2N1cnJlbnQoaW1wb3J0ZWQpIiwgW11zdHJpbmd7Ci0JCQkiLUlmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzEiLAotCQkJIi1JcGF0aDEiLAotCQkJIi1JcGF0aDIvc3ViIiwKLQkJCSItSWZvby9haWRsX2FwaS9iYXItaWZhY2UvY3VycmVudCIsCi0JCX0sIGltcG9ydHMpCi0JfQotCS8vIGNvbXBpbGUgZm9yIHRvdCB2ZXJzaW9uCi0JewotCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLVYzLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmNwcCIpCi0JCWltcG9ydHMgOj0gc3RyaW5ncy5TcGxpdChydWxlLkFyZ3NbImltcG9ydHMiXSwgIiAiKQotCQlhbmRyb2lkLkFzc2VydEFycmF5U3RyaW5nKHQsICJhaWRsQ29tcGlsZSBzaG91bGQgaW1wb3J0IFRvVCIsIFtdc3RyaW5newotCQkJIi1JZm9vL3NyYyIsCi0JCQkiLUlwYXRoMSIsCi0JCQkiLUlwYXRoMi9zdWIiLAotCQkJIi1JZm9vL3NyYyIsCi0JCX0sIGltcG9ydHMpCi0JfQorCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28taWZhY2VfaW50ZXJmYWNlIiwgIiIpLk91dHB1dCgicHJlcHJvY2Vzc2VkLmFpZGwiKQorCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgInByZXByb2Nlc3Npbmcgc2hvdWxkIGltcG9ydCBzcmNzIGFuZCBpbmNsdWRlX2RpcnMiLAorCQlydWxlLlJ1bGVQYXJhbXMuQ29tbWFuZCwKKwkJIi1JZm9vL3NyYyAtSXBhdGgxIC1JcGF0aDIvc3ViIikKKwlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJwcmVwcm9jZXNzaW5nIHNob3VsZCBpbXBvcnQgaW1wb3J0J3MgcHJlcHJvY2VzcyIsCisJCXJ1bGUuUnVsZVBhcmFtcy5Db21tYW5kLAorCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvZm9vL2Jhci1pZmFjZV9pbnRlcmZhY2UvcHJlcHJvY2Vzc2VkLmFpZGwiKQorfQorCitmdW5jIFRlc3RBaWRsSW1wb3J0RmxhZ3NGb3JVbnN0YWJsZSh0ICp0ZXN0aW5nLlQpIHsKKwljdXN0b21pemVyIDo9IHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImZvby9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiZm9vLWlmYWNlIiwKKwkJCQlsb2NhbF9pbmNsdWRlX2RpcjogInNyYyIsCisJCQkJaW5jbHVkZV9kaXJzOiBbCisJCQkJCQkicGF0aDEiLAorCQkJCQkJInBhdGgyL3N1YiIsCisJCQkJXSwKKwkJCQlzcmNzOiBbCisJCQkJCQkic3JjL2Zvby9Gb28uYWlkbCIsCisJCQkJXSwKKwkJCQlpbXBvcnRzOiBbCisJCQkJCSJiYXItaWZhY2UiLAorCQkJCV0sCisJCQkJdW5zdGFibGU6IHRydWUsCisJCQl9CisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImJhci1pZmFjZSIsCisJCQkJbG9jYWxfaW5jbHVkZV9kaXI6ICJzcmMiLAorCQkJCXNyY3M6IFsKKwkJCQkJCSJzcmMvYmFyL0Jhci5haWRsIiwKKwkJCQldLAorCQkJCXVuc3RhYmxlOiB0cnVlLAorCQkJfQorCQlgKSwKKwkJImZvby9zcmMvZm9vL0Zvby5haWRsIjogbmlsLAorCQkiZm9vL3NyYy9iYXIvQmFyLmFpZGwiOiBuaWwsCisJfSkKKwljdHgsIF8gOj0gdGVzdEFpZGwodCwgYGAsIGN1c3RvbWl6ZXIpCisKKwlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmNwcCIpCisJYW5kcm9pZC5Bc3NlcnRTdHJpbmdFcXVhbHModCwgImNvbXBpbGUodW5zdGFibGUpIHNob3VsZCBpbXBvcnQgZm9vL2Jhc2VfZGlycyh0YXJnZXQpIGFuZCBiYXIvYmFzZV9kaXJzKGltcG9ydGVkKSIsCisJCSItSWZvby9zcmMgLUlwYXRoMSAtSXBhdGgyL3N1YiIsCisJCXJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImNvbXBpbGUodW5zdGFibGUpIHNob3VsZCBpbXBvcnQgYmFyLnByZXByb2Nlc3NlZCIsCisJCXJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvZm9vL2Jhci1pZmFjZV9pbnRlcmZhY2UvcHJlcHJvY2Vzc2VkLmFpZGwiKQogfQogCiBmdW5jIFRlc3RTdXBwb3J0c0dlbnJ1bGVBbmRGaWxlZ3JvdXAodCAqdGVzdGluZy5UKSB7CkBAIC0xMDc5LDcgKzEyNjAsNyBAQAogCQkJCQkJIjpnZW4xIiwKIAkJCQldLAogCQkJCWltcG9ydHM6IFsKLQkJCQkJCSJiYXItaWZhY2UiLAorCQkJCQkJImJhci1pZmFjZS1WMSIsCiAJCQkJXSwKIAkJCQl2ZXJzaW9uczogWyIxIl0sCiAJCQl9CkBAIC0xMTAyLDggKzEyODMsMTYgQEAKIAkJCQlsb2NhbF9pbmNsdWRlX2RpcjogInNyYyIsCiAJCQkJc3JjczogWwogCQkJCQkJInNyYy9iYXIvQmFyLmFpZGwiLAorCQkJCQkJIjpnZW4tYmFyIiwKIAkJCQldLAogCQkJfQorCQkJZ2VucnVsZSB7CisJCQkJbmFtZTogImdlbi1iYXIiLAorCQkJCWNtZDogImdlbmVyYXRlIGdlbi9HZW5CYXIuYWlkbCIsCisJCQkJb3V0OiBbCisJCQkJCSJnZW4vR2VuQmFyLmFpZGwiLAorCQkJCV0KKwkJCX0KIAkJYCksCiAJCSJmb28vYWlkbF9hcGkvZm9vLWlmYWNlLzEvZm9vL0Zvby5haWRsIjogbmlsLAogCQkiZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xLy5oYXNoIjogICAgICAgIG5pbCwKQEAgLTExMTUsMjYgKzEzMDQsMjIgQEAKIAkvLyBhaWRsQ29tcGlsZSBmb3Igc25hcHNob3RzICh2MSkKIAl7CiAJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJmb28taWZhY2UtVjEtY3BwLXNvdXJjZSIsICIiKS5PdXRwdXQoImZvby9Gb28uY3BwIikKLQkJaW1wb3J0cyA6PSBzdHJpbmdzLlNwbGl0KHJ1bGUuQXJnc1siaW1wb3J0cyJdLCAiICIpCi0JCWFuZHJvaWQuQXNzZXJ0QXJyYXlTdHJpbmcodCwgImFpZGxDb21waWxlIHNob3VsZCBpbXBvcnQgZmlsZWdyb3VwL2dlbnJ1bGUgYXMgd2VsbCIsIFtdc3RyaW5newotCQkJIi1JZm9vL2FpZGxfYXBpL2Zvby1pZmFjZS8xIiwKLQkJCSItSXBhdGgxIiwKLQkJCSItSXBhdGgyL3N1YiIsCi0JCQkiLUlmb28vYWlkbF9hcGkvYmFyLWlmYWNlL2N1cnJlbnQiLAotCQl9LCBpbXBvcnRzKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0VxdWFscyh0LCAiY29tcGlsZSgxKSBzaG91bGQgaW1wb3J0IGZvby9haWRsX2FwaS8xIiwKKwkJCSItSWZvby9haWRsX2FwaS9mb28taWZhY2UvMSAtSXBhdGgxIC1JcGF0aDIvc3ViIiwKKwkJCXJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjb21waWxlKDEpIHNob3VsZCBpbXBvcnQgYmFyLnByZXByb2Nlc3NlZCIsCisJCQlydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9mb28vYmFyLWlmYWNlX2ludGVyZmFjZS8xL3ByZXByb2Nlc3NlZC5haWRsIikKIAl9CiAJLy8gYWlkbENvbXBpbGUgZm9yIFRvVCAodjIpCiAJewogCQlydWxlIDo9IGN0eC5Nb2R1bGVGb3JUZXN0cygiZm9vLWlmYWNlLVYyLWNwcC1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmNwcCIpCi0JCWltcG9ydHMgOj0gc3RyaW5ncy5TcGxpdChydWxlLkFyZ3NbImltcG9ydHMiXSwgIiAiKQotCQlhbmRyb2lkLkFzc2VydEFycmF5U3RyaW5nKHQsICJhaWRsQ29tcGlsZSBzaG91bGQgaW1wb3J0IGZpbGVncm91cC9nZW5ydWxlIGFzIHdlbGwiLCBbXXN0cmluZ3sKLQkJCSItSWZvby9zcmMiLAotCQkJIi1JZm9vL2ZpbGVncm91cC9zdWIiLAotCQkJIi1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9nZW4xL2dlbiIsCi0JCQkiLUlwYXRoMSIsCi0JCQkiLUlwYXRoMi9zdWIiLAotCQkJIi1JZm9vL3NyYyIsCi0JCX0sIGltcG9ydHMpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRXF1YWxzKHQsICJjb21waWxlKHRvdD0yKSBzaG91bGQgaW1wb3J0IGZvby5iYXNlX2RpcnMiLAorCQkJIi1JZm9vL3NyYyAtSWZvby9maWxlZ3JvdXAvc3ViIC1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9nZW4xL2dlbiAtSXBhdGgxIC1JcGF0aDIvc3ViIiwKKwkJCXJ1bGUuQXJnc1siaW1wb3J0cyJdKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJjb21waWxlKHRvdD0yKSBzaG91bGQgaW1wb3J0IGJhci5wcmVwcm9jZXNzZWQiLAorCQkJcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvZm9vL2Jhci1pZmFjZV9pbnRlcmZhY2UvMS9wcmVwcm9jZXNzZWQuYWlkbCIpCiAJfQogCiAJLy8gZHVtcGFwaQpAQCAtMTE1NCwyMyArMTMzOSwxMiBAQAogCQkJZHVtcERpciArICIvLmhhc2giLAogCQl9LCBydWxlLk91dHB1dHMuUGF0aHMoKSkKIAotCQlpbXBvcnRzIDo9IHN0cmluZ3MuU3BsaXQocnVsZS5BcmdzWyJpbXBvcnRzIl0sICIgIikKLQkJYW5kcm9pZC5Bc3NlcnRBcnJheVN0cmluZyh0LCAiZHVtcGFwaSBzaG91bGQgaW1wb3J0IGZpbGVncm91cC9nZW5ydWxlIGFzIHdlbGwiLCBbXXN0cmluZ3sKLQkJCS8vIHRoZXNlIGFyZSBmcm9tIGZvby1pZmFjZS5zcmNzCi0JCQkiLUlmb28vc3JjIiwKLQkJCSItSWZvby9maWxlZ3JvdXAvc3ViIiwKLQkJCSItSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9mb28vZ2VuMS9nZW4iLAotCi0JCQkvLyB0aGlzIGlzIGZyb20gYmFyLWlmYWNlLnNyY3MKLQkJCSItSWZvby9zcmMiLAotCi0JCQkvLyB0aGlzIGlzIGZyb20gZm9vLWlmYWNlLkxvY2FsX2luY2x1ZGVfZGlyCi0JCQkiLUlmb28vc3JjIiwKLQotCQkJLy8gdGhlc2UgYXJlIGZyb20gZm9vLWlmYWNlLmluY2x1ZGVfZGlycwotCQkJIi1JcGF0aDEiLAotCQkJIi1JcGF0aDIvc3ViIiwKLQkJfSwgaW1wb3J0cykKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdFcXVhbHModCwgImR1bXBhcGkgc2hvdWxkIGltcG9ydCBiYXNlX2RpcnMgYW5kIGluY2x1ZGVfZGlycyIsCisJCQkiLUlmb28vc3JjIC1JZm9vL2ZpbGVncm91cC9zdWIgLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvZm9vL2dlbjEvZ2VuIC1JcGF0aDEgLUlwYXRoMi9zdWIiLAorCQkJcnVsZS5BcmdzWyJpbXBvcnRzIl0pCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImR1bXBhcGkgc2hvdWxkIGltcG9ydCBiYXIucHJlcHJvY2Vzc2VkIiwKKwkJCXJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Zvby9iYXItaWZhY2VfaW50ZXJmYWNlLzEvcHJlcHJvY2Vzc2VkLmFpZGwiKQogCX0KIH0KIApAQCAtMTE5OSw2ICsxMzczLDIyIEBACiAJfQogfQogCitmdW5jIFRlc3RBaWRsTW9kdWxlSmF2YVNka1ZlcnNpb25EZXRlcm1pbmVzTWluU2RrVmVyc2lvbih0ICp0ZXN0aW5nLlQpIHsKKwljdHgsIF8gOj0gdGVzdEFpZGwodCwgYAorCQlhaWRsX2ludGVyZmFjZSB7CisJCQluYW1lOiAibXlpZmFjZSIsCisJCQlzcmNzOiBbImEvRm9vLmFpZGwiXSwKKwkJCWJhY2tlbmQ6IHsKKwkJCQlqYXZhOiB7CisJCQkJCXNka192ZXJzaW9uOiAiMjgiLAorCQkJCX0sCisJCQl9LAorCQl9CisJYCwgamF2YS5GaXh0dXJlV2l0aFByZWJ1aWx0QXBpcyhtYXBbc3RyaW5nXVtdc3RyaW5neyIyOCI6IHsiZm9vIn19KSkKKwlwYXJhbXMgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJteWlmYWNlLVYxLWphdmEtc291cmNlIiwgIiIpLk91dHB1dCgiYS9Gb28uamF2YSIpCisJYXNzZXJ0Q29udGFpbnModCwgcGFyYW1zLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwgIi0tbWluX3Nka192ZXJzaW9uIDI4IikKK30KKwogZnVuYyBUZXN0QWlkbE1vZHVsZU5hbWVDb250YWluc1ZlcnNpb24odCAqdGVzdGluZy5UKSB7CiAJdGVzdEFpZGxFcnJvcih0LCAiYWlkbF9pbnRlcmZhY2Ugc2hvdWxkIG5vdCBoYXZlICctVjxudW1iZXI+IHN1ZmZpeCIsIGAKIAkJYWlkbF9pbnRlcmZhY2UgewpAQCAtMTI3NiwzICsxNDY2LDE4NyBAQAogCQkiYWlkbF9hcGkvYmFyLzEvLmhhc2giOiAgICBuaWwsCiAJfSkpCiB9CisKK2Z1bmMgVGVzdFVzZVZlcnNpb25lZFByZXByb2Nlc3NlZFdoZW5JbXBvcm90ZWRXaXRoVmVyc2lvbnModCAqdGVzdGluZy5UKSB7CisJY3R4LCBfIDo9IHRlc3RBaWRsKHQsIGAKKwkJYWlkbF9pbnRlcmZhY2UgeworCQkJbmFtZTogInVuc3RhYmxlLWZvbyIsCisJCQlzcmNzOiBbImZvby9Gb28uYWlkbCJdLAorCQkJaW1wb3J0czogWworCQkJCQkiYmFyLVYyIiwKKwkJCQkJImJhei1WMSIsCisJCQkJCSJ1bnN0YWJsZS1iYXIiLAorCQkJXSwKKwkJCXVuc3RhYmxlOiB0cnVlLAorCQl9CisJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCW5hbWU6ICJmb28iLAorCQkJc3JjczogWyJmb28vRm9vLmFpZGwiXSwKKwkJCWltcG9ydHM6IFsKKwkJCQkJImJhci1WMSIsCisJCQkJCSJiYXotVjEiLAorCQkJXSwKKwkJCXZlcnNpb25zOiBbIjEiXSwKKwkJfQorCQlhaWRsX2ludGVyZmFjZSB7CisJCQluYW1lOiAiZm9vLW5vLXZlcnNpb25zIiwKKwkJCXNyY3M6IFsiZm9vL0Zvby5haWRsIl0sCisJCQlpbXBvcnRzOiBbCisJCQkJCSJiYXItVjIiLAorCQkJXSwKKwkJfQorCQlhaWRsX2ludGVyZmFjZSB7CisJCQluYW1lOiAiYmFyIiwKKwkJCXNyY3M6IFsiYmFyL0Jhci5haWRsIl0sCisJCQl2ZXJzaW9uczogWyIxIl0sCisJCX0KKwkJYWlkbF9pbnRlcmZhY2UgeworCQkJbmFtZTogInVuc3RhYmxlLWJhciIsCisJCQlzcmNzOiBbImJhci9CYXIuYWlkbCJdLAorCQkJdW5zdGFibGU6IHRydWUsCisJCX0KKwkJYWlkbF9pbnRlcmZhY2UgeworCQkJbmFtZTogImJheiIsCisJCQlzcmNzOiBbImJhei9CYXouYWlkbCJdLAorCQkJdmVyc2lvbnM6IFsiMSJdLAorCQl9CisJYCwgd2l0aEZpbGVzKG1hcFtzdHJpbmddW11ieXRleworCQkiZm9vL0Zvby5haWRsIjogICAgICAgICAgICAgICAgbmlsLAorCQkiYmFyL0Jhci5haWRsIjogICAgICAgICAgICAgICAgbmlsLAorCQkiYmF6L0Jhei5haWRsIjogICAgICAgICAgICAgICAgbmlsLAorCQkiYWlkbF9hcGkvZm9vLzEvZm9vL0Zvby5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgICAgbmlsLAorCQkiYWlkbF9hcGkvYmFyLzEvYmFyL0Jhci5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvYmFyLzEvLmhhc2giOiAgICAgICAgbmlsLAorCQkiYWlkbF9hcGkvYmF6LzEvYmF6L0Jhei5haWRsIjogbmlsLAorCQkiYWlkbF9hcGkvYmF6LzEvLmhhc2giOiAgICAgICAgbmlsLAorCX0pKQorCXsKKwkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1WMi1qYXZhLXNvdXJjZSIsICIiKS5PdXRwdXQoImZvby9Gb28uamF2YSIpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImZvby1WMih0b3QpIGltcG9ydHMgYmFyLVYxIGZvciAnYmFyLVYxJyIsIHJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhcl9pbnRlcmZhY2UvMS9wcmVwcm9jZXNzZWQuYWlkbCIpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImZvby1WMih0b3QpIGltcG9ydHMgYmF6LVYxIGZvciAnYmF6LVYxJyIsIHJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhel9pbnRlcmZhY2UvMS9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorCXsKKwkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1WMS1qYXZhLXNvdXJjZSIsICIiKS5PdXRwdXQoImZvby9Gb28uamF2YSIpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImZvby1WMSBpbXBvcnRzIGJhci1WMShsYXRlc3QpIGZvciAnYmFyJyIsIHJ1bGUuQXJnc1sib3B0aW9uYWxGbGFncyJdLAorCQkJIi1wb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2Jhcl9pbnRlcmZhY2UvMS9wcmVwcm9jZXNzZWQuYWlkbCIpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImZvby1WMSBpbXBvcnRzIGJhei1WMSBmb3IgJ2Jhei1WMSciLCBydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9iYXpfaW50ZXJmYWNlLzEvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCX0KKwl7CisJCXJ1bGUgOj0gY3R4Lk1vZHVsZUZvclRlc3RzKCJ1bnN0YWJsZS1mb28tamF2YS1zb3VyY2UiLCAiIikuT3V0cHV0KCJmb28vRm9vLmphdmEiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJ1bnN0YWJsZS1mb28gaW1wb3J0cyBiYXItVjIobGF0ZXN0KSBmb3IgJ2JhciciLCBydWxlLkFyZ3NbIm9wdGlvbmFsRmxhZ3MiXSwKKwkJCSItcG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9iYXJfaW50ZXJmYWNlLzIvcHJlcHJvY2Vzc2VkLmFpZGwiKQorCQlhbmRyb2lkLkFzc2VydFN0cmluZ0RvZXNDb250YWluKHQsICJ1bnN0YWJsZS1mb28gaW1wb3J0cyBiYXotVjEgZm9yICdiYXotVjEnIiwgcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmF6X2ludGVyZmFjZS8xL3ByZXByb2Nlc3NlZC5haWRsIikKKwkJYW5kcm9pZC5Bc3NlcnRTdHJpbmdEb2VzQ29udGFpbih0LCAidW5zdGFibGUtZm9vIGltcG9ydHMgdW5zdGFibGUtYmFyKFRvVCkgZm9yICd1bnN0YWJsZS1iYXInIiwgcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvdW5zdGFibGUtYmFyX2ludGVyZmFjZS9wcmVwcm9jZXNzZWQuYWlkbCIpCisJfQorCXsKKwkJcnVsZSA6PSBjdHguTW9kdWxlRm9yVGVzdHMoImZvby1uby12ZXJzaW9ucy1WMS1qYXZhLXNvdXJjZSIsICIiKS5PdXRwdXQoImZvby9Gb28uamF2YSIpCisJCWFuZHJvaWQuQXNzZXJ0U3RyaW5nRG9lc0NvbnRhaW4odCwgImZvby1uby12ZXJzaW9ucy1WMShsYXRlc3QpIGltcG9ydHMgYmFyLVYyKGxhdGVzdCkgZm9yICdiYXInIiwgcnVsZS5BcmdzWyJvcHRpb25hbEZsYWdzIl0sCisJCQkiLXBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYmFyX2ludGVyZmFjZS8yL3ByZXByb2Nlc3NlZC5haWRsIikKKwl9Cit9CisKK2Z1bmMgRmluZE1vZHVsZShjdHggKmFuZHJvaWQuVGVzdENvbnRleHQsIG5hbWUsIHZhcmlhbnQsIGRpciBzdHJpbmcpIGFuZHJvaWQuTW9kdWxlIHsKKwl2YXIgbW9kdWxlIGFuZHJvaWQuTW9kdWxlCisJY3R4LlZpc2l0QWxsTW9kdWxlcyhmdW5jKG0gYmx1ZXByaW50Lk1vZHVsZSkgeworCQlpZiBjdHguTW9kdWxlTmFtZShtKSA9PSBuYW1lICYmIGN0eC5Nb2R1bGVTdWJEaXIobSkgPT0gdmFyaWFudCAmJiBjdHguTW9kdWxlRGlyKG0pID09IGRpciB7CisJCQltb2R1bGUgPSBtLihhbmRyb2lkLk1vZHVsZSkKKwkJfQorCX0pCisJaWYgbW9kdWxlID09IG5pbCB7CisJCW0gOj0gY3R4Lk1vZHVsZUZvclRlc3RzKG5hbWUsIHZhcmlhbnQpLk1vZHVsZSgpCisJCXBhbmljKGZtdC5FcnJvcmYoImZhaWxlZCB0byBmaW5kIG1vZHVsZSAlcSB2YXJpYW50ICVxIGRpciAlcSwgYnV0IGZvdW5kIG9uZSBpbiAlcSIsCisJCQluYW1lLCB2YXJpYW50LCBkaXIsIGN0eC5Nb2R1bGVEaXIobSkpKQorCX0KKwlyZXR1cm4gbW9kdWxlCit9CisKK2Z1bmMgVGVzdER1cGxpY2F0ZUludGVyZmFjZXNXaXRoVGhlU2FtZU5hbWVJbkRpZmZlcmVudFNvb25nTmFtZXNwYWNlcyh0ICp0ZXN0aW5nLlQpIHsKKwljdHgsIF8gOj0gdGVzdEFpZGwodCwgYGAsIHdpdGhGaWxlcyhtYXBbc3RyaW5nXVtdYnl0ZXsKKwkJImNvbW1vbi9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJICBhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImNvbW1vbiIsCisJCQkJc3JjczogWyJJQ29tbW9uLmFpZGwiXSwKKwkJCQl2ZXJzaW9uczogWyIxIiwgIjIiXSwKKwkJCX0KKwkJYCksCisJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzEvSUNvbW1vbi5haWRsIjogbmlsLAorCQkiY29tbW9uL2FpZGxfYXBpL2NvbW1vbi8xLy5oYXNoIjogICAgICAgIG5pbCwKKwkJImNvbW1vbi9haWRsX2FwaS9jb21tb24vMi9JQ29tbW9uLmFpZGwiOiBuaWwsCisJCSJjb21tb24vYWlkbF9hcGkvY29tbW9uLzIvLmhhc2giOiAgICAgICAgbmlsLAorCQkidmVuZG9yL2EvQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlzb29uZ19uYW1lc3BhY2Uge30KKwkJYCksCisJCSJ2ZW5kb3IvYS9mb28vQW5kcm9pZC5icCI6IFtdYnl0ZShgCisJCQlhaWRsX2ludGVyZmFjZSB7CisJCQkJbmFtZTogImZvbyIsCisJCQkJc3JjczogWyJJRm9vLmFpZGwiXSwKKwkJCQlpbXBvcnRzOiBbImNvbW1vbi1WMSJdLAorCQkJfQorCQlgKSwKKwkJInZlbmRvci9iL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJc29vbmdfbmFtZXNwYWNlIHt9CisJCWApLAorCQkidmVuZG9yL2IvZm9vL0FuZHJvaWQuYnAiOiBbXWJ5dGUoYAorCQkJYWlkbF9pbnRlcmZhY2UgeworCQkJCW5hbWU6ICJmb28iLAorCQkJCXNyY3M6IFsiSUZvby5haWRsIl0sCisJCQkJaW1wb3J0czogWyJjb21tb24tVjIiXSwKKwkJCX0KKwkJYCksCisJfSkpCisKKwlhRm9vVjFKYXZhIDo9IEZpbmRNb2R1bGUoY3R4LCAiZm9vLVYxLWphdmEiLCAiYW5kcm9pZF9jb21tb24iLCAidmVuZG9yL2EvZm9vIikuKCpqYXZhLkxpYnJhcnkpCisJYW5kcm9pZC5Bc3NlcnRTdHJpbmdMaXN0Q29udGFpbnModCwgImEvZm9vIGRlcHMiLCBhRm9vVjFKYXZhLkNvbXBpbGVyRGVwcygpLCAiY29tbW9uLVYxLWphdmEiKQorCisJYkZvb1YxSmF2YSA6PSBGaW5kTW9kdWxlKGN0eCwgImZvby1WMS1qYXZhIiwgImFuZHJvaWRfY29tbW9uIiwgInZlbmRvci9iL2ZvbyIpLigqamF2YS5MaWJyYXJ5KQorCWFuZHJvaWQuQXNzZXJ0U3RyaW5nTGlzdENvbnRhaW5zKHQsICJhL2ZvbyBkZXBzIiwgYkZvb1YxSmF2YS5Db21waWxlckRlcHMoKSwgImNvbW1vbi1WMi1qYXZhIikKK30KKworZnVuYyBUZXN0VW5zdGFibGVDaGVja3NGb3JBaWRsSW50ZXJmYWNlc0luRGlmZmVyZW50TmFtZXNwYWNlcyh0ICp0ZXN0aW5nLlQpIHsKKwlmaWxlcyA6PSB3aXRoRmlsZXMobWFwW3N0cmluZ11bXWJ5dGV7CisJCSJ2ZW5kb3IvYS9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCXNvb25nX25hbWVzcGFjZSB7fQorCQlgKSwKKwkJInZlbmRvci9hL2Zvby9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiZm9vIiwKKwkJCQlzcmNzOiBbIklGb28uYWlkbCJdLAorCQkJCXZlcnNpb25zOiBbIjEiLCAiMiJdLAorCQkJfQorCQkJamF2YV9saWJyYXJ5IHsKKwkJCQluYW1lOiAiYmFyIiwKKwkJCQlsaWJzOiBbImZvby1WMi1qYXZhIl0sICAvLyBPSworCQkJfQorCQlgKSwKKwkJInZlbmRvci9hL2Zvby9haWRsX2FwaS9mb28vMS9JRm9vLmFpZGwiOiBuaWwsCisJCSJ2ZW5kb3IvYS9mb28vYWlkbF9hcGkvZm9vLzEvLmhhc2giOiAgICAgbmlsLAorCQkidmVuZG9yL2EvZm9vL2FpZGxfYXBpL2Zvby8yL0lGb28uYWlkbCI6IG5pbCwKKwkJInZlbmRvci9hL2Zvby9haWRsX2FwaS9mb28vMi8uaGFzaCI6ICAgICBuaWwsCisJCSJ2ZW5kb3IvYi9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCXNvb25nX25hbWVzcGFjZSB7fQorCQlgKSwKKwkJInZlbmRvci9iL2Zvby9BbmRyb2lkLmJwIjogW11ieXRlKGAKKwkJCWFpZGxfaW50ZXJmYWNlIHsKKwkJCQluYW1lOiAiZm9vIiwKKwkJCQlzcmNzOiBbIklGb28uYWlkbCJdLAorCQkJCXZlcnNpb25zOiBbIjEiXSwKKwkJCX0KKwkJCWphdmFfbGlicmFyeSB7CisJCQkJbmFtZTogImJhciIsCisJCQkJbGliczogWyJmb28tVjEtamF2YSJdLCAgLy8gT0sKKwkJCX0KKwkJYCksCisJCSJ2ZW5kb3IvYi9mb28vYWlkbF9hcGkvZm9vLzEvSUZvby5haWRsIjogbmlsLAorCQkidmVuZG9yL2IvZm9vL2FpZGxfYXBpL2Zvby8xLy5oYXNoIjogICAgIG5pbCwKKwl9KQorCisJdGVzdEFpZGwodCwgYGAsIGZpbGVzLCBzZXRSZWxlYXNlRW52KCkpCisJdGVzdEFpZGwodCwgYGAsIGZpbGVzLCBzZXRUZXN0RnJlZXplRW52KCkpCisJdGVzdEFpZGwodCwgYGAsIGZpbGVzKQorfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYWlkbF91dGlscy5nbyBiL2J1aWxkL2FpZGxfdXRpbHMuZ28KaW5kZXggYjE5NzkzYy4uNGUwZmJhOSAxMDA2NDQKLS0tIGEvYnVpbGQvYWlkbF91dGlscy5nbworKysgYi9idWlsZC9haWRsX3V0aWxzLmdvCkBAIC0xNSw3ICsxNSw2IEBACiBwYWNrYWdlIGFpZGwKIAogaW1wb3J0ICgKLQkiYW5kcm9pZC9zb29uZy9hbmRyb2lkIgogCSJzdHJpbmdzIgogKQogCkBAIC00NiwyMiArNDUsNiBAQAogCXJldHVybiByZXQKIH0KIAotLy8gYmFzZURpciBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBwYWNrYWdlIG5hbWUgc3RhcnRzLiBlLmcuIEZvciBhbiBBSURMIGZpbAotLy8gbXltb2R1bGUvYWlkbF9zcmMvY29tL2FuZHJvaWQvSUZvby5haWRsLCBiYXNlRGlyIGlzIG15bW9kdWxlL2FpZGxfc3JjIGdpdmVuIHRoYXQgdGhlIHBhY2thZ2UgbmFtZSBpcwotLy8gY29tLmFuZHJvaWQuIFRoZSBidWlsZCBzeXN0ZW0gaG93ZXZlciBkb24ndCBrbm93IHRoZSBwYWNrYWdlIG5hbWUgd2l0aG91dCBhY3R1YWxseSByZWFkaW5nIHRoZSBBSURMIGZpbGUuCi0vLyBUaGVyZWZvcmUsIHdlIHJlbHkgb24gdGhlIHVzZXIgdG8gY29ycmVjdGx5IHNldCB0aGUgYmFzZSBkaXJlY3RvcnkgdmlhIGZvbGxvd2luZyB0d28gbWV0aG9kczoKLS8vIDEpIHZpYSB0aGUgJ3BhdGgnIHByb3BlcnR5IG9mIGZpbGVncm91cCBvcgotLy8gMikgdmlhIGBsb2NhbF9pbmNsdWRlX2Rpcicgb2YgdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZS4KLWZ1bmMgZ2V0QmFzZURpcihjdHggYW5kcm9pZC5Nb2R1bGVDb250ZXh0LCBzcmMgYW5kcm9pZC5QYXRoLCBhaWRsUm9vdCBhbmRyb2lkLlBhdGgpIHN0cmluZyB7Ci0JLy8gQnkgZGVmYXVsdCwgd2UgdHJ5IHRvIGdldCAxKSBieSByZWFkaW5nIFJlbCgpIG9mIHRoZSBpbnB1dCBwYXRoLgotCWJhc2VEaXIgOj0gc3RyaW5ncy5UcmltU3VmZml4KHNyYy5TdHJpbmcoKSwgc3JjLlJlbCgpKQotCS8vIEhvd2V2ZXIsIGlmIDIpIGlzIHNldCBhbmQgaXQncyBtb3JlIHNwZWNpZmljIChpLmUuIGRlZXBlcikgdGhhbiAxKSwgd2UgdXNlIDIpLgotCWlmIHN0cmluZ3MuSGFzUHJlZml4KGFpZGxSb290LlN0cmluZygpLCBiYXNlRGlyKSB7Ci0JCWJhc2VEaXIgPSBhaWRsUm9vdC5TdHJpbmcoKQotCX0KLQlyZXR1cm4gYmFzZURpcgotfQotCiBmdW5jIGZpeFJ1c3ROYW1lKG5hbWUgc3RyaW5nKSBzdHJpbmcgewogCXJldHVybiBzdHJpbmdzLk1hcChmdW5jKHIgcnVuZSkgcnVuZSB7CiAJCXN3aXRjaCByIHsKZGlmZiAtLWdpdCBhL2J1aWxkL2FwZXgvQW5kcm9pZC5icCBiL2J1aWxkL2FwZXgvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNDJhMy4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX3Rvb2xzX2FpZGxfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV90b29sc19haWRsX2xpY2Vuc2UiXSwKLX0KLQotYXBleF90ZXN0IHsKLSAgICBuYW1lOiAiY29tLmFuZHJvaWQuYWlkbHRlc3QiLAotICAgIG1hbmlmZXN0OiAiYXBleF9tYW5pZmVzdC5qc29uIiwKLSAgICBmaWxlX2NvbnRleHRzOiAiOmFwZXgudGVzdC1maWxlX2NvbnRleHRzIiwKLSAgICBrZXk6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5rZXkiLAotICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLmFpZGx0ZXN0LmNlcnRpZmljYXRlIiwKLSAgICBpbnN0YWxsYWJsZTogZmFsc2UsCi0gICAgdXBkYXRhYmxlOiBmYWxzZSwKLQotICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWwotICAgICAgICAidGVzdC1waWVjZS0xLVYzLW5ka19wbGF0Zm9ybSIsCi0gICAgXSwKLX0KLQotYXBleF9rZXkgewotICAgIG5hbWU6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5rZXkiLAotICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5wdWJrZXkiLAotICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQuYWlkbHRlc3QucGVtIiwKLX0KLQotYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgewotICAgIG5hbWU6ICJjb20uYW5kcm9pZC5haWRsdGVzdC5jZXJ0aWZpY2F0ZSIsCi0gICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5haWRsdGVzdCIsCi19CmRpZmYgLS1naXQgYS9idWlsZC9hcGV4L2FwZXhfbWFuaWZlc3QuanNvbiBiL2J1aWxkL2FwZXgvYXBleF9tYW5pZmVzdC5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjgxNDAzLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2FwZXgvYXBleF9tYW5pZmVzdC5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi17Ci0gICJuYW1lIjogImNvbS5hbmRyb2lkLmFpZGx0ZXN0IiwKLSAgInZlcnNpb24iOiAxCi19CmRpZmYgLS1naXQgYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0LnBlbSBiL2J1aWxkL2FwZXgvY29tLmFuZHJvaWQuYWlkbHRlc3QucGVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTgyYTJkLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2FwZXgvY29tLmFuZHJvaWQuYWlkbHRlc3QucGVtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJSktRSUJBQUtDQWdFQTViOTNRUTZXQitNczAvSXp0Q3o5WnF2RXgwb0wvOVpzQnJ6a2lRY2QzWXA5SFZjRgotSmV2dTRLZVg4NkJ1MnQ4blpucjZDeEpQeTZndzkyaXRmSFNiT1htZCtmczh0Y2gxRDZicXRVM3h4cTNXZzhTQgotQ0tXRDd3Wm9EZDdya0xxQ2pWNklEZWJVSzBEdFAxV210VE1tMm1JR0tUQ25xT2dmY25rU2UxWXdRMjJzdUtLcwotb3JPSXJyczJ3anlJWm5oMGlJdlBwc2ZhSTRZUTZPbzArVlRxYjJrTXBrU2xCMXluZDhmVVR4TVJKQ1lYeXd5TwotdThIVDdEVk1qOS9YWUYwbk43WUZGZi9RY2QwVU9YR2cwdkNibW5pakphd2t2Y2I0ZkxxUXRKL29WYWpCaEMrdAotY25GMW1VZ29oNHFxQkZNVmNhS2lraUxJLzludU9yMmphbG5NNHRwZHpQV2JQQ0JGdHJwKzFCam00NCsyS2R3WgotS2x6enpqNWdMOElPcFRER2JBNzA2bkdhaC9Zc1dJZXd5TE51YjZPeFo5U3VlNFNnampsMm1aTXRvNm8xY21udwotd3pOZjVCNmpxQWE4WDh6TFhqS3VmOUhWUCt2dTZ3VkZtZkZ4Q1ZFUEZUdWlqOGZPQjNZQytxSUt1K3V0N1oyNQotTVBoUFFhSzJ4VHlQRk0rUHhnSThvSUI4VmM0VTBRM0IvRnNSU2l2UTVEM2JVNnQ0NHozNlZOaUUwTFFnV2NWVAotc0M2Ynl2YzNiRlFlbFp4VlpWOWlPYXNLOXRPSVBUUVp5dkZWbEVEQzJVR2xGSWtoOG8xeXZEaVZXcVVtUDZmYQotcWMwNXllKzRXUVUrUWpHTXp4aVNtQXBKdnlXeHdRb25VQTMxd2g3aE40U1l3OTVHUVR6d2gwd0VJdzhDQXdFQQotQVFLQ0FnQUQzc1hUZ3J0a1JwOXFzcG5NWHpXbGxSOHJmRVBYZTNVMlo5Z3h0cno2RG1zdEkxb2kyV2Fjd2pYOQotRktiSmFSancwUUdGVGptcDVKdHVqNFRjbzlvNWphTHJveC9Tc0IzSXRiY2Vkc0dyNXlIRjlubDErOVBOSXY1OQotdlZPYWpJbkdkK0V5MnNDWU9lL0ZNVnd0a1Q4R1RzQnIwVFlCMG1jMU5uVHBQdnB4S0ZmUWhHMEVFS0lzejFxTQoteXhoQklhWlU1b1lJK1RUamhFNmtuYzFtcGRlTktPZmRwU3BpaFYwTTE0RHNGQllsMWI1dzNUVktWR21OZ1JoWgotRkJ3OHMxVUZ5enNxczdSL05vb3dyWWxZQkZXYXRJMkxCT3RaaHhDSWlWd0dydXJyQm55OERWR09xL3FmS21nRQotWUlHY3NRbWJjSEhzcEVsZWhmMU5ZQVJ3dGpLTlY1TjhJbFNGTXVHb01xQmd4a3kyNjd1QmsyTXNtR3BTTmJ3eQotTE5PUnBEeitGYkdpY3hudHFJRStGNzdUSDhYU2kyd0pSOWdTaVd2M3ZmUUYzV0RzdWlUcWpua2NuYWEwai9OaAotWDhia05XOGQ4NDZPb3BieFdTc0xRSGsvMHRnVUhtdng5VlZ3VndndnRkRUhERk9SZFVJMmI2Rmtwd3dxTllCMAotRitRN2VZYzRrK1pVVUNqMU1Dd2ZnU29Jd2lIcGVTanlZc2xGcXNhVGZrNmNNVGRnRkNNcmxqTHlNRGx6MU8zbQotUm1DcnNya3JSQWRsMHdNbHJIaExxNFpTbXdVUGg4UXpEMGxaZExnTzFjYTMvazZxK2wxZDhVcGtNNGs2UGRxYwotUGJVOGRpL0dPbmIzN292UzZxMzZ0Vm9SVm1obS93eE9JME5rNnhCZVMwRjVIdkJYQVFLQ0FRRUErck9nOWZraQotRHNETktNekk4N2FVOC9KVmJBNTBvWW00a3hZaGVEUUNjbDZ4d3E2cGZBc2hSSTRNdXltNUdOUXZ2QVY1a0lFdQotc1A0dTlVR012REZWbkpuNHpmOE9udDUzRE5XTEE1Q0E3ZFIxQ1NVVUM3OHh6eTZ4MnZ3UU4zMWxhYTN6Z0RtbgotMk5yMyt1d3ZCa0s5Nnh1V1BRb1lLb3V5a1EwcHN5aW85cmhBeStWOVBJRW5Ka3BLbjVZSXJPR3NqVEtUWkFsbgotTC91emVIZ0VkZ0dEV3AwanFNTWVNdTgrVkpTYjlMTkQyQ2xxdUxoUm5SemNFSDg4MENycC8zVjIrSjd4dEJ6NgotN1EralY3S2tIK3BQcEl2T2xRMHc3S0syRDluRm83TWRxL0RFMUE4KzhVWXl5MjhEdGdRMlc1amg1dnduNEsxVQotZWJrcEtTZnhPVUpxVndLQ0FRRUE2cHA0a0MxWGJLN2RjZ2FXbFJORk9yMElvdUhtL0pmYVN6SDE3M3FHOWwvRQotempIUWpvUVlOM0ErbFpjWFdYU2NYcm11UzBpUytSVWQ1TG02NUVCMFRFeDQwcjdtOURMLzdwSnhuUlN2ZmJyRAotY05iVFpGUTI1ZTl1SllpS29kdkR5YTcwNmUwbjB3QldiOG1iL1g1TmxDQlRQWG9wWmJDM2ZuNlNMbTBQbk5xOQotL3ZFUE5jWUFCRDJkVWYwaEYwNVEyV3RvR2VZNWRQQ2FPNzd6cStOM002aGdkZkxNbkRpWUpCYnd4YkZVc0g0UgotajhrRFVsZXZRYWFtZGdXU3VISVM0eG41UzVUcDAxOWwrUm1ub0dZYmRXU1N4cXJPc1BSWXVhU1ZLWXgrb0hRUAotVUVzajRIMmswTWNPTGUyYmNRZ2srOFJTaGVJZUlJcnNrZnVEYlZFS0NRS0NBUUVBM09ub3pwZElVYVBIcFVvLwotVWJMME1ycTZWMHV0cnFNRFNHbForT2dydDhpRjc3MmxqNjduRTlmd2xBVENISVR0dzBzM3dnUnp0bmRsdmF5VAotYlVvejNKazVTNXlUcjU3dFhSdlhNYjdtUGF6WHJNVkZrc3hhQWUxdHdFQVpzaXdIYjBaZnFnQWtUYzAyYzZBbwotRitZOElLN2doczBjV25GYldzSTBtckVib3J6ZUxFMy9PNCs3aGR3MVFjY2R3ZW5pK1ZFMTNCTUZJSjAxbXRSMwotYWQwUGVJdTczbnlCWWZTOEFpQXFCVWpxWWRLdFBqVDloZXJtYUlzV2RZRTdUV2FlL1pwaDlvc0srbGFyWXg0QgotempYVkZIUTJCOVhsNUwvRW10Y1ZkNWpnYnFEdGNNZzJlTG1aRFBhNFdHNEIwRms1eHljdnBLWllLQ0xuaUdLdwotQi9ya1pRS0NBUUFEMDZNMXp0ZUhPVTc1Wml3Y29HVFhzVytyb0gyeER4VUxkdlFwQk5tZ3VTMHZvOVpnREwyTQotWWZOVFkxU0pMQUxFOU1ob0IvWUZ4QmRwdkxIVXVVeHNWaTcrV1FqUllPZVZ6Nk8weVRxWGxXMU1zT1JmMVpQVAotcWxVa25aYU5UMVZoTzg1WTVucG8wYStYUVRXZksraytDa3p4U3NYVUY4N1diR0FjQzhGZWNKNzZ3cG5aNmJIawotWDlEcUhuUGt1bTFOTHBoVEc5TkNHZzZaL09KaW9tSTJZSCs2VE15VG04UzNpZnhCYlVRUllPME9hRnY2Z3QyagotOTREdG1lZXJ4SWlVVmI4Z1FYeVM2eEp4dnI1aU9tZ21RUTYzMk45b09ZUWMreGRIeHpmbGpCOFgwekh4bm5zSwotd01SMWNWUEF3ejQvTVJPYmhYV3lXREhGcTlHWC9lTnBBb0lCQVFDeFdxc1liVEM0SnpvQkJhWlNvTUJweVZZQgotUjlsZnlLYU1MbGg0c3pHMFljUDduYVBJNUtBaWRTamtVNHNvbjd2ejdMc1hESEJLemdLNGdNdGJVSUZPcUZGdgotWlVhYVNrU0JrYkVjSmdzN2VQMjRRTUQzSTNrTnBya1BGSVpueU1UOVZLSVJWTGhUb0EyVGRkU1MrSGNJaUxVVgotTnBHN2VEOExaVzlCL0NmVU9FcTdibmMrbXcwS0Q0OGI5NEJqL1BHRjdJT3ZCanlRaE9zOTJPVW53M0grM2xpbwotWDFnZXprbzZxb2JNSUJ2YnU0Z2lHYUpIajdiVGlsMGwwYldSOGR3Zk1ScGhZZjlscFhwa2lMT0svVmpXVC9GbgotNW5KKytWY3pLaTdVZkFDZW1abzl1aFkyby9vRXVYeFE2TkhJL1dleFpTTi9vdm8rUlhjb0JrL1RaakpUCi0tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC5wazggYi9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0LnBrOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3YTA5Mi4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0LnBrOAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1aWxkL2FwZXgvY29tLmFuZHJvaWQuYWlkbHRlc3QucHVia2V5IGIvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC5wdWJrZXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTZjYTYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC5wdWJrZXkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0Lng1MDkucGVtIGIvYnVpbGQvYXBleC9jb20uYW5kcm9pZC5haWRsdGVzdC54NTA5LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5NzJmZi4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L2NvbS5hbmRyb2lkLmFpZGx0ZXN0Lng1MDkucGVtCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlHSnpDQ0JBK2dBd0lCQWdJVUdJaXdFdVF3TVRPd25MU0cvNEdHa1kxby9qRXdEUVlKS29aSWh2Y05BUUVMCi1CUUF3Z2FFeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFICi1EQTFOYjNWdWRHRnBiaUJXYVdWM01SQXdEZ1lEVlFRS0RBZEJibVJ5YjJsa01SQXdEZ1lEVlFRTERBZEJibVJ5Ci1iMmxrTVIwd0d3WURWUVFEREJSamIyMHVZVzVrY205cFpDNWhhV1JzZEdWemRERWlNQ0FHQ1NxR1NJYjNEUUVKCi1BUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRBZ0Z3MHlNREE0TVRnd05UUTJNVGhhR0E4ME56VTRNRGN4Ci1OVEExTkRZeE9Gb3dnYUV4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUll3Ci1GQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBd0RnWURWUVFMCi1EQWRCYm1SeWIybGtNUjB3R3dZRFZRUUREQlJqYjIwdVlXNWtjbTlwWkM1aGFXUnNkR1Z6ZERFaU1DQUdDU3FHCi1TSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFECi1nZ0lQQURDQ0Fnb0NnZ0lCQU1IcXRZK3ZsWEZWSWlSTllsbnJKM2RoZkJQZk54dndLNW4yNUJlQXlaTWxPbUxyCi1MOE5yNVBKVnNpR1h0czZmb3JUVXNuTFNWenJOVWpkRkJXck9XWFNKUS9RYk5uMGx1cnl4Y1V5ZkRCelA4NXZsCi1NNlBabXdpZTMvYnpRekdVWStMWndOcVRNQ0t5MXh2OEtpV2ttejRTTi95YjRBQ2toQlRELzlqUC9XaFRManJwCi12TzcvUnhpZ0E4R3lOcmkvQ1JUWTV0dTFFMXhDK0s5SFZmVEhqblFnNjlTVXpJVlFKcERZQndJUURYa2M3dU51Ci1PVmVvVEZ6eldxVEhwTTZmdklWdkJ1S0JXTDZ1VGFqZG5zSjZlNzVXSVYyMWJ3dXZSQk5sREt1Y0M3WjNoOHE2Ci1oRGdtN3ExWWdMREJqenBmWU9hK1BoQUNFbW41RlNvckNaNlVqbTJvc1dJcWFhVHNyajdNK2l1d09hQU5SVlR1Ci1nUmVVdEh5dzlsaHFvdEJyaEVNa1BNZFJqS25xTVFsaDgxKzNEM0g2L2NaemRFc1ZYRmVyTGV3Wkk4aUpZb2hwCi16MDc3N1NEbzhGRUVCcm1kbS83VmtuTkpSeWtLaGZTcEZmWVpaRTZBaVRMMXg4bEgrNVlCSENiYWRrZC9yZWlRCi1FamZXbHdmZVBQTFY3b0lraTN5cVJXallUMU1UdDNLbEFTR1o5SFpJMm9kZXpJY29qWnZnSGRIWDhNR3l0ZldECi1rWHppSlZyWE1VWGdVZmxqUXdwc2pFaEUxUjEzRTVqZHBWc3B3NjI0QlBMT3dvRXpZNzB0RTBzRWQ2V2xTVkUxCi1GVjNBaVZJUzN2bFhFZ2JLKzZobUcrbGcvcXYwWkljd0QyYmpLbnZFT3RMMDc3SEhXV3BqeTZ6dVZGRXZBZ01CCi1BQUdqVXpCUk1CMEdBMVVkRGdRV0JCU3BZaWFsZ0M1SHlYVmIxRzNycUtueGEwU296akFmQmdOVkhTTUVHREFXCi1nQlNwWWlhbGdDNUh5WFZiMUczcnFLbnhhMFNvempBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzCi1EUUVCQ3dVQUE0SUNBUUFQQUlXUWRVcDBwbVJjVHF0SE4wazRDR3ZCSnJVckpqOTJVaTJ2REVpcGhIM2N0eE9aCi1rY1cxbGplMUxsSEdkOWIwNzBuU1FodXd5SkhvcysreEhQUDNKMkZjS2dWUzVYVExQMjdhc0lxWm5TNWJtRVNWCi15akxJaVhXazNpZmd5ZDVudGZSNHBvdjZNVW1mWUo2ZXRSSHorMTZVSDdJZnNEVTRib2FaNXBkMGpOTDl5QUhNCi1TMGhxRVdNVlNVblQ2ZkhsRVhCN1d5WFI5MmZHa21HZFZNbUZ3dHBObm1Ja3RodmZuZHVlYUpFRFdIUmJ3cjFZCi1mMGxidlowcDdkVmk5WmhSMWs2YVJtTTZmdkFXWUI3QTBiWmUva3ZVdEZKak5UaFA0QzZmTHJ2YWxCc0Jhdnc0Ci16YUdKQVV2MGNERDFkbGFONFhYUnMwcExGSWVteHRpeTRGTmIrbFhpbkN1MU0vTGVZMDRTWnJWMjRqTVhYMEpsCi16MGc5OU9CeWVqR24yT3F5Y1RndWhnZE84S0tWT3NIbTI5cDlsOWFEVVVqdEVaR2Q2TUQrei9BQSt5UC9UdkttCi1MdTFmd1NjU3FTbGxaTFkvcU5NRlpVVGFMNHVwWTJXM1hrMkZ4TUcvOWg4SUh3NkRjbjlBNzRQc2Y2dHNkUldnCi1EM3BGY2VnOGs5bkpUaDJNQ0NoaFZCUDJpY0dzckpYdFFSSHRHdXFPVTlsc3o2SEQxcjREUWduUG9IbVA1MTFrCi1wOHVLbE1rMEl4QmY1VDFoQjFlYnZaWVM5VlROQzVKOS9DanAyMExYUjV3WmEzcVQ1dTRHME5NSk4xSlgwTVIxCi1kUVdCcEpqelhJOTMya1lKQTZkM2RqVW44a1hBb2JUQmd5U3M5MGkrTWpLZTA4bDgveFpvLzRGd1hBPT0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2J1aWxkL2FwZXgva2V5LnBlbSBiL2J1aWxkL2FwZXgva2V5LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZjAyYy4uMDAwMDAwMAotLS0gYS9idWlsZC9hcGV4L2tleS5wZW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0tLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUpRUUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Nzd2dna25BZ0VBQW9JQ0FRREI2cldQcjVWeFZTSWsKLVRXSlo2eWQzWVh3VDN6Y2I4Q3VaOXVRWGdNbVRKVHBpNnkvRGErVHlWYklobDdiT242SzAxTEp5MGxjNnpWSTMKLVJRVnF6bGwwaVVQMEd6WjlKYnE4c1hGTW53d2N6L09iNVRPajJac0ludC8yODBNeGxHUGkyY0Rha3pBaXN0Y2IKLS9Db2xwSnMrRWpmOG0rQUFwSVFVdy8vWXovMW9VeTQ2NmJ6dS8wY1lvQVBCc2phNHZ3a1UyT2JidFJOY1F2aXYKLVIxWDB4NDUwSU92VWxNeUZVQ2FRMkFjQ0VBMTVITzdqYmpsWHFFeGM4MXFreDZUT243eUZid2JpZ1ZpK3JrMm8KLTNaN0NlbnUrVmlGZHRXOExyMFFUWlF5cm5BdTJkNGZLdW9RNEp1NnRXSUN3d1k4NlgyRG12ajRRQWhKcCtSVXEKLUt3bWVsSTV0cUxGaUttbWs3SzQrelBvcnNEbWdEVVZVN29FWGxMUjhzUFpZYXFMUWE0UkRKRHpIVVl5cDZqRUoKLVlmTmZ0dzl4K3YzR2MzUkxGVnhYcXkzc0dTUElpV0tJYWM5TysrMGc2UEJSQkFhNW5adisxWkp6U1VjcENvWDAKLXFSWDJHV1JPZ0lreTljZkpSL3VXQVJ3bTJuWkhmNjNva0JJMzFwY0gzanp5MWU2Q0pJdDhxa1ZvMkU5VEU3ZHkKLXBRRWhtZlIyU05xSFhzeUhLSTJiNEIzUjEvREJzclgxZzVGODRpVmExekZGNEZINVkwTUtiSXhJUk5VZGR4T1kKLTNhVmJLY090dUFUeXpzS0JNMk85TFJOTEJIZWxwVWxSTlJWZHdJbFNFdDc1VnhJR3l2dW9aaHZwWVA2cjlHU0gKLU1BOW00eXA3eERyUzlPK3h4MWxxWTh1czdsUlJMd0lEQVFBQkFvSUNBRWVuekVsNUQxYmVwNHdVa0VnN3pjeWUKLVdEUWJvb2lQV2YwOXJ4RkVSTGc3NUhSVEJjWkhvMFV0QjNMRVZnZktFMXlRMEJQL3g3M3h5dlNqYTVvSkFDTkEKLTZieFZKZkJldGI4dUxuaXF1TllZdmFNWXNkbFUrcVhYMTFpd2tWN0x2NUUrOTdXTStCZUtVRlNGL0trR1IxdEwKLWJpYkpEcUFPS3NSbG5LL29RM0orY2pIUTEwRFZVZGMyb2N5OFp0NGpzVjVqdkFMcHlXcXBVSzJzUllYN0M1ZTcKLTVva2FKdTBJTGdnTjI2RVdmM1FHamZ1NmFqUUsrNVRKVS9CWjJYdUVxU3dCVitEdy9QTVJBNTluclZlZDNRWDcKLVc3Nzk0VGZISHZldnVsdmJnTFIvUE0xYjJLbkxNUjBhL0FyVXEzRmRkemdzaWxCdUE1SG5PYnZvUlZpMCtsL0QKLVNjMGVvT1MzKzhkUmtsc3YxK3BSMnJKWDZ2TmtzcGV4NEQ2MC9uVi92U0xoYUg1UW5reHMxbHJBcEJ0bG5oVnYKLTR1UkZvdFc4TFhrRlRCbm80YVR4SFhNSzBiSmVRUXNIeUhIZ2xjZEVGcGEzQ1pBZmwvYnZmaVpFdkpCZmJJS0QKLTY5TUhpaS9PUUJsMm5zbFhvSzlDZGNydjRCbGcySHQxVjl2N29wcXZqKzd0SDg2cXlrK1RwR3dqSnYwUkhqK3gKLW5MWnZpeDN6aDc3SmhhUENwNyt1aGk3b284WlQ5eTdvMGdUSFZXRVdGaThWK3ROL1RybjFmTGFyOEFGTXh1RDUKLTRCRlNnUGx5elhvMWh6c1FMcmJXNldIcmJRbzc1TFk2UFFPZU5JN2xrOW1wN1Brelo0SHdlM0FVM1NUQkVaS3oKLXVLZi83T25zem5PY3krcytKMzBwQW9JQkFRRDZ5MENEVW1acys2YVl4SjBEL0FBSXIySlV2UlBsd293Ulo3WWUKLU9pbDIyRFErY0NUYTVqNmx1QVpyUTN4OFFtenkzUlNldGR4ZWt5Z2VoeXVlV0p3eHRmc25VZ1V5SUZsYjFpY0oKLU91MHJCRk1adi9wZnVHZ085UWxKNjdyV25kN2Nlb2xjVDdpM09VdkpNRE1NQ1A1ZHFnUWN5RnFSblRNcm9YMWMKLVkzSU0wUjd0ekpNUFg2bXdnblpYTm4yS1ZLdEQ0WkkyK0Y4dDJHbks2WEh2Mjc0TmhUbDhKQ2RzYjN5dVVoekgKLXpYNmF4TUFWSVhOZDBrZU1RNmVMZEdWNkxUNmRDTllScnJtYmpkOE56c3hiSVc4SXNHWkZsUm9CNmk4NDUvc2EKLUMzN0pudHQyL0c3cDNjVkE4dHlPUTdaWlZaUTJubEwxc004RjhSQUNQZlBhcW1sVkFvSUJBUURGOFRTazkwTlAKLVdjNEhPTnVvOFFQQ01FWGFIbzF0cUgrYVV6cVg5V2FtVldrNHlmdjFCVnVEM3EyVXZLTE5STXpRcGExZ0FaamsKLWU0U1RPYTFlQ05DcGVBM2FxYmR1bnJVcmZvejAyU1FTb1RLTStvNWhiQmlpSDR3SytvWGtrUjI5K1ZkVTJZd3cKLWtDVEtDRmpCZjRoVisydTEvZUJ1UjFNRGNPVndRVzZOM1NrMzdJbXdHdHlnUnJISVB1WThJcjAwV1FtcEtQNlcKLU1NZGkwdFVOWHhwNTF2czhROFRHcmZaQy9sN2dzMU9FYWFTcmIrNjBlcHByd0ZQV01pRnViUEh5UTdmOWRtMzIKLWxiamhVUHZKZkYwNHBUYXpWMmFBeUFZWlBhUW1OaFExVFFsVzhnZ3RaZlZjOS9Idy9lcTRLLzNWZXZpeENxcUsKLW1tY1ljRGY0cXdCekFvSUJBREVodG03RHFzczQ5YWRDQlZ5dGRyZzgyNitzSndUQSt6M0JxcHo3V2ZvdFd2Yk0KLWMzdnExV1VUeXpZaVQzWHNjWG1XdEI1dmxFOTIxc284UXVCUGpiSHphOU9GTHYxbDl2dVYxYW5xUUdKSUE1dXMKLXoza0hJR09sdjM4YXpreVRPd0RJaExadjY4a0JVWWFGaWNxV3pIWS9BM1U4RHZvdDZNTm9iSzIzMGJVUEZ0Y1IKLVY5SVFOS2NldDk1WUQzb1ZJa1EzSWJUaExZeEd0RnNMSnNZTnI0cm9pWjEzVzczVGpZSjlGYVJTN3JXVlMrZ1gKLTJJa04wL1Izb0pBaWFtcm9DRGN0YnZxaDF6elJLMXlDSWVqTWdQc2J5NzFmKzJ0YW5JdXlicS9vaHBzckl1V0oKLWlKVUtYRVZnRHJOVU1wb0h1UFNHU2N4V0tnaUk5RkRzSUNTN2M4MENnZ0VBTFVKbXdDV05iWEppU29KMHIxOVUKLWRhMWwrMmFxL2R6ZU9HSTVibzk5QmlGWGF0VzhWNXorL05zSW80NnlSdThwU2Jmb09hQ0QzaEprRU9uS08wc1cKLXN2a3hhY01Pbnl1SXowWWpZc1RYbTY3aUNSd3RQQmRrVm9XU0Z0eUxpdVNuZ1UybTYwN0c0RC9GT2JESTRvMlAKLWxlRmtFbnZYT2oveXVrR3hKSWJCaVl4OUpUMWZpalhLSnBlamhON2s4L0VaaEFPcjB0TDl5MGVoLzNXbm8yUVEKLWdMVm9RckpZSnZtVjZtR1JQaDJpeGc4RnlQRlNDbEJTU0xyME1IREw5aHpSQVl6OFgrY1pZNTErWlg2SDQ5MGMKLXo1dnZNdmlVQm5RMStNV0FhQUJMaEpoMXZ6eWVKQXRCSEIzUlkwSWJ6anE0MG54SXF1cCtiaXk1ei91d3dKb1IKLUF3S0NBUUJXTUdNNkNOZWMxWnpWQmpFTHV2T2hjbkwrZ042VXBtaUtiUVIrZ0RxeCtOZTJuR1huTnZoSHdtSHoKLTRpdE4vS3dFM3Y2NWQ4OUxWbVdjMVZCRWJDYzIyR1lBZ3RvTm04MU5UZU1JaURac2NrZzRHV0ZyaUc3Tkk3dmwKLXNzbDdOREJIZms1ZjNqU2l2L2RndUVLOEZRZ1VhWUwrVDBmaEg3MTRKemRydTVNQVZaM1hTVHF0VTNLWCtQSGgKLTZyRWgyUnhrUDJpWlpucE0xVmZXL2ljZFVhbHpndDZvK0NOUkVoY2czb3hvNE1LSnFjY1l3OENLaUNPVDVKOTcKLWMreDY5Y0RBT1NTdEM5YkdrUmk0SURPRzcxYXNvZFh2ZnZwTy9Oem5GNDNiUUlzbG00QU82M1Y5QThHK29hRGMKLXJYajI4Wit6VDUyOHZBUUkzbmIrT3EzRXZVTk4KLS0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2J1aWxkL2dvLm1vZCBiL2J1aWxkL2dvLm1vZAppbmRleCAzZWY3YTQ5Li41ZTVmNGI5IDEwMDY0NAotLS0gYS9idWlsZC9nby5tb2QKKysrIGIvYnVpbGQvZ28ubW9kCkBAIC03LDggKzcsMTYgQEAKIAogcmVwbGFjZSBhbmRyb2lkL3Nvb25nIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9idWlsZC9zb29uZwogCi1yZXBsYWNlIGdpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKK3JlcGxhY2UgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgogCiByZXBsYWNlIGdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludCB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vYnVpbGQvYmx1ZXByaW50CiAKKy8vIEluZGlyZWN0IGRlcHMgZnJvbSBnb2xhbmctcHJvdG9idWYKK2V4Y2x1ZGUgZ2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYgdjEuNS4wCisKK3JlcGxhY2UgZ2l0aHViLmNvbS9nb29nbGUvZ28tY21wIHYwLjUuNSA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nby1jbXAKKworLy8gSW5kaXJlY3QgZGVwIGZyb20gZ28tY21wCitleGNsdWRlIGdvbGFuZy5vcmcveC94ZXJyb3JzIHYwLjAuMC0yMDE5MTIwNDE5MDUzNi05YmRmYWJlNjg1NDMKKwogZ28gMS4xMwpkaWZmIC0tZ2l0IGEvLmNsYW5nLWZvcm1hdCBiL2J1aWxkL2hhc2hfZ2VuLnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCA2MyUKcmVuYW1lIGZyb20gLmNsYW5nLWZvcm1hdApyZW5hbWUgdG8gYnVpbGQvaGFzaF9nZW4uc2gKaW5kZXggZGE3OTA1Ni4uOWJiN2U4MwotLS0gYS8uY2xhbmctZm9ybWF0CisrKyBiL2J1aWxkL2hhc2hfZ2VuLnNoCkBAIC0xLDUgKzEsNiBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwxMyArMTMsMTEgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCiAKLUJhc2VkT25TdHlsZTogR29vZ2xlCi1Db21tZW50UHJhZ21hczogTk9MSU5UOi4qCi1EZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQotQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQotQ29sdW1uTGltaXQ6IDEwMAotVGFiV2lkdGg6IDIKLVVzZVRhYjogTmV2ZXIKLUluZGVudFdpZHRoOiAyCitzZXQgLWUKKworaWYgWyAkIyAhPSAzIF07IHRoZW4KKyAgZWNobyAiVXNhZ2U6IGhhc2hfZ2VuLnNoIDxhcGlfcGF0aD4gPGxhdGVzdC12ZXJzaW9uPiA8aGFzaF9maWxlX3BhdGg+IgorICBleGl0IDEKK2ZpCisoY2QgJDEgJiYgZmluZCAuLyAtbmFtZSAiKi5haWRsIiAtcHJpbnQwIHwgTENfQUxMPUMgc29ydCAteiB8IHhhcmdzIC0wIHNoYTFzdW0gJiYgZWNobyAkMikgfCBzaGExc3VtIHwgY3V0IC1kICIgIiAtZiAxID4+ICQzCmRpZmYgLS1naXQgYS9idWlsZC9wcm9wZXJ0aWVzLmdvIGIvYnVpbGQvcHJvcGVydGllcy5nbwppbmRleCA2OTkxNGVkLi5hMzc0NTNhIDEwMDY0NAotLS0gYS9idWlsZC9wcm9wZXJ0aWVzLmdvCisrKyBiL2J1aWxkL3Byb3BlcnRpZXMuZ28KQEAgLTIxLDE3ICsyMSwyOCBAQAogdHlwZSBob3N0UHJvcGVydGllcyBzdHJ1Y3QgewogCUNmbGFncyBbXXN0cmluZwogfQotdHlwZSBwZXJUYXJnZXRQcm9wZXJ0aWVzIHN0cnVjdCB7CisKK3R5cGUgZGFyd2luUHJvcGVydGllcyBzdHJ1Y3QgewogCUVuYWJsZWQgKmJvb2wKIH0KIAordHlwZSBpbWFnZVByb3BlcnRpZXMgc3RydWN0IHsKKwlTaGFyZWRfbGlicyAgICAgICAgIFtdc3RyaW5nCisJSGVhZGVyX2xpYnMgICAgICAgICBbXXN0cmluZworCUV4Y2x1ZGVfc2hhcmVkX2xpYnMgW11zdHJpbmcKKwlDZmxhZ3MgICAgICAgICAgICAgIFtdc3RyaW5nCit9CisKIHR5cGUgY2NUYXJnZXRQcm9wZXJ0aWVzIHN0cnVjdCB7Ci0JSG9zdCAgIGhvc3RQcm9wZXJ0aWVzCi0JRGFyd2luIHBlclRhcmdldFByb3BlcnRpZXMKKwlIb3N0ICAgICBob3N0UHJvcGVydGllcworCURhcndpbiAgIGRhcndpblByb3BlcnRpZXMKKwlQbGF0Zm9ybSBpbWFnZVByb3BlcnRpZXMKKwlWZW5kb3IgICBpbWFnZVByb3BlcnRpZXMKKwlQcm9kdWN0ICBpbWFnZVByb3BlcnRpZXMKIH0KIAogdHlwZSBydXN0VGFyZ2V0UHJvcGVydGllcyBzdHJ1Y3QgewotCURhcndpbiBwZXJUYXJnZXRQcm9wZXJ0aWVzCisJRGFyd2luIGRhcndpblByb3BlcnRpZXMKIH0KIAogdHlwZSBjY1Byb3BlcnRpZXMgc3RydWN0IHsKQEAgLTQyLDYgKzUzLDcgQEAKIAlWZW5kb3JfYXZhaWxhYmxlICAgICAgICAgICpib29sCiAJT2RtX2F2YWlsYWJsZSAgICAgICAgICAgICAqYm9vbAogCVByb2R1Y3RfYXZhaWxhYmxlICAgICAgICAgKmJvb2wKKwlSZWNvdmVyeV9hdmFpbGFibGUgICAgICAgICpib29sCiAJSG9zdF9zdXBwb3J0ZWQgICAgICAgICAgICAqYm9vbAogCUdlbmVyYXRlZF9zb3VyY2VzICAgICAgICAgW11zdHJpbmcKIAlHZW5lcmF0ZWRfaGVhZGVycyAgICAgICAgIFtdc3RyaW5nCkBAIC01Niw3ICs2OCw2IEBACiAJU3RlbSAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nCiAJQXBleF9hdmFpbGFibGUgICAgICAgICAgICBbXXN0cmluZwogCU1pbl9zZGtfdmVyc2lvbiAgICAgICAgICAgKnN0cmluZwotCVVzZUFwZXhOYW1lTWFjcm8gICAgICAgICAgYm9vbAogCVRhcmdldCAgICAgICAgICAgICAgICAgICAgY2NUYXJnZXRQcm9wZXJ0aWVzCiAJVGlkeSAgICAgICAgICAgICAgICAgICAgICAqYm9vbAogCVRpZHlfZmxhZ3MgICAgICAgICAgICAgICAgW11zdHJpbmcKQEAgLTc3LDE2ICs4OCwxOCBAQAogfQogCiB0eXBlIHJ1c3RQcm9wZXJ0aWVzIHN0cnVjdCB7Ci0JTmFtZSAgICAgICAgICAgKnN0cmluZwotCUNyYXRlX25hbWUgICAgIHN0cmluZwotCU93bmVyICAgICAgICAgICpzdHJpbmcKLQlEZWZhdWx0cyAgICAgICBbXXN0cmluZwotCUhvc3Rfc3VwcG9ydGVkICpib29sCi0JU3JjcyAgICAgICAgICAgW11zdHJpbmcKLQlSdXN0bGlicyAgICAgICBbXXN0cmluZwotCVN0ZW0gICAgICAgICAgICpzdHJpbmcKLQlUYXJnZXQgICAgICAgICBydXN0VGFyZ2V0UHJvcGVydGllcwotCUFwZXhfYXZhaWxhYmxlIFtdc3RyaW5nCisJTmFtZSAgICAgICAgICAgICAqc3RyaW5nCisJQ3JhdGVfbmFtZSAgICAgICBzdHJpbmcKKwlPd25lciAgICAgICAgICAgICpzdHJpbmcKKwlEZWZhdWx0cyAgICAgICAgIFtdc3RyaW5nCisJSG9zdF9zdXBwb3J0ZWQgICAqYm9vbAorCVZlbmRvcl9hdmFpbGFibGUgKmJvb2wKKwlTcmNzICAgICAgICAgICAgIFtdc3RyaW5nCisJUnVzdGxpYnMgICAgICAgICBbXXN0cmluZworCVN0ZW0gICAgICAgICAgICAgKnN0cmluZworCVRhcmdldCAgICAgICAgICAgcnVzdFRhcmdldFByb3BlcnRpZXMKKwlBcGV4X2F2YWlsYWJsZSAgIFtdc3RyaW5nCisJTWluX3Nka192ZXJzaW9uICAqc3RyaW5nCiB9CiAKIHR5cGUgcGhvbnlQcm9wZXJ0aWVzIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9idWlsZC90ZXN0c182L3Rlc3Q2L0Jhci5haWRsIGIvYnVpbGQvdGVzdHNfNi90ZXN0Ni9CYXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFlZmFjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvdGVzdHNfNi90ZXN0Ni9CYXIuYWlkbApAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgdGVzdDY7CisKK2ltcG9ydCB0ZXN0Ni5Gb287CisKK3BhcmNlbGFibGUgQmFyIHsKKyAgICBGb29bXSBmb29zOworfQpkaWZmIC0tZ2l0IGEvYnVpbGQvdGVzdHNfNi90ZXN0Ni9Gb28uYWlkbCBiL2J1aWxkL3Rlc3RzXzYvdGVzdDYvRm9vLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzZDlmMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3Rlc3RzXzYvdGVzdDYvRm9vLmFpZGwKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIHRlc3Q2OworCitwYXJjZWxhYmxlIEZvbyB7CisgICAgUGFyY2VsYWJsZUhvbGRlciBwaDsKKyAgICBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZHM7IC8vIG5vdCBtb3ZlYWJsZQorfQpkaWZmIC0tZ2l0IGEvY2hlY2tfdmFsaWQuY3BwIGIvY2hlY2tfdmFsaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2ZiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jaGVja192YWxpZC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjaGVja192YWxpZC5oIgorI2luY2x1ZGUgImFpZGwuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworCit1c2luZyBUeXBlUHJlZGljYXRlID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJik+OworCituYW1lc3BhY2UgeworYm9vbCBJc0xpc3RPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgVHlwZVByZWRpY2F0ZSBwcmVkKSB7CisgIHJldHVybiB0eXBlLkdldE5hbWUoKSA9PSAiTGlzdCIgJiYgdHlwZS5Jc0dlbmVyaWMoKSAmJiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgIHByZWQoKnR5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKS5hdCgwKSk7Cit9Citib29sIElzQXJyYXlPZihjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgVHlwZVByZWRpY2F0ZSBwcmVkKSB7CisgIHJldHVybiB0eXBlLklzQXJyYXkoKSAmJiBwcmVkKHR5cGUpOworfQorYm9vbCBJc0ludGVyZmFjZShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICByZXR1cm4gdHlwZS5HZXREZWZpbmVkVHlwZSgpICYmIHR5cGUuR2V0RGVmaW5lZFR5cGUoKS0+QXNJbnRlcmZhY2UoKTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgQ2hlY2tUeXBlVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8VHlwZVByZWRpY2F0ZT4gY2hlY2tlcnM7CisKKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byYgY2hlY2tlciA6IGNoZWNrZXJzKSB7CisgICAgICBpZiAoIWNoZWNrZXIodHlwZSkpIHsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgQ2hlY2soVHlwZVByZWRpY2F0ZSBjaGVja2VyKSB7IGNoZWNrZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY2hlY2tlcikpOyB9Cit9OworCitib29sIENoZWNrVmFsaWQoY29uc3QgQWlkbERvY3VtZW50JiBkb2MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3QgYXV0byBsYW5nID0gb3B0aW9ucy5UYXJnZXRMYW5ndWFnZSgpOworICBjb25zdCBhdXRvIG1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpOworCisgIENoZWNrVHlwZVZpc2l0b3IgdjsKKworICB2LkNoZWNrKFsmXShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgeworICAgIGNvbnN0IGF1dG8gdmFsaWRfdmVyc2lvbiA9IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKCJUaXJhbWlzdSIpLnZhbHVlKCk7CisgICAgaWYgKChJc0xpc3RPZih0eXBlLCBJc0ludGVyZmFjZSkgfHwgSXNBcnJheU9mKHR5cGUsIElzSW50ZXJmYWNlKSkgJiYKKyAgICAgICAgbGFuZyA9PSBPcHRpb25zOjpMYW5ndWFnZTo6SkFWQSAmJiBtaW5fc2RrX3ZlcnNpb24gPCB2YWxpZF92ZXJzaW9uKSB7CisgICAgICBjb25zdCBhdXRvIGtpbmQgPSBJc0xpc3RPZih0eXBlLCBJc0ludGVyZmFjZSkgPyAiTGlzdCIgOiAiQXJyYXkiOworICAgICAgQUlETF9FUlJPUih0eXBlKSA8PCBraW5kIDw8ICIgb2YgaW50ZXJmYWNlcyBpcyBhdmFpbGFibGUgc2luY2UgU0RLID0gIiA8PCB2YWxpZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gSmF2YS4gQ3VycmVudCBtaW5fc2RrX3ZlcnNpb24gaXMgIiA8PCBtaW5fc2RrX3ZlcnNpb24gPDwgIi4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSk7CisKKyAgdi5DaGVjayhbJl0oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIHsKKyAgICBjb25zdCBhdXRvIHZhbGlkX3ZlcnNpb24gPSBNaW5TZGtWZXJzaW9uRnJvbVN0cmluZygiUyIpLnZhbHVlKCk7CisgICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIiAmJiBtaW5fc2RrX3ZlcnNpb24gPCB2YWxpZF92ZXJzaW9uKSB7CisgICAgICBBSURMX0VSUk9SKHR5cGUpIDw8ICIgUGFyY2VsYWJsZUhvbGRlciBpcyBhdmFpbGFibGUgc2luY2UgU0RLID0gIiA8PCB2YWxpZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIEN1cnJlbnQgbWluX3Nka192ZXJzaW9uIGlzICIgPDwgbWluX3Nka192ZXJzaW9uIDw8ICIuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0pOworCisgIHYuQ2hlY2soWyZdKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSB7CisgICAgLy8gVE9ETyhiLzE1MTEwMjQ5NCk6IGFubm90YXRpb24gaXMgYXBwbGllZCBvbiB0aGUgcmV0dXJuIHR5cGUKKyAgICBpZiAodHlwZS5Jc1Byb3BhZ2F0ZUFsbG93QmxvY2tpbmcoKSAmJiBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSA8IEpBVkFfUFJPUEFHQVRFX1ZFUlNJT04pIHsKKyAgICAgIEFJRExfRVJST1IodHlwZSkgPDwgIkBQcm9wYWdhdGVBbGxvd0Jsb2NraW5nIHJlcXVpcmVzICIgPDwgSkFWQV9QUk9QQUdBVEVfVkVSU0lPTgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiBDdXJyZW50IG1pbl9zZGtfdmVyc2lvbiBpcyAiIDw8IG1pbl9zZGtfdmVyc2lvbiA8PCAiLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9KTsKKworICBWaXNpdFRvcERvd24odiwgZG9jKTsKKyAgcmV0dXJuIHYuc3VjY2VzczsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jaGVja192YWxpZC5oIGIvY2hlY2tfdmFsaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmRkMjIwCi0tLSAvZGV2L251bGwKKysrIGIvY2hlY2tfdmFsaWQuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CisKK2Jvb2wgQ2hlY2tWYWxpZChjb25zdCBBaWRsRG9jdW1lbnQmIGRvYywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbWVudHMuY3BwIGIvY29tbWVudHMuY3BwCmluZGV4IGFmYmRjOGYuLjhmZWVlMjggMTAwNjQ0Ci0tLSBhL2NvbW1lbnRzLmNwcAorKysgYi9jb21tZW50cy5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcga0xpbmVDb21tZW50QmVnaW4gPSAiLy8iOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcga0Jsb2NrQ29tbWVudEJlZ2luID0gIi8qIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZ192aWV3IGtCbG9ja0NvbW1lbnRNaWQgPSAiICoiOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcga0Jsb2NrQ29tbWVudEVuZCA9ICIqLyI7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBrRG9jQ29tbWVudEJlZ2luID0gIi8qKiI7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RhZ0RlcHJlY2F0ZWQgPSAiQGRlcHJlY2F0ZWQiOwpAQCAtMjIyLDE1ICsyMjMsMzEgQEAKICAgc3RkOjpzdHJpbmdzdHJlYW0gb3V0OwogICBmb3IgKGF1dG8gaXQgPSBiZWdpbihjb21tZW50cyk7IGl0ICE9IGVuZChjb21tZW50cyk7IGl0KyspIHsKICAgICBjb25zdCBib29sIGxhc3QgPSBuZXh0KGl0KSA9PSBlbmQoY29tbWVudHMpOwotICAgIC8vIFdlIG9ubHkgcmUtZm9ybWF0IHRoZSBsYXN0L2Jsb2NrIGNvbW1lbnQgd2hpY2ggaXMgbm90IGFscmVhZHkgYSBkb2Mtc3R5bGUgY29tbWVudC4KLSAgICBpZiAobGFzdCAmJiBpdC0+dHlwZSA9PSBDb21tZW50OjpUeXBlOjpCTE9DSyAmJiAhU3RhcnRzV2l0aChpdC0+Ym9keSwga0RvY0NvbW1lbnRCZWdpbikpIHsKLSAgICAgIG91dCA8PCBrRG9jQ29tbWVudEJlZ2luIDw8IENvbnN1bWVQcmVmaXgoaXQtPmJvZHksIGtCbG9ja0NvbW1lbnRCZWdpbik7CisgICAgYXV0byBsaW5lcyA9IFRyaW1tZWRMaW5lcygqaXQpOworCisgICAgaWYgKGl0LT50eXBlID09IENvbW1lbnQ6OlR5cGU6OkxJTkUpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgbGluZSA6IGxpbmVzKSB7CisgICAgICAgIG91dCA8PCBrTGluZUNvbW1lbnRCZWdpbiA8PCBsaW5lOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaXQtPmJvZHk7CisgICAgICBpZiAobGFzdCB8fCBTdGFydHNXaXRoKGl0LT5ib2R5LCBrRG9jQ29tbWVudEJlZ2luKSkgeworICAgICAgICBvdXQgPDwga0RvY0NvbW1lbnRCZWdpbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBrQmxvY2tDb21tZW50QmVnaW47CisgICAgICB9CisgICAgICBib29sIG11bHRpbGluZSA9IGxpbmVzLnNpemUoKSA+IDE7CisKKyAgICAgIGlmIChtdWx0aWxpbmUpIG91dCA8PCAiXG4iOworICAgICAgZm9yIChjb25zdCBhdXRvJiBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgaWYgKG11bHRpbGluZSkgb3V0IDw8IGtCbG9ja0NvbW1lbnRNaWQ7CisgICAgICAgIG91dCA8PCAiICIgPDwgbGluZTsKKyAgICAgICAgaWYgKG11bHRpbGluZSkgb3V0IDw8ICJcbiI7CisgICAgICB9CisgICAgICBvdXQgPDwgIiAiIDw8IGtCbG9ja0NvbW1lbnRFbmQgPDwgIlxuIjsKICAgICB9CiAgIH0KICAgcmV0dXJuIG91dC5zdHIoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RpYWdub3N0aWNzLmNwcCBiL2RpYWdub3N0aWNzLmNwcAppbmRleCA2OTRlOTZhLi4xM2Y5MThmIDEwMDY0NAotLS0gYS9kaWFnbm9zdGljcy5jcHAKKysrIGIvZGlhZ25vc3RpY3MuY3BwCkBAIC0xOTUsNiArMTk1LDcgQEAKICAgICBib29sIGhhc190d293YXkgPSBmYWxzZTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIG0gOiBpLkdldE1ldGhvZHMoKSkgewogICAgICAgaWYgKCFtLT5Jc1VzZXJEZWZpbmVkKCkpIGNvbnRpbnVlOworICAgICAgaWYgKFN1cHByZXNzZWQoKm0pKSBjb250aW51ZTsKICAgICAgIGlmIChtLT5Jc09uZXdheSgpKSB7CiAgICAgICAgIGhhc19vbmV3YXkgPSB0cnVlOwogICAgICAgfSBlbHNlIHsKQEAgLTIwOCw2ICsyMDksMTQgQEAKICAgICAgICAgICAgICAib2YgY2xpZW50IGNvZGUuIjsKICAgICB9CiAgIH0KKyAgYm9vbCBTdXBwcmVzc2VkKGNvbnN0IEFpZGxNZXRob2QmIG0pIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHcgOiBtLkdldFR5cGUoKS5TdXBwcmVzc1dhcm5pbmdzKCkpIHsKKyAgICAgIGlmICh3ID09IHRvX3N0cmluZyhEaWFnbm9zdGljSUQ6Om1peGVkX29uZXdheSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQogfTsKIAogc3RydWN0IERpYWdub3NlT3V0QXJyYXkgOiBEaWFnbm9zdGljc1Zpc2l0b3IgewpAQCAtMjQ4LDYgKzI1Nyw0NSBAQAogICB9CiB9OwogCitzdHJ1Y3QgRGlhZ25vc2VJbXBvcnRzIDogRGlhZ25vc3RpY3NWaXNpdG9yIHsKKyAgRGlhZ25vc2VJbXBvcnRzKERpYWdub3N0aWNzQ29udGV4dCYgZGlhZykgOiBEaWFnbm9zdGljc1Zpc2l0b3IoZGlhZykge30KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsRG9jdW1lbnQmIGRvYykgb3ZlcnJpZGUgeworICAgIGF1dG8gY29sbGlkZV93aXRoX2RlY2xzID0gWyZdKGNvbnN0IGF1dG8mIGltcG9ydCkgeworICAgICAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogZG9jLkRlZmluZWRUeXBlcygpKSB7CisgICAgICAgIGlmICh0eXBlLT5HZXRDYW5vbmljYWxOYW1lKCkgIT0gaW1wb3J0ICYmIHR5cGUtPkdldE5hbWUoKSA9PSBTaW1wbGVOYW1lKGltcG9ydCkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gaW1wb3J0ZWRfbmFtZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBpbXBvcnQgOiBkb2MuSW1wb3J0cygpKSB7CisgICAgICBpZiAoY29sbGlkZV93aXRoX2RlY2xzKGltcG9ydCkpIHsKKyAgICAgICAgZGlhZy5SZXBvcnQoZG9jLkdldExvY2F0aW9uKCksIERpYWdub3N0aWNJRDo6dW5pcXVlX2ltcG9ydCkKKyAgICAgICAgICAgIDw8IFNpbXBsZU5hbWUoaW1wb3J0KSA8PCAiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGlzIGZpbGUuIjsKKyAgICAgIH0KKyAgICAgIGF1dG8gW18sIGluc2VydGVkXSA9IGltcG9ydGVkX25hbWVzLmluc2VydChTaW1wbGVOYW1lKGltcG9ydCkpOworICAgICAgaWYgKCFpbnNlcnRlZCkgeworICAgICAgICBkaWFnLlJlcG9ydChkb2MuR2V0TG9jYXRpb24oKSwgRGlhZ25vc3RpY0lEOjp1bmlxdWVfaW1wb3J0KQorICAgICAgICAgICAgPDwgU2ltcGxlTmFtZShpbXBvcnQpIDw8ICIgaXMgYWxyZWFkeSBpbXBvcnRlZC4iOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworc3RydWN0IERpYWdub3NlVW50eXBlZENvbGxlY3Rpb24gOiBEaWFnbm9zdGljc1Zpc2l0b3IgeworICBEaWFnbm9zZVVudHlwZWRDb2xsZWN0aW9uKERpYWdub3N0aWNzQ29udGV4dCYgZGlhZykgOiBEaWFnbm9zdGljc1Zpc2l0b3IoZGlhZykge30KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdCkgb3ZlcnJpZGUgeworICAgIGlmICh0LkdldE5hbWUoKSA9PSAiTGlzdCIgfHwgdC5HZXROYW1lKCkgPT0gIk1hcCIpIHsKKyAgICAgIGlmICghdC5Jc0dlbmVyaWMoKSkgeworICAgICAgICBkaWFnLlJlcG9ydCh0LkdldExvY2F0aW9uKCksIERpYWdub3N0aWNJRDo6dW50eXBlZF9jb2xsZWN0aW9uKQorICAgICAgICAgICAgPDwgIlVzZSBMaXN0PFY+IG9yIE1hcDxLLFY+IGluc3RlYWQuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKIGJvb2wgRGlhZ25vc2UoY29uc3QgQWlkbERvY3VtZW50JiBkb2MsIGNvbnN0IERpYWdub3N0aWNNYXBwaW5nJiBtYXBwaW5nKSB7CiAgIERpYWdub3N0aWNzQ29udGV4dCBkaWFnKG1hcHBpbmcpOwogCkBAIC0yNTksNiArMzA3LDggQEAKICAgRGlhZ25vc2VPdXRBcnJheXtkaWFnfS5DaGVjayhkb2MpOwogICBEaWFnbm9zZUZpbGVEZXNjcmlwdG9ye2RpYWd9LkNoZWNrKGRvYyk7CiAgIERpYWdub3NlT3V0TnVsbGFibGV7ZGlhZ30uQ2hlY2soZG9jKTsKKyAgRGlhZ25vc2VJbXBvcnRze2RpYWd9LkNoZWNrKGRvYyk7CisgIERpYWdub3NlVW50eXBlZENvbGxlY3Rpb257ZGlhZ30uQ2hlY2soZG9jKTsKIAogICByZXR1cm4gZGlhZy5FcnJvckNvdW50KCkgPT0gMDsKIH0KZGlmZiAtLWdpdCBhL2RpYWdub3N0aWNzLmluYyBiL2RpYWdub3N0aWNzLmluYwppbmRleCA1OWVhN2M4Li4xMDFiNzM3IDEwMDY0NAotLS0gYS9kaWFnbm9zdGljcy5pbmMKKysrIGIvZGlhZ25vc3RpY3MuaW5jCkBAIC03LDQgKzcsNiBAQAogRElBRyhtaXhlZF9vbmV3YXksICJtaXhlZC1vbmV3YXkiLCBmYWxzZSkKIERJQUcob3V0X2FycmF5LCAib3V0LWFycmF5IiwgZmFsc2UpCiBESUFHKG91dF9udWxsYWJsZSwgIm91dC1udWxsYWJsZSIsIGZhbHNlKQorRElBRyh1bmlxdWVfaW1wb3J0LCAidW5pcXVlLWltcG9ydCIsIGZhbHNlKQogRElBRyh1bmtub3duX3dhcm5pbmcsICJ1bmtub3duLXdhcm5pbmciLCBmYWxzZSkKK0RJQUcodW50eXBlZF9jb2xsZWN0aW9uLCAidW50eXBlZC1jb2xsZWN0aW9uIiwgZmFsc2UpCmRpZmYgLS1naXQgYS9kaWFnbm9zdGljc191bml0dGVzdC5jcHAgYi9kaWFnbm9zdGljc191bml0dGVzdC5jcHAKaW5kZXggMGVhMzE0MS4uMDA2NmI5ZiAxMDA2NDQKLS0tIGEvZGlhZ25vc3RpY3NfdW5pdHRlc3QuY3BwCisrKyBiL2RpYWdub3N0aWNzX3VuaXR0ZXN0LmNwcApAQCAtMTI5LDYgKzEyOSwxNyBAQAogICB9KTsKIH0KIAorVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgRG9udE1peE9uZXdheVdpdGhUd293YXlNZXRob2RzU3VwcHJlc3NlZEF0TWV0aG9kKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljcyA9IHt9OworICBQYXJzZUZpbGVzKHsKKyAgICAgIHsiSUZvby5haWRsIiwKKyAgICAgICAiaW50ZXJmYWNlIElGb28ge1xuIgorICAgICAgICIgIHZvaWQgZm9vKCk7XG4iCisgICAgICAgIiAgQFN1cHByZXNzV2FybmluZ3ModmFsdWU9e1wibWl4ZWQtb25ld2F5XCJ9KSBvbmV3YXkgdm9pZCBiYXIoKTtcbiIKKyAgICAgICAifSJ9LAorICB9KTsKK30KKwogVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgT25ld2F5SW50ZXJmYWNlSXNPa2F5V2l0aFN5bnRoZXRpY01ldGhvZHMpIHsKICAgb3B0aW9uYWxfYXJncyA9ICItLXZlcnNpb24gMiI7ICAvLyB3aWxsIGFkZCBnZXRJbnRlcmZhY2VWZXJzaW9uKCkgc3ludGhldGljIG1ldGhvZAogICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7fTsKQEAgLTE3OCwzICsxODksNjIgQEAKICAgICAgICAgICAgICAgICJ9In0sCiAgICAgICAgICAgICAgIHsiQmFyLmFpZGwiLCAicGFyY2VsYWJsZSBCYXIge30ifX0pOwogfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBSZWplY3RJbXBvcnRzQ29sbGlzaW9uV2l0aFRvcExldmVsRGVjbCkgeworICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7RGlhZ25vc3RpY0lEOjp1bmlxdWVfaW1wb3J0fTsKKyAgUGFyc2VGaWxlcyh7eyJwL0lGb28uYWlkbCIsCisgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgImltcG9ydCBxLklGb287XG4iICAvLyBzaG91bGQgY29sbGlkZSB3aXRoIHByZXZpb3VzIGltcG9ydAorICAgICAgICAgICAgICAgImludGVyZmFjZSBJRm9ve30ifSwKKyAgICAgICAgICAgICAgeyJxL0lGb28uYWlkbCIsICJwYWNrYWdlIHE7IGludGVyZmFjZSBJRm9ve30ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBSZWplY3RJbXBvcnRzQ29sbGlzaW9uKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6OnVuaXF1ZV9pbXBvcnR9OworICBQYXJzZUZpbGVzKHt7InAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAiaW1wb3J0IHEuSUJhcjtcbiIKKyAgICAgICAgICAgICAgICJpbXBvcnQgci5JQmFyO1xuIiAgLy8gc2hvdWxkIGNvbGxpZGUgd2l0aCBwcmV2aW91cyBpbXBvcnQKKyAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvb3t9In0sCisgICAgICAgICAgICAgIHsicS9JQmFyLmFpZGwiLCAicGFja2FnZSBxOyBpbnRlcmZhY2UgSUJhcnt9In0sCisgICAgICAgICAgICAgIHsici9JQmFyLmFpZGwiLCAicGFja2FnZSByOyBpbnRlcmZhY2UgSUJhcnt9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgQWxsb3dJbXBvcnRpbmdTZWxmKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljcyA9IHt9OworICBQYXJzZUZpbGVzKHt7InAvSUZvby5haWRsIiwKKyAgICAgICAgICAgICAgICJwYWNrYWdlIHA7XG4iCisgICAgICAgICAgICAgICAiaW1wb3J0IHAuSUZvbztcbiIKKyAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvb3t9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgUmVkdW5kYW50SW1wb3J0cykgeworICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7RGlhZ25vc3RpY0lEOjp1bmlxdWVfaW1wb3J0fTsKKyAgUGFyc2VGaWxlcyh7eyJwL0lGb28uYWlkbCIsCisgICAgICAgICAgICAgICAicGFja2FnZSBwO1xuIgorICAgICAgICAgICAgICAgImltcG9ydCBxLklCYXI7XG4iCisgICAgICAgICAgICAgICAiaW1wb3J0IHEuSUJhcjtcbiIKKyAgICAgICAgICAgICAgICJpbnRlcmZhY2UgSUZvb3t9In0sCisgICAgICAgICAgICAgIHsicS9JQmFyLmFpZGwiLCAicGFja2FnZSBxOyBpbnRlcmZhY2UgSUJhcnt9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgVW50eXBlZENvbGxlY3Rpb25JbnRlcmZhY2UpIHsKKyAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6dW50eXBlZF9jb2xsZWN0aW9ufTsKKyAgUGFyc2VGaWxlcyh7eyJJRm9vLmFpZGwiLCAiaW50ZXJmYWNlIElGb28geyB2b2lkIGZvbyhpbiBNYXAgbSk7IH0ifX0pOworfQorCitURVNUX0YoRGlhZ25vc3RpY3NUZXN0LCBVbnR5cGVkQ29sbGVjdGlvblBhcmNlbGFibGUpIHsKKyAgZXhwZWN0X2RpYWdub3N0aWNzID0ge0RpYWdub3N0aWNJRDo6dW50eXBlZF9jb2xsZWN0aW9ufTsKKyAgUGFyc2VGaWxlcyh7eyJGb28uYWlkbCIsICJwYXJjZWxhYmxlIEZvbyB7IE1hcCBtOyB9In19KTsKK30KKworVEVTVF9GKERpYWdub3N0aWNzVGVzdCwgVW50eXBlZENvbGxlY3Rpb25VbmlvbikgeworICBleHBlY3RfZGlhZ25vc3RpY3MgPSB7RGlhZ25vc3RpY0lEOjp1bnR5cGVkX2NvbGxlY3Rpb259OworICBQYXJzZUZpbGVzKHt7IkZvby5haWRsIiwgInVuaW9uIEZvbyB7IExpc3QgbDsgfSJ9fSk7Cit9CisKK1RFU1RfRihEaWFnbm9zdGljc1Rlc3QsIFVudHlwZWRDb2xsZWN0aW9uSW5UeXBlQXJnKSB7CisgIGV4cGVjdF9kaWFnbm9zdGljcyA9IHtEaWFnbm9zdGljSUQ6OnVudHlwZWRfY29sbGVjdGlvbn07CisgIFBhcnNlRmlsZXMoe3siSUZvby5haWRsIiwgImludGVyZmFjZSBJRm9vIHsgdm9pZCBmb28oaW4gQmFyPE1hcD4gbSk7IH0ifSwKKyAgICAgICAgICAgICAgeyJCYXIuYWlkbCIsICJwYXJjZWxhYmxlIEJhcjxUPiB7fSJ9fSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5jcHAgYi9nZW5lcmF0ZV9haWRsX21hcHBpbmdzLmNwcAppbmRleCA5OTRkNmEzLi40ZDJhNWEwIDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9haWRsX21hcHBpbmdzLmNwcAorKysgYi9nZW5lcmF0ZV9haWRsX21hcHBpbmdzLmNwcApAQCAtMjcsOCArMjcsNyBAQAogICByZXR1cm4gbWV0aG9kLlByaW50TGluZSgpOwogfQogCi1TaWduYXR1cmVNYXAgZ2VuZXJhdGVfbWFwcGluZ3MoY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitTaWduYXR1cmVNYXAgZ2VuZXJhdGVfbWFwcGluZ3MoY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkX3R5cGUpIHsKICAgY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlID0gZGVmaW5lZF90eXBlLT5Bc0ludGVyZmFjZSgpOwogICBTaWduYXR1cmVNYXAgbWFwcGluZ3M7CiAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewpAQCAtNDAsMTAgKzM5LDEwIEBACiAgICAgICBzaWduYXR1cmUgPDwgaW50ZXJmYWNlLT5HZXRDYW5vbmljYWxOYW1lKCkgPDwgInwiOwogICAgICAgc2lnbmF0dXJlIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICJ8IjsKICAgICAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogbWV0aG9kLT5HZXRBcmd1bWVudHMoKSkgewotICAgICAgICBzaWduYXR1cmUgPDwgamF2YTo6SmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpIDw8ICIsIjsKKyAgICAgICAgc2lnbmF0dXJlIDw8IGphdmE6OkphdmFTaWduYXR1cmVPZihhcmctPkdldFR5cGUoKSkgPDwgIiwiOwogICAgICAgfQogICAgICAgc2lnbmF0dXJlIDw8ICJ8IjsKLSAgICAgIHNpZ25hdHVyZSA8PCBqYXZhOjpKYXZhU2lnbmF0dXJlT2YobWV0aG9kLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CisgICAgICBzaWduYXR1cmUgPDwgamF2YTo6SmF2YVNpZ25hdHVyZU9mKG1ldGhvZC0+R2V0VHlwZSgpKTsKICAgICAgIG1hcHBpbmdzW3NpZ25hdHVyZS5zdHIoKV0gPSBkdW1wX2xvY2F0aW9uKCptZXRob2QpOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5oIGIvZ2VuZXJhdGVfYWlkbF9tYXBwaW5ncy5oCmluZGV4IGQ3NGExN2YuLjA5ZjYxMWUgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX2FpZGxfbWFwcGluZ3MuaAorKysgYi9nZW5lcmF0ZV9haWRsX21hcHBpbmdzLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogdXNpbmcgU2lnbmF0dXJlTWFwID0gc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CiAKLVNpZ25hdHVyZU1hcCBnZW5lcmF0ZV9tYXBwaW5ncyhjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGlmYWNlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworU2lnbmF0dXJlTWFwIGdlbmVyYXRlX21hcHBpbmdzKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogaWZhY2UpOwogfSAgLy8gbmFtZXNwYWNlIG1hcHBpbmdzCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2dlbmVyYXRlX2NwcC5jcHAgYi9nZW5lcmF0ZV9jcHAuY3BwCmluZGV4IDYxOWEyZjIuLjFlYTIwMTAgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX2NwcC5jcHAKKysrIGIvZ2VuZXJhdGVfY3BwLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8qCisvKioKICAqIENvcHlyaWdodCAoQykgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwpAQCAtMzEsNyArMzEsNiBAQAogCiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZS5oIgogI2luY2x1ZGUgImFpZGxfdG9fY3BwLmgiCi0jaW5jbHVkZSAiYXN0X2NwcC5oIgogI2luY2x1ZGUgImNvZGVfd3JpdGVyLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgIm9zLmgiCkBAIC01NSw2ICs1NCw3IEBACiBjb25zdCBjaGFyIGtEYXRhVmFyTmFtZVtdID0gIl9haWRsX2RhdGEiOwogY29uc3QgY2hhciBrRXJyb3JMYWJlbFtdID0gIl9haWRsX2Vycm9yIjsKIGNvbnN0IGNoYXIga0ltcGxWYXJOYW1lW10gPSAiX2FpZGxfaW1wbCI7Citjb25zdCBjaGFyIGtEZWxlZ2F0ZUltcGxWYXJOYW1lW10gPSAiX2FpZGxfZGVsZWdhdGUiOwogY29uc3QgY2hhciBrUGFyY2VsVmFyTmFtZVtdID0gIl9haWRsX3BhcmNlbCI7CiBjb25zdCBjaGFyIGtSZXBseVZhck5hbWVbXSA9ICJfYWlkbF9yZXBseSI7CiBjb25zdCBjaGFyIGtSZXR1cm5WYXJOYW1lW10gPSAiX2FpZGxfcmV0dXJuIjsKQEAgLTc1LDMyICs3NSwyNCBAQAogY29uc3QgY2hhciBrU3Ryb25nUG9pbnRlckhlYWRlcltdID0gInV0aWxzL1N0cm9uZ1BvaW50ZXIuaCI7CiBjb25zdCBjaGFyIGtBbmRyb2lkQmFzZU1hY3Jvc0hlYWRlcltdID0gImFuZHJvaWQtYmFzZS9tYWNyb3MuaCI7CiAKLXVuaXF1ZV9wdHI8QXN0Tm9kZT4gQnJlYWtPblN0YXR1c05vdE9rKCkgewotICBJZlN0YXRlbWVudCogcmV0ID0gbmV3IElmU3RhdGVtZW50KG5ldyBDb21wYXJpc29uKAotICAgICAgbmV3IExpdGVyYWxFeHByZXNzaW9uKGtBbmRyb2lkU3RhdHVzVmFyTmFtZSksICIhPSIsCi0gICAgICBuZXcgTGl0ZXJhbEV4cHJlc3Npb24oa0FuZHJvaWRTdGF0dXNPaykpKTsKLSAgcmV0LT5PblRydWUoKS0+QWRkTGl0ZXJhbCgiYnJlYWsiKTsKLSAgcmV0dXJuIHVuaXF1ZV9wdHI8QXN0Tm9kZT4ocmV0KTsKK3ZvaWQgR2VuZXJhdGVCcmVha09uU3RhdHVzTm90T2soQ29kZVdyaXRlciYgb3V0KSB7CisgIG91dC5Xcml0ZSgiaWYgKCgoJXMpICE9ICglcykpKSB7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtBbmRyb2lkU3RhdHVzT2spOworICBvdXQuV3JpdGUoIiAgYnJlYWs7XG4iKTsKKyAgb3V0LldyaXRlKCJ9XG4iKTsKIH0KIAotdW5pcXVlX3B0cjxBc3ROb2RlPiBHb3RvRXJyb3JPbkJhZFN0YXR1cygpIHsKLSAgSWZTdGF0ZW1lbnQqIHJldCA9IG5ldyBJZlN0YXRlbWVudChuZXcgQ29tcGFyaXNvbigKLSAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihrQW5kcm9pZFN0YXR1c1Zhck5hbWUpLCAiIT0iLAotICAgICAgbmV3IExpdGVyYWxFeHByZXNzaW9uKGtBbmRyb2lkU3RhdHVzT2spKSk7Ci0gIHJldC0+T25UcnVlKCktPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCJnb3RvICVzIiwga0Vycm9yTGFiZWwpKTsKLSAgcmV0dXJuIHVuaXF1ZV9wdHI8QXN0Tm9kZT4ocmV0KTsKK3ZvaWQgR2VuZXJhdGVHb3RvRXJyb3JPbkJhZFN0YXR1cyhDb2RlV3JpdGVyJiBvdXQpIHsKKyAgb3V0LldyaXRlKCJpZiAoKCglcykgIT0gKCVzKSkpIHtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0FuZHJvaWRTdGF0dXNPayk7CisgIG91dC5Xcml0ZSgiICBnb3RvICVzO1xuIiwga0Vycm9yTGFiZWwpOworICBvdXQuV3JpdGUoIn1cbiIpOwogfQogCi11bmlxdWVfcHRyPEFzdE5vZGU+IFJldHVybk9uU3RhdHVzTm90T2soKSB7Ci0gIElmU3RhdGVtZW50KiByZXQgPSBuZXcgSWZTdGF0ZW1lbnQobmV3IENvbXBhcmlzb24obmV3IExpdGVyYWxFeHByZXNzaW9uKGtBbmRyb2lkU3RhdHVzVmFyTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiE9IiwgbmV3IExpdGVyYWxFeHByZXNzaW9uKGtBbmRyb2lkU3RhdHVzT2spKSk7Ci0gIHJldC0+T25UcnVlKCktPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCJyZXR1cm4gJXMiLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpKTsKLSAgcmV0dXJuIHVuaXF1ZV9wdHI8QXN0Tm9kZT4ocmV0KTsKLX0KLQotQXJnTGlzdCBCdWlsZEFyZ0xpc3QoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGJvb2wgZm9yX2RlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCB0eXBlX25hbWVfb25seSA9IGZhbHNlKSB7Ci0gIC8vIEJ1aWxkIHVwIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgc2VydmVyIG1ldGhvZCBjYWxsLgorLy8gRm9ybWF0IHRocmVlIHR5cGVzIG9mIGFyZyBsaXN0IGZvciBtZXRob2QuCisvLyAgZm9yX2RlY2xhcmF0aW9uICYgIXR5cGVfbmFtZV9vbmx5OiBpbnQgYSAgICAgIC8vIGZvciBtZXRob2QgZGVjbCB3aXRoIHR5cGUgYW5kIGFyZworLy8gIGZvcl9kZWNsYXJhdGlvbiAmICB0eXBlX25hbWVfb25seTogaW50IC8qYSovICAvLyBmb3IgbWV0aG9kIGRlY2wgd2l0aCB0eXBlCisvLyAhZm9yX2RlY2xhcmF0aW9uICAgICAgICAgICAgICAgICAgOiAgICAgYSAgICAgIC8vIGZvciBtZXRob2QgY2FsbCB3aXRoIGFyZyAod2l0aCBkaXJlY3Rpb24pCitzdHJpbmcgR2VuZXJhdGVBcmdMaXN0KGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcl9kZWNsYXJhdGlvbiwgYm9vbCB0eXBlX25hbWVfb25seSkgewogICB2ZWN0b3I8c3RyaW5nPiBtZXRob2RfYXJndW1lbnRzOwogICBmb3IgKGNvbnN0IHVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYSA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIHN0cmluZyBsaXRlcmFsOwpAQCAtMTA4LDcgKzEwMCw3IEBACiAgICAgLy8gY29uc3QgcmVmZXJlbmNlIGJ1dCBieSB2YWx1ZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIHVzZXIgdG8ga2VlcAogICAgIC8vIGl0IGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIGNhbGwuIHVuaXF1ZV9mZCBpcyBhIHRoaW4gd3JhcHBlciBmb3IgYW4KICAgICAvLyBpbnQgKGZkKSBzbyBwYXNzaW5nIGJ5IHZhbHVlIGlzIG5vdCBleHBlbnNpdmUuCi0gICAgY29uc3QgYm9vbCBub25Db3B5YWJsZSA9IElzTm9uQ29weWFibGVUeXBlKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKKyAgICBjb25zdCBib29sIG5vbl9jb3B5YWJsZSA9IElzTm9uQ29weWFibGVUeXBlKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKICAgICBpZiAoZm9yX2RlY2xhcmF0aW9uKSB7CiAgICAgICAvLyBNZXRob2QgZGVjbGFyYXRpb25zIG5lZWQgdHlwZW5hbWVzLCBwb2ludGVycyB0byBvdXQgcGFyYW1zLCBhbmQgdmFyaWFibGUKICAgICAgIC8vIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIC5haWRsIHNwZWNpZmljYXRpb24uCkBAIC0xMTcsMjggKzEwOSwzMCBAQAogICAgICAgaWYgKGEtPklzT3V0KCkpIHsKICAgICAgICAgbGl0ZXJhbCA9IGxpdGVyYWwgKyAiKiI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBhdXRvIGRlZmluZWRUeXBlID0gdHlwZW5hbWVzLlRyeUdldERlZmluZWRUeXBlKGEtPkdldFR5cGUoKS5HZXROYW1lKCkpOworICAgICAgICBjb25zdCBhdXRvIGRlZmluZWRfdHlwZSA9IHR5cGVuYW1lcy5UcnlHZXREZWZpbmVkVHlwZShhLT5HZXRUeXBlKCkuR2V0TmFtZSgpKTsKIAotICAgICAgICBjb25zdCBib29sIGlzRW51bSA9IGRlZmluZWRUeXBlICYmIGRlZmluZWRUeXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGJvb2wgaXNQcmltaXRpdmUgPSBBaWRsVHlwZW5hbWVzOjpJc1ByaW1pdGl2ZVR5cGVuYW1lKGEtPkdldFR5cGUoKS5HZXROYW1lKCkpOworICAgICAgICBjb25zdCBib29sIGlzX2VudW0gPSBkZWZpbmVkX3R5cGUgJiYgZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IGJvb2wgaXNfcHJpbWl0aXZlID0gQWlkbFR5cGVuYW1lczo6SXNQcmltaXRpdmVUeXBlbmFtZShhLT5HZXRUeXBlKCkuR2V0TmFtZSgpKTsKIAogICAgICAgICAvLyBXZSBwYXNzIGluIHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHByaW1pdGl2ZXMgYnkgY29uc3QgcmVmZXJlbmNlLgogICAgICAgICAvLyBBcnJheXMgb2YgcHJpbWl0aXZlcyBhcmUgbm90IHByaW1pdGl2ZXMuCi0gICAgICAgIGlmICghKGlzUHJpbWl0aXZlIHx8IGlzRW51bSB8fCBub25Db3B5YWJsZSkgfHwgYS0+R2V0VHlwZSgpLklzQXJyYXkoKSkgeworICAgICAgICBpZiAoIShpc19wcmltaXRpdmUgfHwgaXNfZW51bSB8fCBub25fY29weWFibGUpIHx8IGEtPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKICAgICAgICAgICBsaXRlcmFsID0gImNvbnN0ICIgKyBsaXRlcmFsICsgIiYiOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZiAoIXR5cGVfbmFtZV9vbmx5KSB7CisgICAgICBpZiAodHlwZV9uYW1lX29ubHkpIHsKKyAgICAgICAgbGl0ZXJhbCArPSAiIC8qIiArIGEtPkdldE5hbWUoKSArICIqLyI7CisgICAgICB9IGVsc2UgewogICAgICAgICBsaXRlcmFsICs9ICIgIiArIGEtPkdldE5hbWUoKTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgc3RkOjpzdHJpbmcgdmFyTmFtZSA9IEJ1aWxkVmFyTmFtZSgqYSk7CisgICAgICBzdGQ6OnN0cmluZyB2YXJfbmFtZSA9IEJ1aWxkVmFyTmFtZSgqYSk7CiAgICAgICBpZiAoYS0+SXNPdXQoKSkgewotICAgICAgICBsaXRlcmFsID0gIiYiICsgdmFyTmFtZTsKLSAgICAgIH0gZWxzZSBpZiAobm9uQ29weWFibGUpIHsKLSAgICAgICAgbGl0ZXJhbCA9ICJzdGQ6Om1vdmUoIiArIHZhck5hbWUgKyAiKSI7CisgICAgICAgIGxpdGVyYWwgPSAiJiIgKyB2YXJfbmFtZTsKKyAgICAgIH0gZWxzZSBpZiAobm9uX2NvcHlhYmxlKSB7CisgICAgICAgIGxpdGVyYWwgPSAic3RkOjptb3ZlKCIgKyB2YXJfbmFtZSArICIpIjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxpdGVyYWwgPSB2YXJOYW1lOworICAgICAgICBsaXRlcmFsID0gdmFyX25hbWU7CiAgICAgICB9CiAgICAgfQogICAgIG1ldGhvZF9hcmd1bWVudHMucHVzaF9iYWNrKGxpdGVyYWwpOwpAQCAtMTQ4LDcgKzE0Miw5IEBACiAgICAgc3RyaW5nIGxpdGVyYWw7CiAgICAgaWYgKGZvcl9kZWNsYXJhdGlvbikgewogICAgICAgbGl0ZXJhbCA9IENwcE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpICsgIioiOwotICAgICAgaWYgKCF0eXBlX25hbWVfb25seSkgeworICAgICAgaWYgKHR5cGVfbmFtZV9vbmx5KSB7CisgICAgICAgIGxpdGVyYWwgKz0gIiAvKiIgKyBzdHJpbmcoa1JldHVyblZhck5hbWUpICsgIiovIjsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGxpdGVyYWwgKz0gIiAiICsgc3RyaW5nKGtSZXR1cm5WYXJOYW1lKTsKICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTU3LDE2NSArMTUzLDg1IEBACiAgICAgbWV0aG9kX2FyZ3VtZW50cy5wdXNoX2JhY2sobGl0ZXJhbCk7CiAgIH0KIAotICByZXR1cm4gQXJnTGlzdChtZXRob2RfYXJndW1lbnRzKTsKKyAgcmV0dXJuIEpvaW4obWV0aG9kX2FyZ3VtZW50cywgIiwgIik7CiB9CiAKLXVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IEJ1aWxkTWV0aG9kRGVjbChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcl9pbnRlcmZhY2UpIHsKLSAgdWludDMyX3QgbW9kaWZpZXJzID0gMDsKLSAgaWYgKGZvcl9pbnRlcmZhY2UpIHsKLSAgICBtb2RpZmllcnMgfD0gTWV0aG9kRGVjbDo6SVNfVklSVFVBTDsKLSAgICBtb2RpZmllcnMgfD0gTWV0aG9kRGVjbDo6SVNfUFVSRV9WSVJUVUFMOwotICB9IGVsc2UgewotICAgIG1vZGlmaWVycyB8PSBNZXRob2REZWNsOjpJU19PVkVSUklERTsKLSAgfQotCi0gIGNvbnN0IHN0cmluZyBhdHRyaWJ1dGUgPSBHZXREZXByZWNhdGVkQXR0cmlidXRlKG1ldGhvZCk7Ci0gIHJldHVybiB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPntuZXcgTWV0aG9kRGVjbHsKLSAgICAgIGtCaW5kZXJTdGF0dXNMaXRlcmFsLCBtZXRob2QuR2V0TmFtZSgpLAotICAgICAgQnVpbGRBcmdMaXN0KHR5cGVuYW1lcywgbWV0aG9kLCB0cnVlIC8qIGZvciBtZXRob2QgZGVjbCAqLyksIG1vZGlmaWVycywgYXR0cmlidXRlfX07Cit2b2lkIEdlbmVyYXRlTWV0aG9kRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNsYXp6KSB7CisgIHN0cmluZyBjbGF6el9wcmVmaXggPSBjbGF6ei5lbXB0eSgpID8gIiIgOiBjbGF6eiArICI6OiI7CisgIG91dCA8PCAiOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyAiIDw8IGNsYXp6X3ByZWZpeCA8PCBtZXRob2QuR2V0TmFtZSgpIDw8ICIoIgorICAgICAgPDwgR2VuZXJhdGVBcmdMaXN0KHR5cGVzLCBtZXRob2QsIC8qZm9yX2RlY2xhcnRpb249Ki90cnVlLCAvKnR5cGVfbmFtZV9vbmx5PSovZmFsc2UpIDw8ICIpIjsKIH0KIAotdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gQnVpbGRNZXRhTWV0aG9kRGVjbChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IEFpZGxUeXBlbmFtZXMmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9pbnRlcmZhY2UpIHsKLSAgQUlETF9GQVRBTF9JRihtZXRob2QuSXNVc2VyRGVmaW5lZCgpLCBtZXRob2QpOwotICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGlmIChmb3JfaW50ZXJmYWNlKSB7Ci0gICAgICBjb2RlIDw8ICJ2aXJ0dWFsICI7Ci0gICAgfQotICAgIGNvZGUgPDwgImludDMyX3QgIiA8PCBrR2V0SW50ZXJmYWNlVmVyc2lvbiA8PCAiKCkiOwotICAgIGlmIChmb3JfaW50ZXJmYWNlKSB7Ci0gICAgICBjb2RlIDw8ICIgPSAwO1xuIjsKLSAgICB9IGVsc2UgewotICAgICAgY29kZSA8PCAiIG92ZXJyaWRlO1xuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7Ci0gIH0KLSAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBpZiAoZm9yX2ludGVyZmFjZSkgewotICAgICAgY29kZSA8PCAidmlydHVhbCAiOwotICAgIH0KLSAgICBjb2RlIDw8ICJzdGQ6OnN0cmluZyAiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSI7Ci0gICAgaWYgKGZvcl9pbnRlcmZhY2UpIHsKLSAgICAgIGNvZGUgPDwgIiA9IDA7XG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb2RlIDw8ICIgb3ZlcnJpZGU7XG4iOwotICAgIH0KLSAgICByZXR1cm4gdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4obmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IE5lc3RJbk5hbWVzcGFjZXModmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBwYWNrYWdlKSB7Ci0gIGF1dG8gaXQgPSBwYWNrYWdlLmNyYmVnaW4oKTsgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbmFtZXNwYWNlcyBpbm5lciB0byBvdXRlcgotICBmb3IgKDsgaXQgIT0gcGFja2FnZS5jcmVuZCgpOyArK2l0KSB7Ci0gICAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBpbm5lcjsKLSAgICBpbm5lci5lbXBsYWNlX2JhY2sodW5pcXVlX3B0cjxEZWNsYXJhdGlvbj57bmV3IENwcE5hbWVzcGFjZXsqaXQsIHN0ZDo6bW92ZShkZWNscyl9fSk7Ci0KLSAgICBkZWNscyA9IHN0ZDo6bW92ZShpbm5lcik7Ci0gIH0KLSAgcmV0dXJuIGRlY2xzOwotfQotCi1zdGQ6OnZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gTmVzdEluTmFtZXNwYWNlcyh1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBkZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHBhY2thZ2UpIHsKLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsczsKLSAgZGVjbHMucHVzaF9iYWNrKHN0ZDo6bW92ZShkZWNsKSk7Ci0gIHJldHVybiBOZXN0SW5OYW1lc3BhY2VzKHN0ZDo6bW92ZShkZWNscyksIHBhY2thZ2UpOwotfQotCi11bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBEZWZpbmVDbGllbnRUcmFuc2FjdGlvbihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3ZvaWQgR2VuZXJhdGVDbGllbnRUcmFuc2FjdGlvbihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0gIHVuaXF1ZV9wdHI8TWV0aG9kSW1wbD4gcmV0ewotICAgICAgbmV3IE1ldGhvZEltcGx7a0JpbmRlclN0YXR1c0xpdGVyYWwsCi0gICAgICAgICAgICAgICAgICAgICBicF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLkdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIHt9LAotICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdHtCdWlsZEFyZ0xpc3QodHlwZW5hbWVzLCBtZXRob2QsIHRydWUgLyogZm9yIG1ldGhvZCBkZWNsICovKX19fTsKLSAgU3RhdGVtZW50QmxvY2sqIGIgPSByZXQtPkdldFN0YXRlbWVudEJsb2NrKCk7CisgIGNvbnN0IHN0cmluZyBicF9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7CisgIGNvbnN0IHN0cmluZyBibl9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CisKKyAgR2VuZXJhdGVNZXRob2REZWNsKG91dCwgdHlwZW5hbWVzLCBtZXRob2QsIGJwX25hbWUpOworICBvdXQgPDwgIiB7XG4iOworICBvdXQuSW5kZW50KCk7CiAKICAgLy8gRGVjbGFyZSBwYXJjZWxzIHRvIGhvbGQgb3VyIHF1ZXJ5IGFuZCB0aGUgcmVzcG9uc2UuCi0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlcyAlcyIsIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwga0RhdGFWYXJOYW1lKSk7CisgIG91dC5Xcml0ZSgiJXMgJXM7XG4iLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtEYXRhVmFyTmFtZSk7CiAgIGlmIChpbnRlcmZhY2UuSXNTZW5zaXRpdmVEYXRhKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXMubWFya1NlbnNpdGl2ZSgpIiwga0RhdGFWYXJOYW1lKSk7CisgICAgb3V0LldyaXRlKCIlcy5tYXJrU2Vuc2l0aXZlKCk7XG4iLCBrRGF0YVZhck5hbWUpOwogICB9Ci0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlcy5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKSIsIGtEYXRhVmFyTmFtZSkpOworICBvdXQuV3JpdGUoIiVzLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpO1xuIiwga0RhdGFWYXJOYW1lKTsKIAogICAvLyBFdmVuIGlmIHdlJ3JlIG9uZXdheSwgdGhlIHRyYW5zYWN0IG1ldGhvZCBzdGlsbCB0YWtlcyBhIHBhcmNlbC4KLSAgYi0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoIiVzICVzIiwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLCBrUmVwbHlWYXJOYW1lKSk7CisgIG91dC5Xcml0ZSgiJXMgJXM7XG4iLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtSZXBseVZhck5hbWUpOwogCiAgIC8vIERlY2xhcmUgdGhlIHN0YXR1c190IHZhcmlhYmxlIHdlIG5lZWQgZm9yIGVycm9yIGhhbmRsaW5nLgotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigiJXMgJXMgPSAlcyIsIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0FuZHJvaWRTdGF0dXNWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQW5kcm9pZFN0YXR1c09rKSk7CisgIG91dC5Xcml0ZSgiJXMgJXMgPSAlcztcbiIsIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrQW5kcm9pZFN0YXR1c09rKTsKICAgLy8gV2UgdW5jb25kaXRpb25hbGx5IHJldHVybiBhIFN0YXR1cyBvYmplY3QuCi0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlcyAlcyIsIGtCaW5kZXJTdGF0dXNMaXRlcmFsLCBrU3RhdHVzVmFyTmFtZSkpOworICBvdXQuV3JpdGUoIiVzICVzO1xuIiwga0JpbmRlclN0YXR1c0xpdGVyYWwsIGtTdGF0dXNWYXJOYW1lKTsKIAogICBpZiAob3B0aW9ucy5HZW5UcmFjZXMoKSkgewotICAgIGItPkFkZExpdGVyYWwoCi0gICAgICAgIFN0cmluZ1ByaW50ZigiOjphbmRyb2lkOjpTY29wZWRUcmFjZSAlcyhBVFJBQ0VfVEFHX0FJREwsIFwiQUlETDo6Y3BwOjolczo6JXM6OmNwcENsaWVudFwiKSIsCi0gICAgICAgICAgICAgICAgICAgICBrVHJhY2VWYXJOYW1lLCBpbnRlcmZhY2UuR2V0TmFtZSgpLmNfc3RyKCksIG1ldGhvZC5HZXROYW1lKCkuY19zdHIoKSkpOworICAgIG91dC5Xcml0ZSgiOjphbmRyb2lkOjpTY29wZWRUcmFjZSAlcyhBVFJBQ0VfVEFHX0FJREwsIFwiQUlETDo6Y3BwOjolczo6JXM6OmNwcENsaWVudFwiKTtcbiIsCisgICAgICAgICAgICAgIGtUcmFjZVZhck5hbWUsIGludGVyZmFjZS5HZXROYW1lKCkuY19zdHIoKSwgbWV0aG9kLkdldE5hbWUoKS5jX3N0cigpKTsKICAgfQogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgYi0+QWRkTGl0ZXJhbChHZW5Mb2dCZWZvcmVFeGVjdXRlKGJwX25hbWUsIG1ldGhvZCwgZmFsc2UgLyogaXNTZXJ2ZXIgKi8sIGZhbHNlIC8qIGlzTmRrICovKSwKLSAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vIHNlbWljb2xvbiAqLyk7CisgICAgb3V0IDw8IEdlbkxvZ0JlZm9yZUV4ZWN1dGUoYnBfbmFtZSwgbWV0aG9kLCBmYWxzZSAvKiBpc1NlcnZlciAqLywgZmFsc2UgLyogaXNOZGsgKi8pOwogICB9CiAKICAgLy8gQWRkIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2Ugd2UncmUgaG9waW5nIHRvIGNhbGwuCi0gIGItPkFkZFN0YXRlbWVudChuZXcgQXNzaWdubWVudCgKLSAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgIG5ldyBNZXRob2RDYWxsKFN0cmluZ1ByaW50ZigiJXMud3JpdGVJbnRlcmZhY2VUb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFWYXJOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICJnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkiKSkpOwotICBiLT5BZGRTdGF0ZW1lbnQoR290b0Vycm9yT25CYWRTdGF0dXMoKSk7CisgIG91dC5Xcml0ZSgiJXMgPSAlcy53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCisgICAgICAgICAgICBrRGF0YVZhck5hbWUpOworICBHZW5lcmF0ZUdvdG9FcnJvck9uQmFkU3RhdHVzKG91dCk7CiAKLSAgZm9yIChjb25zdCBhdXRvJiBhOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBhIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CiAgICAgY29uc3Qgc3RyaW5nIHZhcl9uYW1lID0gKChhLT5Jc091dCgpKSA/ICIqIiA6ICIiKSArIGEtPkdldE5hbWUoKTsKIAogICAgIGlmIChhLT5Jc0luKCkpIHsKICAgICAgIC8vIFNlcmlhbGl6YXRpb24gbG9va3Mgcm91Z2hseSBsaWtlOgogICAgICAgLy8gICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLldyaXRlSW50MzIoaW5fcGFyYW1fbmFtZSk7CiAgICAgICAvLyAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgeyBnb3RvIGVycm9yOyB9Ci0gICAgICBjb25zdCBzdHJpbmcmIG1ldGhvZCA9IFBhcmNlbFdyaXRlTWV0aG9kT2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotICAgICAgYi0+QWRkU3RhdGVtZW50KAotICAgICAgICAgIG5ldyBBc3NpZ25tZW50KGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbChTdHJpbmdQcmludGYoIiVzLiVzIiwga0RhdGFWYXJOYW1lLCBtZXRob2QuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsV3JpdGVDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHZhcl9uYW1lKSkpKTsKLSAgICAgIGItPkFkZFN0YXRlbWVudChHb3RvRXJyb3JPbkJhZFN0YXR1cygpKTsKLSAgICB9IGVsc2UgaWYgKGEtPklzT3V0KCkgJiYgYS0+R2V0VHlwZSgpLklzQXJyYXkoKSkgeworICAgICAgb3V0LldyaXRlKCIlcyA9ICVzLiVzKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0RhdGFWYXJOYW1lLAorICAgICAgICAgICAgICAgIFBhcmNlbFdyaXRlTWV0aG9kT2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgUGFyY2VsV3JpdGVDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHZhcl9uYW1lKS5jX3N0cigpKTsKKyAgICAgIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMob3V0KTsKKyAgICB9IGVsc2UgaWYgKGEtPklzT3V0KCkgJiYgYS0+R2V0VHlwZSgpLklzRHluYW1pY0FycmF5KCkpIHsKICAgICAgIC8vIFNwZWNpYWwgY2FzZSwgdGhlIGxlbmd0aCBvZiB0aGUgb3V0IGFycmF5IGlzIHdyaXR0ZW4gaW50byB0aGUgcGFyY2VsLgogICAgICAgLy8gICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlVmVjdG9yU2l6ZSgmb3V0X3BhcmFtX25hbWUpOwogICAgICAgLy8gICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHsgZ290byBlcnJvcjsgfQotICAgICAgYi0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgICBuZXcgTWV0aG9kQ2FsbChTdHJpbmdQcmludGYoIiVzLndyaXRlVmVjdG9yU2l6ZSIsIGtEYXRhVmFyTmFtZSksIHZhcl9uYW1lKSkpOwotICAgICAgYi0+QWRkU3RhdGVtZW50KEdvdG9FcnJvck9uQmFkU3RhdHVzKCkpOworICAgICAgb3V0LldyaXRlKCIlcyA9ICVzLndyaXRlVmVjdG9yU2l6ZSglcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtEYXRhVmFyTmFtZSwKKyAgICAgICAgICAgICAgICB2YXJfbmFtZS5jX3N0cigpKTsKKyAgICAgIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMob3V0KTsKICAgICB9CiAgIH0KIAogICAvLyBJbnZva2UgdGhlIHRyYW5zYWN0aW9uIG9uIHRoZSByZW1vdGUgYmluZGVyIGFuZCBjb25maXJtIHN0YXR1cy4KLSAgc3RyaW5nIHRyYW5zYWN0aW9uX2NvZGUgPSBHZXRUcmFuc2FjdGlvbklkRm9yKGludGVyZmFjZSwgbWV0aG9kKTsKLQotICB2ZWN0b3I8c3RyaW5nPiBhcmdzID0ge3RyYW5zYWN0aW9uX2NvZGUsIGtEYXRhVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIiYlcyIsIGtSZXBseVZhck5hbWUpfTsKLQogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmxhZ3M7CiAgIGlmIChtZXRob2QuSXNPbmV3YXkoKSkgZmxhZ3MucHVzaF9iYWNrKCI6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfT05FV0FZIik7CiAgIGlmIChpbnRlcmZhY2UuSXNTZW5zaXRpdmVEYXRhKCkpIGZsYWdzLnB1c2hfYmFjaygiOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRiIpOwogCi0gIGFyZ3MucHVzaF9iYWNrKGZsYWdzLmVtcHR5KCkgPyAiMCIgOiBKb2luKGZsYWdzLCAiIHwgIikpOwotCi0gIGItPkFkZFN0YXRlbWVudChuZXcgQXNzaWdubWVudCgKLSAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgIG5ldyBNZXRob2RDYWxsKCJyZW1vdGUoKS0+dHJhbnNhY3QiLAotICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdChhcmdzKSkpKTsKKyAgb3V0LldyaXRlKCIlcyA9IHJlbW90ZSgpLT50cmFuc2FjdCglcywgJXMsICYlcywgJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLAorICAgICAgICAgICAgR2V0VHJhbnNhY3Rpb25JZEZvcihibl9uYW1lLCBtZXRob2QpLmNfc3RyKCksIGtEYXRhVmFyTmFtZSwga1JlcGx5VmFyTmFtZSwKKyAgICAgICAgICAgIGZsYWdzLmVtcHR5KCkgPyAiMCIgOiBKb2luKGZsYWdzLCAiIHwgIikuY19zdHIoKSk7CiAKICAgLy8gSWYgdGhlIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIHJlbW90ZSBzaWRlLCB0cnkgdG8gY2FsbCB0aGUKICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQuCkBAIC0zMzAsMzAgKzI0NiwyNCBAQAogICBpZiAobWV0aG9kLkdldFR5cGUoKS5HZXROYW1lKCkgIT0gInZvaWQiKSB7CiAgICAgYXJnX25hbWVzLmVtcGxhY2VfYmFjayhrUmV0dXJuVmFyTmFtZSk7CiAgIH0KLSAgYi0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoImlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczo6Z2V0RGVmYXVsdEltcGwoKSkpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHJldHVybiAlczo6Z2V0RGVmYXVsdEltcGwoKS0+JXMoJXMpO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9uYW1lLmNfc3RyKCksIGlfbmFtZS5jX3N0cigpLCBtZXRob2QuR2V0TmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW4oYXJnX25hbWVzLCAiLCAiKS5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBubyBzZW1pY29sb24gKi8pOwotCi0gIGItPkFkZFN0YXRlbWVudChHb3RvRXJyb3JPbkJhZFN0YXR1cygpKTsKKyAgb3V0LldyaXRlKCJpZiAoVU5MSUtFTFkoJXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmICVzOjpnZXREZWZhdWx0SW1wbCgpKSkge1xuIiwKKyAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwgaV9uYW1lLmNfc3RyKCkpOworICBvdXQuV3JpdGUoIiAgIHJldHVybiAlczo6Z2V0RGVmYXVsdEltcGwoKS0+JXMoJXMpO1xuIiwgaV9uYW1lLmNfc3RyKCksIG1ldGhvZC5HZXROYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgIEpvaW4oYXJnX25hbWVzLCAiLCAiKS5jX3N0cigpKTsKKyAgb3V0LldyaXRlKCJ9XG4iKTsKKyAgR2VuZXJhdGVHb3RvRXJyb3JPbkJhZFN0YXR1cyhvdXQpOwogCiAgIGlmICghbWV0aG9kLklzT25ld2F5KCkpIHsKICAgICAvLyBTdHJpcCBvZmYgdGhlIGV4Y2VwdGlvbiBoZWFkZXIgYW5kIGZhaWwgaWYgd2Ugc2VlIGEgcmVtb3RlIGV4Y2VwdGlvbi4KICAgICAvLyBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICAvLyBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSB7IGdvdG8gZXJyb3I7IH0KICAgICAvLyBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7IH0KLSAgICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgU3RyaW5nUHJpbnRmKCIlcy5yZWFkRnJvbVBhcmNlbCglcykiLCBrU3RhdHVzVmFyTmFtZSwga1JlcGx5VmFyTmFtZSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoR290b0Vycm9yT25CYWRTdGF0dXMoKSk7Ci0gICAgSWZTdGF0ZW1lbnQqIGV4Y2VwdGlvbl9jaGVjayA9IG5ldyBJZlN0YXRlbWVudCgKLSAgICAgICAgbmV3IExpdGVyYWxFeHByZXNzaW9uKFN0cmluZ1ByaW50ZigiISVzLmlzT2soKSIsIGtTdGF0dXNWYXJOYW1lKSkpOwotICAgIGItPkFkZFN0YXRlbWVudChleGNlcHRpb25fY2hlY2spOwotICAgIGV4Y2VwdGlvbl9jaGVjay0+T25UcnVlKCktPkFkZExpdGVyYWwoCi0gICAgICAgIFN0cmluZ1ByaW50ZigicmV0dXJuICVzIiwga1N0YXR1c1Zhck5hbWUpKTsKKyAgICBvdXQuV3JpdGUoIiVzID0gJXMucmVhZEZyb21QYXJjZWwoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrU3RhdHVzVmFyTmFtZSwKKyAgICAgICAgICAgICAga1JlcGx5VmFyTmFtZSk7CisgICAgR2VuZXJhdGVHb3RvRXJyb3JPbkJhZFN0YXR1cyhvdXQpOworICAgIG91dC5Xcml0ZSgiaWYgKCElcy5pc09rKCkpIHtcbiIsIGtTdGF0dXNWYXJOYW1lKTsKKyAgICBvdXQuV3JpdGUoIiAgcmV0dXJuICVzO1xuIiwga1N0YXR1c1Zhck5hbWUpOworICAgIG91dC5Xcml0ZSgifVxuIik7CiAgIH0KIAogICAvLyBUeXBlIGNoZWNraW5nIHNob3VsZCBndWFyYW50ZWUgdGhhdCBub3RoaW5nIGJlbG93IGVtaXRzIGNvZGUgdW50aWwgInJldHVybgpAQCAtMzYxLDI1ICsyNzEsMjAgQEAKIAogICAvLyBJZiB0aGUgbWV0aG9kIGlzIGV4cGVjdGVkIHRvIHJldHVybiBzb21ldGhpbmcsIHJlYWQgaXQgZmlyc3QgYnkgY29udmVudGlvbi4KICAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgewotICAgIGNvbnN0IHN0cmluZyYgbWV0aG9kX2NhbGwgPSBQYXJjZWxSZWFkTWV0aG9kT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCIlcy4lcyIsIGtSZXBseVZhck5hbWUsIG1ldGhvZF9jYWxsLmNfc3RyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxSZWFkQ2FzdE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcywga1JldHVyblZhck5hbWUpKSkpOwotICAgIGItPkFkZFN0YXRlbWVudChHb3RvRXJyb3JPbkJhZFN0YXR1cygpKTsKKyAgICBvdXQuV3JpdGUoIiVzID0gJXMuJXMoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrUmVwbHlWYXJOYW1lLAorICAgICAgICAgICAgICBQYXJjZWxSZWFkTWV0aG9kT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLAorICAgICAgICAgICAgICBQYXJjZWxSZWFkQ2FzdE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcywga1JldHVyblZhck5hbWUpLmNfc3RyKCkpOworICAgIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMob3V0KTsKICAgfQogCiAgIGZvciAoY29uc3QgQWlkbEFyZ3VtZW50KiBhIDogbWV0aG9kLkdldE91dEFyZ3VtZW50cygpKSB7CiAgICAgLy8gRGVzZXJpYWxpemF0aW9uIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAvLyAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LlJlYWRJbnQzMihvdXRfcGFyYW1fbmFtZSk7CiAgICAgLy8gICAgIGlmIChfYWlkbF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgeyBnb3RvIF9haWRsX2Vycm9yOyB9Ci0gICAgc3RyaW5nIG1ldGhvZCA9IFBhcmNlbFJlYWRNZXRob2RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0KLSAgICBiLT5BZGRTdGF0ZW1lbnQoCi0gICAgICAgIG5ldyBBc3NpZ25tZW50KGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCIlcy4lcyIsIGtSZXBseVZhck5hbWUsIG1ldGhvZC5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsUmVhZENhc3RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgYS0+R2V0TmFtZSgpKSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoR290b0Vycm9yT25CYWRTdGF0dXMoKSk7CisgICAgb3V0LldyaXRlKCIlcyA9ICVzLiVzKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga1JlcGx5VmFyTmFtZSwKKyAgICAgICAgICAgICAgUGFyY2VsUmVhZE1ldGhvZE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLAorICAgICAgICAgICAgICBQYXJjZWxSZWFkQ2FzdE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBhLT5HZXROYW1lKCkpLmNfc3RyKCkpOworICAgIEdlbmVyYXRlR290b0Vycm9yT25CYWRTdGF0dXMob3V0KTsKICAgfQogCiAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBvbmUgb2YgdHdvIHRoaW5ncyBpcyB0cnVlOgpAQCAtMzg3LDIyOCArMjkyLDE4MSBAQAogICAvLyAgIDIpIFdlJ3ZlIG9ubHkgcmVhZCBzdGF0dXNfdCA9PSBPSyBhbmQgdGhlcmUgd2FzIG5vIGV4Y2VwdGlvbiBpbiB0aGUKICAgLy8gICAgICByZXNwb25zZS4KICAgLy8gSW4gYm90aCBjYXNlcywgd2UncmUgZnJlZSB0byBzZXQgU3RhdHVzIGZyb20gdGhlIHN0YXR1c190IGFuZCByZXR1cm4uCi0gIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlczpcbiIsIGtFcnJvckxhYmVsKSwgZmFsc2UgLyogbm8gc2VtaWNvbG9uICovKTsKLSAgYi0+QWRkTGl0ZXJhbCgKLSAgICAgIFN0cmluZ1ByaW50ZigiJXMuc2V0RnJvbVN0YXR1c1QoJXMpIiwga1N0YXR1c1Zhck5hbWUsCi0gICAgICAgICAgICAgICAgICAga0FuZHJvaWRTdGF0dXNWYXJOYW1lKSk7CisgIG91dC5Xcml0ZSgiJXM6XG4iLCBrRXJyb3JMYWJlbCk7CisgIG91dC5Xcml0ZSgiJXMuc2V0RnJvbVN0YXR1c1QoJXMpO1xuIiwga1N0YXR1c1Zhck5hbWUsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSk7CiAKICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKEdlbkxvZ0FmdGVyRXhlY3V0ZShicF9uYW1lLCBpbnRlcmZhY2UsIG1ldGhvZCwga1N0YXR1c1Zhck5hbWUsIGtSZXR1cm5WYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyksCi0gICAgICAgICAgICAgICAgICBmYWxzZSAvKiBubyBzZW1pY29sb24gKi8pOworICAgIG91dCA8PCBHZW5Mb2dBZnRlckV4ZWN1dGUoYnBfbmFtZSwgaW50ZXJmYWNlLCBtZXRob2QsIGtTdGF0dXNWYXJOYW1lLCBrUmV0dXJuVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyk7CiAgIH0KIAotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigicmV0dXJuICVzIiwga1N0YXR1c1Zhck5hbWUpKTsKLQotICByZXR1cm4gdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4ocmV0LnJlbGVhc2UoKSk7CisgIG91dC5Xcml0ZSgicmV0dXJuICVzO1xuIiwga1N0YXR1c1Zhck5hbWUpOworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKIH0KIAotdW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4gRGVmaW5lQ2xpZW50TWV0YVRyYW5zYWN0aW9uKGNvbnN0IEFpZGxUeXBlbmFtZXMmIC8qIHR5cGVuYW1lcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3ZvaWQgR2VuZXJhdGVDbGllbnRNZXRhVHJhbnNhY3Rpb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBBSURMX0ZBVEFMX0lGKG1ldGhvZC5Jc1VzZXJEZWZpbmVkKCksIG1ldGhvZCk7CisgIGNvbnN0IHN0cmluZyBicF9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7CisgIGNvbnN0IHN0cmluZyBibl9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CiAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgIGNvbnN0IHN0cmluZyBpZmFjZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7Ci0gICAgY29uc3Qgc3RyaW5nIHByb3h5ID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKICAgICAvLyBOb3RlOiByYWNlIGNvbmRpdGlvbiBjYW4gaGFwcGVuIGhlcmUsIGJ1dCBubyBsb2NraW5nIGlzIHJlcXVpcmVkCiAgICAgLy8gYmVjYXVzZSAxKSB3cml0aW5nIGFuIGludGVyZ2VyIGlzIGF0b21pYyBhbmQgMikgdGhpcyB0cmFuc2FjdGlvbgogICAgIC8vIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSwgaS5lLiwgY29tcGV0aW5nIHRocmVhZHMgd2lsbAogICAgIC8vIGdpdmUgd3JpdGUgdGhlIHNhbWUgdmFsdWUgdG8gY2FjaGVkX3ZlcnNpb25fLgotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgIGNvZGUgPDwgImludDMyX3QgIiA8PCBwcm94eSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKSB7XG4iCi0gICAgICAgICA8PCAiICBpZiAoY2FjaGVkX3ZlcnNpb25fID09IC0xKSB7XG4iCi0gICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6UGFyY2VsIGRhdGE7XG4iCi0gICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6UGFyY2VsIHJlcGx5O1xuIgotICAgICAgICAgPDwgIiAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTtcbiIKLSAgICAgICAgIDw8ICIgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoIiA8PCBHZXRUcmFuc2FjdGlvbklkRm9yKGludGVyZmFjZSwgbWV0aG9kKQotICAgICAgICAgPDwgIiwgZGF0YSwgJnJlcGx5KTtcbiIKLSAgICAgICAgIDw8ICIgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LKSB7XG4iCi0gICAgICAgICA8PCAiICAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7XG4iCi0gICAgICAgICA8PCAiICAgICAgZXJyID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKHJlcGx5KTtcbiIKLSAgICAgICAgIDw8ICIgICAgICBpZiAoZXJyID09IDo6YW5kcm9pZDo6T0sgJiYgX2FpZGxfc3RhdHVzLmlzT2soKSkge1xuIgotICAgICAgICAgPDwgIiAgICAgICAgY2FjaGVkX3ZlcnNpb25fID0gcmVwbHkucmVhZEludDMyKCk7XG4iCi0gICAgICAgICA8PCAiICAgICAgfVxuIgotICAgICAgICAgPDwgIiAgICB9XG4iCi0gICAgICAgICA8PCAiICB9XG4iCi0gICAgICAgICA8PCAiICByZXR1cm4gY2FjaGVkX3ZlcnNpb25fO1xuIgotICAgICAgICAgPDwgIn1cbiI7Ci0gICAgcmV0dXJuIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7CisgICAgb3V0IDw8ICJpbnQzMl90ICIgPDwgYnBfbmFtZSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKSB7XG4iCisgICAgICAgIDw8ICIgIGlmIChjYWNoZWRfdmVyc2lvbl8gPT0gLTEpIHtcbiIKKyAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCBkYXRhO1xuIgorICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6UGFyY2VsIHJlcGx5O1xuIgorICAgICAgICA8PCAiICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpO1xuIgorICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KCIKKyAgICAgICAgPDwgR2V0VHJhbnNhY3Rpb25JZEZvcihibl9uYW1lLCBtZXRob2QpIDw8ICIsIGRhdGEsICZyZXBseSk7XG4iCisgICAgICAgIDw8ICIgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LKSB7XG4iCisgICAgICAgIDw8ICIgICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cztcbiIKKyAgICAgICAgPDwgIiAgICAgIGVyciA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChyZXBseSk7XG4iCisgICAgICAgIDw8ICIgICAgICBpZiAoZXJyID09IDo6YW5kcm9pZDo6T0sgJiYgX2FpZGxfc3RhdHVzLmlzT2soKSkge1xuIgorICAgICAgICA8PCAiICAgICAgICBjYWNoZWRfdmVyc2lvbl8gPSByZXBseS5yZWFkSW50MzIoKTtcbiIKKyAgICAgICAgPDwgIiAgICAgIH1cbiIKKyAgICAgICAgPDwgIiAgICB9XG4iCisgICAgICAgIDw8ICIgIH1cbiIKKyAgICAgICAgPDwgIiAgcmV0dXJuIGNhY2hlZF92ZXJzaW9uXztcbiIKKyAgICAgICAgPDwgIn1cbiI7CisgICAgb3V0IDw8ICJcbiI7CiAgIH0KICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBjb25zdCBzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICAgIGNvbnN0IHN0cmluZyBwcm94eSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gICAgY29kZSA8PCAic3RkOjpzdHJpbmcgIiA8PCBwcm94eSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSB7XG4iCi0gICAgICAgICA8PCAiICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9ja0d1YXJkKGNhY2hlZF9oYXNoX211dGV4Xyk7XG4iCi0gICAgICAgICA8PCAiICBpZiAoY2FjaGVkX2hhc2hfID09IFwiLTFcIikge1xuIgotICAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCBkYXRhO1xuIgotICAgICAgICAgPDwgIiAgICA6OmFuZHJvaWQ6OlBhcmNlbCByZXBseTtcbiIKLSAgICAgICAgIDw8ICIgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7XG4iCi0gICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KCIgPDwgR2V0VHJhbnNhY3Rpb25JZEZvcihpbnRlcmZhY2UsIG1ldGhvZCkKLSAgICAgICAgIDw8ICIsIGRhdGEsICZyZXBseSk7XG4iCi0gICAgICAgICA8PCAiICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSykge1xuIgotICAgICAgICAgPDwgIiAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzO1xuIgotICAgICAgICAgPDwgIiAgICAgIGVyciA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChyZXBseSk7XG4iCi0gICAgICAgICA8PCAiICAgICAgaWYgKGVyciA9PSA6OmFuZHJvaWQ6Ok9LICYmIF9haWRsX3N0YXR1cy5pc09rKCkpIHtcbiIKLSAgICAgICAgIDw8ICIgICAgICAgIHJlcGx5LnJlYWRVdGY4RnJvbVV0ZjE2KCZjYWNoZWRfaGFzaF8pO1xuIgotICAgICAgICAgPDwgIiAgICAgIH1cbiIKLSAgICAgICAgIDw8ICIgICAgfVxuIgotICAgICAgICAgPDwgIiAgfVxuIgotICAgICAgICAgPDwgIiAgcmV0dXJuIGNhY2hlZF9oYXNoXztcbiIKLSAgICAgICAgIDw8ICJ9XG4iOwotICAgIHJldHVybiB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPihuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOworICAgIG91dCA8PCAic3RkOjpzdHJpbmcgIiA8PCBicF9uYW1lIDw8ICI6OiIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpIHtcbiIKKyAgICAgICAgPDwgIiAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2tHdWFyZChjYWNoZWRfaGFzaF9tdXRleF8pO1xuIgorICAgICAgICA8PCAiICBpZiAoY2FjaGVkX2hhc2hfID09IFwiLTFcIikge1xuIgorICAgICAgICA8PCAiICAgIDo6YW5kcm9pZDo6UGFyY2VsIGRhdGE7XG4iCisgICAgICAgIDw8ICIgICAgOjphbmRyb2lkOjpQYXJjZWwgcmVwbHk7XG4iCisgICAgICAgIDw8ICIgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7XG4iCisgICAgICAgIDw8ICIgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoIgorICAgICAgICA8PCBHZXRUcmFuc2FjdGlvbklkRm9yKGJuX25hbWUsIG1ldGhvZCkgPDwgIiwgZGF0YSwgJnJlcGx5KTtcbiIKKyAgICAgICAgPDwgIiAgICBpZiAoZXJyID09IDo6YW5kcm9pZDo6T0spIHtcbiIKKyAgICAgICAgPDwgIiAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzO1xuIgorICAgICAgICA8PCAiICAgICAgZXJyID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKHJlcGx5KTtcbiIKKyAgICAgICAgPDwgIiAgICAgIGlmIChlcnIgPT0gOjphbmRyb2lkOjpPSyAmJiBfYWlkbF9zdGF0dXMuaXNPaygpKSB7XG4iCisgICAgICAgIDw8ICIgICAgICAgIHJlcGx5LnJlYWRVdGY4RnJvbVV0ZjE2KCZjYWNoZWRfaGFzaF8pO1xuIgorICAgICAgICA8PCAiICAgICAgfVxuIgorICAgICAgICA8PCAiICAgIH1cbiIKKyAgICAgICAgPDwgIiAgfVxuIgorICAgICAgICA8PCAiICByZXR1cm4gY2FjaGVkX2hhc2hfO1xuIgorICAgICAgICA8PCAifVxuIjsKICAgfQotICByZXR1cm4gbnVsbHB0cjsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLXVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkQ2xpZW50U291cmNlKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewordm9pZCBHZW5lcmF0ZUNsaWVudFNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVfbGlzdCA9IHsKICAgICAgIEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQsIGZhbHNlKSwKLSAgICAgIEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIsIGZhbHNlKSwgLy8gZm9yIFRSQU5TQUNUSU9OXyogY29uc3RzCi0gICAgICBrUGFyY2VsSGVhZGVyLAotICAgICAga0FuZHJvaWRCYXNlTWFjcm9zSGVhZGVyCi0gIH07CisgICAgICBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSLCBmYWxzZSksICAvLyBmb3IgVFJBTlNBQ1RJT05fKiBjb25zdHMKKyAgICAgIGtQYXJjZWxIZWFkZXIsIGtBbmRyb2lkQmFzZU1hY3Jvc0hlYWRlcn07CiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CiAgICAgaW5jbHVkZV9saXN0LmVtcGxhY2VfYmFjaygiY2hyb25vIik7CiAgICAgaW5jbHVkZV9saXN0LmVtcGxhY2VfYmFjaygiZnVuY3Rpb25hbCIpOwogICB9Ci0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZmlsZV9kZWNsczsKKyAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogaW5jbHVkZV9saXN0KSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBwYXRoIDw8ICI+XG4iOworICB9CisgIG91dCA8PCAiXG4iOworCisgIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOworICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7CisgIGNvbnN0IHN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKKworICBFbnRlck5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7CisgIG91dCA8PCAiXG4iOwogCiAgIC8vIFRoZSBjb25zdHJ1Y3RvciBqdXN0IHBhc3NlcyB0aGUgSUJpbmRlciBpbnN0YW5jZSB1cCB0byB0aGUgc3VwZXIKICAgLy8gY2xhc3MuCi0gIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICBjb25zdCBzdHJpbmcgYnBfbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0gIGZpbGVfZGVjbHMucHVzaF9iYWNrKHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+e25ldyBDb25zdHJ1Y3RvckltcGx7Ci0gICAgICBicF9uYW1lLAotICAgICAgQXJnTGlzdHtTdHJpbmdQcmludGYoImNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgJXMiLCBrSW1wbFZhck5hbWUpfSwKLSAgICAgIHsiQnBJbnRlcmZhY2U8IiArIGlfbmFtZSArICI+KCIgKyBrSW1wbFZhck5hbWUgKyAiKSJ9fX0pOworICBvdXQgPDwgcV9uYW1lIDw8ICI6OiIgPDwgYnBfbmFtZSA8PCAiKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbClcbiI7CisgIG91dCA8PCAiICAgIDogQnBJbnRlcmZhY2U8IiArIGlfbmFtZSArICI+KF9haWRsX2ltcGwpe1xuIjsKKyAgb3V0IDw8ICJ9XG4iOworICBvdXQgPDwgIlxuIjsKIAogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIHN0cmluZyBjb2RlOwotICAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKLSAgICAoKndyaXRlcikgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiICsgYnBfbmFtZSArICI6OlRyYW5zYWN0aW9uTG9nJik+ICIgPDwgYnBfbmFtZQotICAgICAgICAgICAgICA8PCAiOjpsb2dGdW5jO1xuIjsKLSAgICB3cml0ZXItPkNsb3NlKCk7Ci0gICAgZmlsZV9kZWNscy5wdXNoX2JhY2sodW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4obmV3IExpdGVyYWxEZWNsKGNvZGUpKSk7CisgICAgb3V0IDw8ICJzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgIiArIHFfbmFtZSArICI6OlRyYW5zYWN0aW9uTG9nJik+ICIgPDwgcV9uYW1lCisgICAgICAgIDw8ICI6OmxvZ0Z1bmM7XG4iOworICAgIG91dCA8PCAiXG4iOwogICB9CiAKICAgLy8gQ2xpZW50cyBkZWZpbmUgYSBtZXRob2QgcGVyIHRyYW5zYWN0aW9uLgogICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKLSAgICB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBtOwogICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgewotICAgICAgbSA9IERlZmluZUNsaWVudFRyYW5zYWN0aW9uKHR5cGVuYW1lcywgaW50ZXJmYWNlLCAqbWV0aG9kLCBvcHRpb25zKTsKKyAgICAgIEdlbmVyYXRlQ2xpZW50VHJhbnNhY3Rpb24ob3V0LCB0eXBlbmFtZXMsIGludGVyZmFjZSwgKm1ldGhvZCwgb3B0aW9ucyk7CiAgICAgfSBlbHNlIHsKLSAgICAgIG0gPSBEZWZpbmVDbGllbnRNZXRhVHJhbnNhY3Rpb24odHlwZW5hbWVzLCBpbnRlcmZhY2UsICptZXRob2QsIG9wdGlvbnMpOworICAgICAgR2VuZXJhdGVDbGllbnRNZXRhVHJhbnNhY3Rpb24ob3V0LCBpbnRlcmZhY2UsICptZXRob2QsIG9wdGlvbnMpOwogICAgIH0KLSAgICBpZiAoIW0pIHsgcmV0dXJuIG51bGxwdHI7IH0KLSAgICBmaWxlX2RlY2xzLnB1c2hfYmFjayhzdGQ6Om1vdmUobSkpOworICAgIG91dCA8PCAiXG4iOwogICB9Ci0gIHJldHVybiB1bmlxdWVfcHRyPERvY3VtZW50PntuZXcgQ3BwU291cmNlewotICAgICAgaW5jbHVkZV9saXN0LAotICAgICAgTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoZmlsZV9kZWNscyksIGludGVyZmFjZS5HZXRTcGxpdFBhY2thZ2UoKSl9fTsKKworICBMZWF2ZU5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7CiB9CiAKIG5hbWVzcGFjZSB7CiAKLXZvaWQgQnVpbGRDb25zdGFudERlZmluaXRpb25zKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0eXBlX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiYgZGVjbHMpIHsKK3ZvaWQgR2VuZXJhdGVDb25zdGFudERlZmluaXRpb25zKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBzdHJpbmcmIHRlbXBsYXRlX2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHFfbmFtZSkgewogICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0YW50IDogdHlwZS5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7CiAgICAgY29uc3QgQWlkbENvbnN0YW50VmFsdWUmIHZhbHVlID0gY29uc3RhbnQtPkdldFZhbHVlKCk7CiAgICAgaWYgKHZhbHVlLkdldFR5cGUoKSAhPSBBaWRsQ29uc3RhbnRWYWx1ZTo6VHlwZTo6U1RSSU5HKSBjb250aW51ZTsKIAotICAgIHN0ZDo6c3RyaW5nIGNwcFR5cGUgPSBDcHBOYW1lT2YoY29uc3RhbnQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICB1bmlxdWVfcHRyPE1ldGhvZEltcGw+IGdldHRlcigKLSAgICAgICAgbmV3IE1ldGhvZEltcGwoImNvbnN0ICIgKyBjcHBUeXBlICsgIiYiLCBjbGFzc19uYW1lLCBjb25zdGFudC0+R2V0TmFtZSgpLCB0eXBlX3BhcmFtcywge30pKTsKLSAgICBnZXR0ZXItPkdldFN0YXRlbWVudEJsb2NrKCktPkFkZExpdGVyYWwoCi0gICAgICAgIFN0cmluZ1ByaW50Zigic3RhdGljIGNvbnN0ICVzIHZhbHVlKCVzKSIsIGNwcFR5cGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50LT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKS5jX3N0cigpKSk7Ci0gICAgZ2V0dGVyLT5HZXRTdGF0ZW1lbnRCbG9jaygpLT5BZGRMaXRlcmFsKCJyZXR1cm4gdmFsdWUiKTsKLSAgICBkZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKGdldHRlcikpOworICAgIHN0ZDo6c3RyaW5nIGNwcF90eXBlID0gQ3BwTmFtZU9mKGNvbnN0YW50LT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7CisgICAgb3V0IDw8IHRlbXBsYXRlX2RlY2w7CisgICAgb3V0IDw8ICJjb25zdCAiIDw8IGNwcF90eXBlIDw8ICImICIgPDwgcV9uYW1lIDw8ICI6OiIgPDwgY29uc3RhbnQtPkdldE5hbWUoKSA8PCAiKCkge1xuIjsKKyAgICBvdXQgPDwgIiAgc3RhdGljIGNvbnN0ICIgPDwgY3BwX3R5cGUgPDwgIiB2YWx1ZSgiCisgICAgICAgIDw8IGNvbnN0YW50LT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKSA8PCAiKTtcbiI7CisgICAgb3V0IDw8ICIgIHJldHVybiB2YWx1ZTtcbiI7CisgICAgb3V0IDw8ICJ9XG4iOwogICB9CiB9CiAKLXZvaWQgQnVpbGRDb25zdGFudERlY2xhcmF0aW9ucyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVfcHRyPENsYXNzRGVjbD4mIGNscywgc2V0PHN0cmluZz4mIGluY2x1ZGVzKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHN0cmluZ19jb25zdGFudHM7Ci0gIHVuaXF1ZV9wdHI8RW51bT4gYnl0ZV9jb25zdGFudF9lbnVte25ldyBFbnVteyIiLCAiaW50OF90IiwgZmFsc2V9fTsKLSAgdW5pcXVlX3B0cjxFbnVtPiBpbnRfY29uc3RhbnRfZW51bXtuZXcgRW51bXsiIiwgImludDMyX3QiLCBmYWxzZX19OwotICB1bmlxdWVfcHRyPEVudW0+IGxvbmdfY29uc3RhbnRfZW51bXtuZXcgRW51bXsiIiwgImludDY0X3QiLCBmYWxzZX19Owordm9pZCBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0YW50IDogdHlwZS5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7CiAgICAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUgPSBjb25zdGFudC0+R2V0VHlwZSgpOwotICAgIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlJiB2YWx1ZSA9IGNvbnN0YW50LT5HZXRWYWx1ZSgpOwotCi0gICAgY29uc3Qgc3RyaW5nIGF0dHJpYnV0ZSA9IEdldERlcHJlY2F0ZWRBdHRyaWJ1dGUoKmNvbnN0YW50KTsKKyAgICBjb25zdCBhdXRvIGNwcF90eXBlID0gQ3BwTmFtZU9mKHR5cGUsIHR5cGVuYW1lcyk7CiAgICAgaWYgKHR5cGUuU2lnbmF0dXJlKCkgPT0gIlN0cmluZyIpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIGNwcFR5cGUgPSBDcHBOYW1lT2YoY29uc3RhbnQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICAgIHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+IGdldHRlcihuZXcgTWV0aG9kRGVjbCgiY29uc3QgIiArIGNwcFR5cGUgKyAiJiIsIGNvbnN0YW50LT5HZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIE1ldGhvZERlY2w6OklTX1NUQVRJQywgYXR0cmlidXRlKSk7Ci0gICAgICBzdHJpbmdfY29uc3RhbnRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZ2V0dGVyKSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLlNpZ25hdHVyZSgpID09ICJieXRlIikgewotICAgICAgYnl0ZV9jb25zdGFudF9lbnVtLT5BZGRWYWx1ZShjb25zdGFudC0+R2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvciksIGF0dHJpYnV0ZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLlNpZ25hdHVyZSgpID09ICJpbnQiKSB7Ci0gICAgICBpbnRfY29uc3RhbnRfZW51bS0+QWRkVmFsdWUoY29uc3RhbnQtPkdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvciksIGF0dHJpYnV0ZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLlNpZ25hdHVyZSgpID09ICJsb25nIikgewotICAgICAgbG9uZ19jb25zdGFudF9lbnVtLT5BZGRWYWx1ZShjb25zdGFudC0+R2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudC0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvciksIGF0dHJpYnV0ZSk7CisgICAgICBvdXQgPDwgInN0YXRpYyBjb25zdCAiIDw8IGNwcF90eXBlIDw8ICImICIgPDwgY29uc3RhbnQtPkdldE5hbWUoKSA8PCAiKCkiOworICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKmNvbnN0YW50KTsKKyAgICAgIG91dCA8PCAiO1xuIjsKICAgICB9IGVsc2UgewotICAgICAgQUlETF9GQVRBTCh2YWx1ZSkgPDwgIlVucmVjb2duaXplZCBjb25zdGFudCB0eXBlOiAiIDw8IHR5cGUuU2lnbmF0dXJlKCk7Ci0gICAgfQotICB9Ci0gIGlmIChieXRlX2NvbnN0YW50X2VudW0tPkhhc1ZhbHVlcygpKSB7Ci0gICAgY2xzLT5BZGRQdWJsaWMoc3RkOjptb3ZlKGJ5dGVfY29uc3RhbnRfZW51bSkpOwotICB9Ci0gIGlmIChpbnRfY29uc3RhbnRfZW51bS0+SGFzVmFsdWVzKCkpIHsKLSAgICBjbHMtPkFkZFB1YmxpYyhzdGQ6Om1vdmUoaW50X2NvbnN0YW50X2VudW0pKTsKLSAgfQotICBpZiAobG9uZ19jb25zdGFudF9lbnVtLT5IYXNWYWx1ZXMoKSkgewotICAgIGNscy0+QWRkUHVibGljKHN0ZDo6bW92ZShsb25nX2NvbnN0YW50X2VudW0pKTsKLSAgfQotICBpZiAoIXN0cmluZ19jb25zdGFudHMuZW1wdHkoKSkgewotICAgIGluY2x1ZGVzLmluc2VydChrU3RyaW5nMTZIZWFkZXIpOwotCi0gICAgZm9yIChhdXRvJiBzdHJpbmdfY29uc3RhbnQgOiBzdHJpbmdfY29uc3RhbnRzKSB7Ci0gICAgICBjbHMtPkFkZFB1YmxpYyhzdGQ6Om1vdmUoc3RyaW5nX2NvbnN0YW50KSk7CisgICAgICBvdXQgPDwgImVudW0gOiAiIDw8IGNwcF90eXBlIDw8ICIgeyAiIDw8IGNvbnN0YW50LT5HZXROYW1lKCk7CisgICAgICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCAqY29uc3RhbnQpOworICAgICAgb3V0IDw8ICIgPSAiIDw8IGNvbnN0YW50LT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKSA8PCAiIH07XG4iOwogICAgIH0KICAgfQogfQogCi1ib29sIEhhbmRsZVNlcnZlclRyYW5zYWN0aW9uKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIFN0YXRlbWVudEJsb2NrKiBiKSB7Cit2b2lkIEdlbmVyYXRlU2VydmVyVHJhbnNhY3Rpb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworCiAgIC8vIERlY2xhcmUgYWxsIHRoZSBwYXJhbWV0ZXJzIG5vdy4gIEluIHRoZSBjb21tb24gY2FzZSwgd2UgZXhwZWN0IG5vIGVycm9ycwogICAvLyBpbiBzZXJpYWxpemF0aW9uLgogICBmb3IgKGNvbnN0IHVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYSA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewotICAgIGItPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCIlcyAlcyIsIENwcE5hbWVPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZFZhck5hbWUoKmEpLmNfc3RyKCkpKTsKKyAgICBvdXQuV3JpdGUoIiVzICVzO1xuIiwgQ3BwTmFtZU9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLCBCdWlsZFZhck5hbWUoKmEpLmNfc3RyKCkpOwogICB9CiAKICAgLy8gRGVjbGFyZSBhIHZhcmlhYmxlIHRvIGhvbGQgdGhlIHJldHVybiB2YWx1ZS4KICAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgewotICAgIHN0cmluZyB0eXBlID0gQ3BwTmFtZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgYi0+QWRkTGl0ZXJhbChTdHJpbmdQcmludGYoIiVzICVzIiwgdHlwZS5jX3N0cigpLCBrUmV0dXJuVmFyTmFtZSkpOworICAgIG91dC5Xcml0ZSgiJXMgJXM7XG4iLCBDcHBOYW1lT2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLCBrUmV0dXJuVmFyTmFtZSk7CiAgIH0KIAogICAvLyBDaGVjayB0aGF0IHRoZSBjbGllbnQgaXMgY2FsbGluZyB0aGUgY29ycmVjdCBpbnRlcmZhY2UuCi0gIElmU3RhdGVtZW50KiBpbnRlcmZhY2VfY2hlY2sgPSBuZXcgSWZTdGF0ZW1lbnQoCi0gICAgICBuZXcgTWV0aG9kQ2FsbChTdHJpbmdQcmludGYoIiVzLmNoZWNrSW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVZhck5hbWUpLCAidGhpcyIpLAotICAgICAgdHJ1ZSAvKiBpbnZlcnQgdGhlIGNoZWNrICovKTsKLSAgYi0+QWRkU3RhdGVtZW50KGludGVyZmFjZV9jaGVjayk7Ci0gIGludGVyZmFjZV9jaGVjay0+T25UcnVlKCktPkFkZFN0YXRlbWVudCgKLSAgICAgIG5ldyBBc3NpZ25tZW50KGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwgIjo6YW5kcm9pZDo6QkFEX1RZUEUiKSk7Ci0gIGludGVyZmFjZV9jaGVjay0+T25UcnVlKCktPkFkZExpdGVyYWwoImJyZWFrIik7CisgIG91dC5Xcml0ZSgiaWYgKCEoJXMuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7XG4iLCBrRGF0YVZhck5hbWUpOworICBvdXQuV3JpdGUoIiAgJXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lKTsKKyAgb3V0LldyaXRlKCIgIGJyZWFrO1xuIik7CisgIG91dC5Xcml0ZSgifVxuIik7CiAKICAgaWYgKG9wdGlvbnMuR2VuVHJhY2VzKCkpIHsKLSAgICBiLT5BZGRMaXRlcmFsKAotICAgICAgICBTdHJpbmdQcmludGYoIjo6YW5kcm9pZDo6U2NvcGVkVHJhY2UgJXMoQVRSQUNFX1RBR19BSURMLCBcIkFJREw6OmNwcDo6JXM6OiVzOjpjcHBTZXJ2ZXJcIikiLAotICAgICAgICAgICAgICAgICAgICAga1RyYWNlVmFyTmFtZSwgaW50ZXJmYWNlLkdldE5hbWUoKS5jX3N0cigpLCBtZXRob2QuR2V0TmFtZSgpLmNfc3RyKCkpKTsKKyAgICBvdXQuV3JpdGUoIjo6YW5kcm9pZDo6U2NvcGVkVHJhY2UgJXMoQVRSQUNFX1RBR19BSURMLCBcIkFJREw6OmNwcDo6JXM6OiVzOjpjcHBTZXJ2ZXJcIik7XG4iLAorICAgICAgICAgICAgICBrVHJhY2VWYXJOYW1lLCBpbnRlcmZhY2UuR2V0TmFtZSgpLmNfc3RyKCksIG1ldGhvZC5HZXROYW1lKCkuY19zdHIoKSk7CiAgIH0KIAogICAvLyBEZXNlcmlhbGl6ZSBlYWNoICJpbiIgcGFyYW1ldGVyIHRvIHRoZSB0cmFuc2FjdGlvbi4KQEAgLTYxOCwxMTEgKzQ3NiwxNTggQEAKICAgICAvLyAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgeyBicmVhazsgfQogICAgIGNvbnN0IHN0cmluZyYgdmFyX25hbWUgPSAiJiIgKyBCdWlsZFZhck5hbWUoKmEpOwogICAgIGlmIChhLT5Jc0luKCkpIHsKLSAgICAgIGNvbnN0IHN0cmluZyYgcmVhZE1ldGhvZCA9IFBhcmNlbFJlYWRNZXRob2RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgICBiLT5BZGRTdGF0ZW1lbnQoCi0gICAgICAgICAgbmV3IEFzc2lnbm1lbnR7a0FuZHJvaWRTdGF0dXNWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxse3N0cmluZyhrRGF0YVZhck5hbWUpICsgIi4iICsgcmVhZE1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxSZWFkQ2FzdE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCB2YXJfbmFtZSl9fSk7Ci0gICAgICBiLT5BZGRTdGF0ZW1lbnQoQnJlYWtPblN0YXR1c05vdE9rKCkpOwotICAgIH0gZWxzZSBpZiAoYS0+SXNPdXQoKSAmJiBhLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7CisgICAgICBvdXQuV3JpdGUoIiVzID0gJXMuJXMoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrRGF0YVZhck5hbWUsCisgICAgICAgICAgICAgICAgUGFyY2VsUmVhZE1ldGhvZE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIFBhcmNlbFJlYWRDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHZhcl9uYW1lKS5jX3N0cigpKTsKKyAgICAgIEdlbmVyYXRlQnJlYWtPblN0YXR1c05vdE9rKG91dCk7CisgICAgfSBlbHNlIGlmIChhLT5Jc091dCgpICYmIGEtPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICAvLyBTcGVjaWFsIGNhc2UsIHRoZSBsZW5ndGggb2YgdGhlIG91dCBhcnJheSBpcyB3cml0dGVuIGludG8gdGhlIHBhcmNlbC4KICAgICAgIC8vICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZXNpemVPdXRWZWN0b3IoJm91dF9wYXJhbV9uYW1lKTsKICAgICAgIC8vICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSB7IGJyZWFrOyB9Ci0gICAgICBiLT5BZGRTdGF0ZW1lbnQoCi0gICAgICAgICAgbmV3IEFzc2lnbm1lbnR7a0FuZHJvaWRTdGF0dXNWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxse3N0cmluZyhrRGF0YVZhck5hbWUpICsgIi5yZXNpemVPdXRWZWN0b3IiLCB2YXJfbmFtZX19KTsKLSAgICAgIGItPkFkZFN0YXRlbWVudChCcmVha09uU3RhdHVzTm90T2soKSk7CisgICAgICBvdXQuV3JpdGUoIiVzID0gJXMucmVzaXplT3V0VmVjdG9yKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0RhdGFWYXJOYW1lLAorICAgICAgICAgICAgICAgIHZhcl9uYW1lLmNfc3RyKCkpOworICAgICAgR2VuZXJhdGVCcmVha09uU3RhdHVzTm90T2sob3V0KTsKICAgICB9CiAgIH0KIAotICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgYi0+QWRkTGl0ZXJhbChHZW5Mb2dCZWZvcmVFeGVjdXRlKGJuX25hbWUsIG1ldGhvZCwgdHJ1ZSAvKiBpc1NlcnZlciAqLywgZmFsc2UgLyogaXNOZGsgKi8pLAotICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIG91dCA8PCBHZW5Mb2dCZWZvcmVFeGVjdXRlKGJuX25hbWUsIG1ldGhvZCwgdHJ1ZSAvKiBpc1NlcnZlciAqLywgZmFsc2UgLyogaXNOZGsgKi8pOwogICB9CisKKyAgaWYgKCFtZXRob2QuR2V0QXJndW1lbnRzKCkuZW1wdHkoKSAmJiBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSA+PSBTREtfVkVSU0lPTl9UaXJhbWlzdSkgeworICAgIG91dCA8PCAiaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7XG4iOworICAgIG91dCA8PCAiICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7XG4iOworICAgIG91dCA8PCAiICBicmVhaztcbiI7CisgICAgb3V0IDw8ICJ9XG4iOworICB9CisKICAgLy8gQ2FsbCB0aGUgYWN0dWFsIG1ldGhvZC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIHN1YmNsYXNzLgotICB2ZWN0b3I8dW5pcXVlX3B0cjxBc3ROb2RlPj4gc3RhdHVzX2FyZ3M7Ci0gIHN0YXR1c19hcmdzLmVtcGxhY2VfYmFjayhuZXcgTWV0aG9kQ2FsbCgKLSAgICAgIG1ldGhvZC5HZXROYW1lKCksIEJ1aWxkQXJnTGlzdCh0eXBlbmFtZXMsIG1ldGhvZCwgZmFsc2UgLyogbm90IGZvciBtZXRob2QgZGVjbCAqLykpKTsKLSAgYi0+QWRkU3RhdGVtZW50KG5ldyBTdGF0ZW1lbnQobmV3IE1ldGhvZENhbGwoCi0gICAgICBTdHJpbmdQcmludGYoIiVzICVzIiwga0JpbmRlclN0YXR1c0xpdGVyYWwsIGtTdGF0dXNWYXJOYW1lKSwKLSAgICAgIEFyZ0xpc3Qoc3RkOjptb3ZlKHN0YXR1c19hcmdzKSkpKSk7CisgIG91dC5Xcml0ZSgiJXMgJXMoJXMoJXMpKTtcbiIsIGtCaW5kZXJTdGF0dXNMaXRlcmFsLCBrU3RhdHVzVmFyTmFtZSwgbWV0aG9kLkdldE5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgR2VuZXJhdGVBcmdMaXN0KHR5cGVuYW1lcywgbWV0aG9kLCAvKmZvcl9kZWNsYXJhdGlvbj0qL2ZhbHNlLCAvKnR5cGVfbmFtZV9vbmx5PSovZmFsc2UpCisgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgYi0+QWRkTGl0ZXJhbChHZW5Mb2dBZnRlckV4ZWN1dGUoYm5fbmFtZSwgaW50ZXJmYWNlLCBtZXRob2QsIGtTdGF0dXNWYXJOYW1lLCBrUmV0dXJuVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzU2VydmVyICovLCBmYWxzZSAvKiBpc05kayAqLyksCi0gICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgb3V0IDw8IEdlbkxvZ0FmdGVyRXhlY3V0ZShibl9uYW1lLCBpbnRlcmZhY2UsIG1ldGhvZCwga1N0YXR1c1Zhck5hbWUsIGtSZXR1cm5WYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc1NlcnZlciAqLywgZmFsc2UgLyogaXNOZGsgKi8pOwogICB9CiAKICAgLy8gV3JpdGUgZXhjZXB0aW9ucyBkdXJpbmcgdHJhbnNhY3Rpb24gaGFuZGxpbmcgdG8gcGFyY2VsLgogICBpZiAoIW1ldGhvZC5Jc09uZXdheSgpKSB7Ci0gICAgYi0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgIFN0cmluZ1ByaW50ZigiJXMud3JpdGVUb1BhcmNlbCglcykiLCBrU3RhdHVzVmFyTmFtZSwga1JlcGx5VmFyTmFtZSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoQnJlYWtPblN0YXR1c05vdE9rKCkpOwotICAgIElmU3RhdGVtZW50KiBleGNlcHRpb25fY2hlY2sgPSBuZXcgSWZTdGF0ZW1lbnQoCi0gICAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbihTdHJpbmdQcmludGYoIiElcy5pc09rKCkiLCBrU3RhdHVzVmFyTmFtZSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoZXhjZXB0aW9uX2NoZWNrKTsKLSAgICBleGNlcHRpb25fY2hlY2stPk9uVHJ1ZSgpLT5BZGRMaXRlcmFsKCJicmVhayIpOworICAgIG91dC5Xcml0ZSgiJXMgPSAlcy53cml0ZVRvUGFyY2VsKCVzKTtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga1N0YXR1c1Zhck5hbWUsIGtSZXBseVZhck5hbWUpOworICAgIEdlbmVyYXRlQnJlYWtPblN0YXR1c05vdE9rKG91dCk7CisgICAgb3V0LldyaXRlKCJpZiAoISVzLmlzT2soKSkge1xuIiwga1N0YXR1c1Zhck5hbWUpOworICAgIG91dC5Xcml0ZSgiICBicmVhaztcbiIpOworICAgIG91dC5Xcml0ZSgifVxuIik7CiAgIH0KIAogICAvLyBJZiB3ZSBoYXZlIGEgcmV0dXJuIHZhbHVlLCB3cml0ZSBpdCBmaXJzdC4KICAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgewotICAgIHN0cmluZyB3cml0ZU1ldGhvZCA9Ci0gICAgICAgIHN0cmluZyhrUmVwbHlWYXJOYW1lKSArICItPiIgKyBQYXJjZWxXcml0ZU1ldGhvZE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgYi0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgIG5ldyBNZXRob2RDYWxsKHdyaXRlTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxXcml0ZUNhc3RPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIGtSZXR1cm5WYXJOYW1lKSkpKTsKLSAgICBiLT5BZGRTdGF0ZW1lbnQoQnJlYWtPblN0YXR1c05vdE9rKCkpOworICAgIG91dC5Xcml0ZSgiJXMgPSAlcy0+JXMoJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrUmVwbHlWYXJOYW1lLAorICAgICAgICAgICAgICBQYXJjZWxXcml0ZU1ldGhvZE9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcykuY19zdHIoKSwKKyAgICAgICAgICAgICAgUGFyY2VsV3JpdGVDYXN0T2YobWV0aG9kLkdldFR5cGUoKSwgdHlwZW5hbWVzLCBrUmV0dXJuVmFyTmFtZSkuY19zdHIoKSk7CisgICAgR2VuZXJhdGVCcmVha09uU3RhdHVzTm90T2sob3V0KTsKICAgfQogICAvLyBXcml0ZSBlYWNoIG91dCBwYXJhbWV0ZXIgdG8gdGhlIHJlcGx5IHBhcmNlbC4KICAgZm9yIChjb25zdCBBaWRsQXJndW1lbnQqIGEgOiBtZXRob2QuR2V0T3V0QXJndW1lbnRzKCkpIHsKICAgICAvLyBTZXJpYWxpemF0aW9uIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAvLyAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IGRhdGEuV3JpdGVJbnQzMihvdXRfcGFyYW1fbmFtZSk7CiAgICAgLy8gICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHsgYnJlYWs7IH0KLSAgICBjb25zdCBzdHJpbmcmIHdyaXRlTWV0aG9kID0gUGFyY2VsV3JpdGVNZXRob2RPZihhLT5HZXRUeXBlKCksIHR5cGVuYW1lcyk7Ci0gICAgYi0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgIG5ldyBNZXRob2RDYWxsKHN0cmluZyhrUmVwbHlWYXJOYW1lKSArICItPiIgKyB3cml0ZU1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsV3JpdGVDYXN0T2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIEJ1aWxkVmFyTmFtZSgqYSkpKSkpOwotICAgIGItPkFkZFN0YXRlbWVudChCcmVha09uU3RhdHVzTm90T2soKSk7CisgICAgb3V0LldyaXRlKCIlcyA9ICVzLT4lcyglcyk7XG4iLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtSZXBseVZhck5hbWUsCisgICAgICAgICAgICAgIFBhcmNlbFdyaXRlTWV0aG9kT2YoYS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCisgICAgICAgICAgICAgIFBhcmNlbFdyaXRlQ2FzdE9mKGEtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBCdWlsZFZhck5hbWUoKmEpKS5jX3N0cigpKTsKKyAgICBHZW5lcmF0ZUJyZWFrT25TdGF0dXNOb3RPayhvdXQpOwogICB9Ci0KLSAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSGFuZGxlU2VydmVyTWV0YVRyYW5zYWN0aW9uKGNvbnN0IEFpZGxUeXBlbmFtZXMmLCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRCbG9jayogYikgewordm9pZCBHZW5lcmF0ZVNlcnZlck1ldGFUcmFuc2FjdGlvbihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIEFJRExfRkFUQUxfSUYobWV0aG9kLklzVXNlckRlZmluZWQoKSwgbWV0aG9kKTsKIAorICBzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpO1xuIgotICAgICAgICAgPDwgIl9haWRsX3JlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7XG4iCi0gICAgICAgICA8PCAiX2FpZGxfcmVwbHktPndyaXRlSW50MzIoIiA8PCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpCi0gICAgICAgICA8PCAiOjpWRVJTSU9OKSI7Ci0gICAgYi0+QWRkTGl0ZXJhbChjb2RlLnN0cigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBvdXQgPDwgIl9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcyk7XG4iCisgICAgICAgIDw8ICJfYWlkbF9yZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpO1xuIgorICAgICAgICA8PCAiX2FpZGxfcmVwbHktPndyaXRlSW50MzIoIiA8PCBpZmFjZSA8PCAiOjpWRVJTSU9OKTtcbiI7CiAgIH0KICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpO1xuIgotICAgICAgICAgPDwgIl9haWRsX3JlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7XG4iCi0gICAgICAgICA8PCAiX2FpZGxfcmVwbHktPndyaXRlVXRmOEFzVXRmMTYoIiA8PCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpCi0gICAgICAgICA8PCAiOjpIQVNIKSI7Ci0gICAgYi0+QWRkTGl0ZXJhbChjb2RlLnN0cigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBvdXQgPDwgIl9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcyk7XG4iCisgICAgICAgIDw8ICJfYWlkbF9yZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpO1xuIgorICAgICAgICA8PCAiX2FpZGxfcmVwbHktPndyaXRlVXRmOEFzVXRmMTYoIiA8PCBpZmFjZSA8PCAiOjpIQVNIKTtcbiI7CiAgIH0KLSAgcmV0dXJuIGZhbHNlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAotdW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRTZXJ2ZXJTb3VyY2UoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Cit2b2lkIEdlbmVyYXRlU2VydmVyT25UcmFuc2FjdChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBzdHJpbmcgYm5fbmFtZSA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CisgIGNvbnN0IHN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKKworICBib29sIGRlcHJlY2F0ZWQgPSBpbnRlcmZhY2UuSXNEZXByZWNhdGVkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjphbnlfb2YoaW50ZXJmYWNlLkdldE1ldGhvZHMoKS5iZWdpbigpLCBpbnRlcmZhY2UuR2V0TWV0aG9kcygpLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvJiBtKSB7IHJldHVybiBtLT5Jc0RlcHJlY2F0ZWQoKTsgfSk7CisgIGlmIChkZXByZWNhdGVkKSB7CisgICAgb3V0IDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaFxuIjsKKyAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkXCJcbiI7CisgICAgb3V0IDw8ICJcbiI7CisgIH0KKworICBvdXQuV3JpdGUoIiVzICVzOjpvblRyYW5zYWN0KHVpbnQzMl90ICVzLCBjb25zdCAlcyYgJXMsICVzKiAlcywgdWludDMyX3QgJXMpIHtcbiIsCisgICAgICAgICAgICBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIHFfbmFtZS5jX3N0cigpLCBrQ29kZVZhck5hbWUsIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwKKyAgICAgICAgICAgIGtEYXRhVmFyTmFtZSwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLCBrUmVwbHlWYXJOYW1lLCBrRmxhZ3NWYXJOYW1lKTsKKyAgb3V0LkluZGVudCgpOworICAvLyBEZWNsYXJlIHRoZSBzdGF0dXNfdCB2YXJpYWJsZQorICBvdXQuV3JpdGUoIiVzICVzID0gJXM7XG4iLCBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0FuZHJvaWRTdGF0dXNPayk7CisKKyAgLy8gQWRkIHRoZSBhbGwgaW1wb3J0YW50IHN3aXRjaCBzdGF0ZW1lbnQKKyAgb3V0LldyaXRlKCJzd2l0Y2ggKCVzKSB7XG4iLCBrQ29kZVZhck5hbWUpOworCisgIC8vIFRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBhIGNhc2Ugc3RhdGVtZW50IGZvciBlYWNoIHRyYW5zYWN0aW9uIGNvZGUuCisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgeworICAgIG91dC5Xcml0ZSgiY2FzZSAlczpcbiIsIEdldFRyYW5zYWN0aW9uSWRGb3IoYm5fbmFtZSwgKm1ldGhvZCkuY19zdHIoKSk7CisgICAgb3V0IDw8ICJ7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIEdlbmVyYXRlU2VydmVyVHJhbnNhY3Rpb24ob3V0LCBpbnRlcmZhY2UsICptZXRob2QsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdlbmVyYXRlU2VydmVyTWV0YVRyYW5zYWN0aW9uKG91dCwgaW50ZXJmYWNlLCAqbWV0aG9kLCBvcHRpb25zKTsKKyAgICB9CisgICAgb3V0LkRlZGVudCgpOworICAgIG91dCA8PCAifVxuIjsKKyAgICBvdXQgPDwgImJyZWFrO1xuIjsKKyAgfQorCisgIC8vIFRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBhIGRlZmF1bHQgY2FzZSB3aGljaCBkZWZlcnMgdG8gdGhlIHN1cGVyIGNsYXNzLgorICAvLyBUaGUgc3VwZXJjbGFzcyBoYW5kbGVzIGEgZmV3IHByZS1kZWZpbmVkIHRyYW5zYWN0aW9ucy4KKyAgb3V0IDw8ICJkZWZhdWx0OlxuIjsKKyAgb3V0IDw8ICJ7XG4iOworICBvdXQuV3JpdGUoIiAgJXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoJXMsICVzLCAlcywgJXMpO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLAorICAgICAgICAgICAga0NvZGVWYXJOYW1lLCBrRGF0YVZhck5hbWUsIGtSZXBseVZhck5hbWUsIGtGbGFnc1Zhck5hbWUpOworICBvdXQgPDwgIn1cbiI7CisgIG91dCA8PCAiYnJlYWs7XG4iOworICBvdXQgPDwgIn1cbiI7ICAvLyBzd2l0Y2gKKworICAvLyBJZiB3ZSBzYXcgYSBudWxsIHJlZmVyZW5jZSwgd2UgY2FuIG1hcCB0aGF0IHRvIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKyAgb3V0LldyaXRlKCJpZiAoJXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHtcbiIsIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSk7CisgIG91dC5Xcml0ZSgiICAlcyA9ICVzOjpmcm9tRXhjZXB0aW9uQ29kZSglczo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoJXMpO1xuIiwKKyAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwga0JpbmRlclN0YXR1c0xpdGVyYWwsIGtCaW5kZXJTdGF0dXNMaXRlcmFsLCBrUmVwbHlWYXJOYW1lKTsKKyAgb3V0LldyaXRlKCJ9XG4iKTsKKworICAvLyBGaW5hbGx5LCB0aGUgc2VydmVyJ3Mgb25UcmFuc2FjdCBtZXRob2QganVzdCByZXR1cm5zIGEgc3RhdHVzIGNvZGUuCisgIG91dC5Xcml0ZSgicmV0dXJuICVzO1xuIiwga0FuZHJvaWRTdGF0dXNWYXJOYW1lKTsKKworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKKyAgb3V0IDw8ICJcbiI7CisKKyAgaWYgKGRlcHJlY2F0ZWQpIHsKKyAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3BcbiI7CisgICAgb3V0IDw8ICJcbiI7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZVNlcnZlclNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVfbGlzdHsKICAgICAgIEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIsIGZhbHNlKSwKICAgICAgIGtQYXJjZWxIZWFkZXIsCkBAIC03MzIsMzI3ICs2MzcsMjk4IEBACiAgICAgaW5jbHVkZV9saXN0LmVtcGxhY2VfYmFjaygiY2hyb25vIik7CiAgICAgaW5jbHVkZV9saXN0LmVtcGxhY2VfYmFjaygiZnVuY3Rpb25hbCIpOwogICB9Ci0KLSAgdW5pcXVlX3B0cjxDb25zdHJ1Y3RvckltcGw+IGNvbnN0cnVjdG9ye25ldyBDb25zdHJ1Y3RvckltcGx7Ym5fbmFtZSwgQXJnTGlzdHt9LCB7fX19OwotCi0gIGlmIChpbnRlcmZhY2UuSXNWaW50ZlN0YWJpbGl0eSgpKSB7Ci0gICAgY29uc3RydWN0b3ItPkdldFN0YXRlbWVudEJsb2NrKCktPkFkZExpdGVyYWwoIjo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya1ZpbnRmKHRoaXMpIik7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3RydWN0b3ItPkdldFN0YXRlbWVudEJsb2NrKCktPkFkZExpdGVyYWwoCi0gICAgICAgICI6OmFuZHJvaWQ6OmludGVybmFsOjpTdGFiaWxpdHk6Om1hcmtDb21waWxhdGlvblVuaXQodGhpcykiKTsKKyAgZm9yIChjb25zdCBhdXRvJiBpbmNsdWRlIDogaW5jbHVkZV9saXN0KSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBpbmNsdWRlIDw8ICI+XG4iOwogICB9CisgIG91dCA8PCAiXG4iOwogCi0gIHVuaXF1ZV9wdHI8TWV0aG9kSW1wbD4gb25fdHJhbnNhY3R7Ci0gICAgICBuZXcgTWV0aG9kSW1wbHtrQW5kcm9pZFN0YXR1c0xpdGVyYWwsCi0gICAgICAgICAgICAgICAgICAgICBibl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIm9uVHJhbnNhY3QiLAotICAgICAgICAgICAgICAgICAgICAge30sCi0gICAgICAgICAgICAgICAgICAgICBBcmdMaXN0e3tTdHJpbmdQcmludGYoInVpbnQzMl90ICVzIiwga0NvZGVWYXJOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiY29uc3QgJXMmICVzIiwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLCBrRGF0YVZhck5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCIlcyogJXMiLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtSZXBseVZhck5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJ1aW50MzJfdCAlcyIsIGtGbGFnc1Zhck5hbWUpfX19fTsKLQotICAvLyBEZWNsYXJlIHRoZSBzdGF0dXNfdCB2YXJpYWJsZQotICBvbl90cmFuc2FjdC0+R2V0U3RhdGVtZW50QmxvY2soKS0+QWRkTGl0ZXJhbCgKLSAgICAgIFN0cmluZ1ByaW50ZigiJXMgJXMgPSAlcyIsIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgIGtBbmRyb2lkU3RhdHVzT2spKTsKLQotICAvLyBBZGQgdGhlIGFsbCBpbXBvcnRhbnQgc3dpdGNoIHN0YXRlbWVudCwgYnV0IHJldGFpbiBhIHBvaW50ZXIgdG8gaXQuCi0gIFN3aXRjaFN0YXRlbWVudCogcyA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnR7a0NvZGVWYXJOYW1lfTsKLSAgb25fdHJhbnNhY3QtPkdldFN0YXRlbWVudEJsb2NrKCktPkFkZFN0YXRlbWVudChzKTsKLQotICAvLyBUaGUgc3dpdGNoIHN0YXRlbWVudCBoYXMgYSBjYXNlIHN0YXRlbWVudCBmb3IgZWFjaCB0cmFuc2FjdGlvbiBjb2RlLgotICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKLSAgICBTdGF0ZW1lbnRCbG9jayogYiA9IHMtPkFkZENhc2UoR2V0VHJhbnNhY3Rpb25JZEZvcihpbnRlcmZhY2UsICptZXRob2QpKTsKLSAgICBpZiAoIWIpIHsgcmV0dXJuIG51bGxwdHI7IH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICAgIGlmIChtZXRob2QtPklzVXNlckRlZmluZWQoKSkgewotICAgICAgc3VjY2VzcyA9IEhhbmRsZVNlcnZlclRyYW5zYWN0aW9uKHR5cGVuYW1lcywgaW50ZXJmYWNlLCAqbWV0aG9kLCBvcHRpb25zLCBiKTsKLSAgICB9IGVsc2UgewotICAgICAgc3VjY2VzcyA9IEhhbmRsZVNlcnZlck1ldGFUcmFuc2FjdGlvbih0eXBlbmFtZXMsIGludGVyZmFjZSwgKm1ldGhvZCwgb3B0aW9ucywgYik7Ci0gICAgfQotICAgIGlmICghc3VjY2VzcykgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlIHN3aXRjaCBzdGF0ZW1lbnQgaGFzIGEgZGVmYXVsdCBjYXNlIHdoaWNoIGRlZmVycyB0byB0aGUgc3VwZXIgY2xhc3MuCi0gIC8vIFRoZSBzdXBlcmNsYXNzIGhhbmRsZXMgYSBmZXcgcHJlLWRlZmluZWQgdHJhbnNhY3Rpb25zLgotICBTdGF0ZW1lbnRCbG9jayogYiA9IHMtPkFkZENhc2UoIiIpOwotICBiLT5BZGRMaXRlcmFsKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiJXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoJXMsICVzLCAiCi0gICAgICAgICAgICAgICAgIiVzLCAlcykiLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtDb2RlVmFyTmFtZSwKLSAgICAgICAgICAgICAgICBrRGF0YVZhck5hbWUsIGtSZXBseVZhck5hbWUsIGtGbGFnc1Zhck5hbWUpKTsKLQotICAvLyBJZiB3ZSBzYXcgYSBudWxsIHJlZmVyZW5jZSwgd2UgY2FuIG1hcCB0aGF0IHRvIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLSAgSWZTdGF0ZW1lbnQqIG51bGxfY2hlY2sgPSBuZXcgSWZTdGF0ZW1lbnQoCi0gICAgICBuZXcgTGl0ZXJhbEV4cHJlc3Npb24oc3RyaW5nKGtBbmRyb2lkU3RhdHVzVmFyTmFtZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwiKSk7Ci0gIG9uX3RyYW5zYWN0LT5HZXRTdGF0ZW1lbnRCbG9jaygpLT5BZGRTdGF0ZW1lbnQobnVsbF9jaGVjayk7Ci0gIG51bGxfY2hlY2stPk9uVHJ1ZSgpLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICBTdHJpbmdQcmludGYoIiVzOjpmcm9tRXhjZXB0aW9uQ29kZSglczo6RVhfTlVMTF9QT0lOVEVSKSIKLSAgICAgICAgICAgICAgICAgICAiLndyaXRlVG9QYXJjZWwoJXMpIiwKLSAgICAgICAgICAgICAgICAgICBrQmluZGVyU3RhdHVzTGl0ZXJhbCwga0JpbmRlclN0YXR1c0xpdGVyYWwsCi0gICAgICAgICAgICAgICAgICAga1JlcGx5VmFyTmFtZSkpKTsKLQotICAvLyBGaW5hbGx5LCB0aGUgc2VydmVyJ3Mgb25UcmFuc2FjdCBtZXRob2QganVzdCByZXR1cm5zIGEgc3RhdHVzIGNvZGUuCi0gIG9uX3RyYW5zYWN0LT5HZXRTdGF0ZW1lbnRCbG9jaygpLT5BZGRMaXRlcmFsKAotICAgICAgU3RyaW5nUHJpbnRmKCJyZXR1cm4gJXMiLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpKTsKLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsczsKLSAgZGVjbHMucHVzaF9iYWNrKHN0ZDo6bW92ZShjb25zdHJ1Y3RvcikpOwotCi0gIGJvb2wgZGVwcmVjYXRlZCA9IGludGVyZmFjZS5Jc0RlcHJlY2F0ZWQoKSB8fAotICAgICAgICAgICAgICAgICAgICBzdGQ6OmFueV9vZihpbnRlcmZhY2UuR2V0TWV0aG9kcygpLmJlZ2luKCksIGludGVyZmFjZS5HZXRNZXRob2RzKCkuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIG0pIHsgcmV0dXJuIG0tPklzRGVwcmVjYXRlZCgpOyB9KTsKLSAgaWYgKGRlcHJlY2F0ZWQpIHsKLSAgICBkZWNscy5lbXBsYWNlX2JhY2soCi0gICAgICAgIG5ldyBMaXRlcmFsRGVjbCgiI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2hcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZGVwcmVjYXRlZFwiXG4iKSk7Ci0gIH0KLSAgZGVjbHMucHVzaF9iYWNrKHN0ZDo6bW92ZShvbl90cmFuc2FjdCkpOwotICBpZiAoZGVwcmVjYXRlZCkgewotICAgIGRlY2xzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3BcbiIpKTsKLSAgfQotCi0gIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJpbnQzMl90ICIgPDwgYm5fbmFtZSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKSB7XG4iCi0gICAgICAgICA8PCAiICByZXR1cm4gIiA8PCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpIDw8ICI6OlZFUlNJT047XG4iCi0gICAgICAgICA8PCAifVxuIjsKLSAgICBkZWNscy5lbXBsYWNlX2JhY2sobmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKTsKLSAgfQotICBpZiAoIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJzdGQ6OnN0cmluZyAiIDw8IGJuX25hbWUgPDwgIjo6IiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkge1xuIgotICAgICAgICAgPDwgIiAgcmV0dXJuICIgPDwgQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKSA8PCAiOjpIQVNIO1xuIgotICAgICAgICAgPDwgIn1cbiI7Ci0gICAgZGVjbHMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSk7Ci0gIH0KLQotICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIHN0cmluZyBjb2RlOwotICAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKLSAgICAoKndyaXRlcikgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiICsgYm5fbmFtZSArICI6OlRyYW5zYWN0aW9uTG9nJik+ICIgPDwgYm5fbmFtZQotICAgICAgICAgICAgICA8PCAiOjpsb2dGdW5jO1xuIjsKLSAgICB3cml0ZXItPkNsb3NlKCk7Ci0gICAgZGVjbHMucHVzaF9iYWNrKHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KG5ldyBMaXRlcmFsRGVjbChjb2RlKSkpOwotICB9Ci0gIHJldHVybiB1bmlxdWVfcHRyPERvY3VtZW50PnsKLSAgICAgIG5ldyBDcHBTb3VyY2V7aW5jbHVkZV9saXN0LCBOZXN0SW5OYW1lc3BhY2VzKHN0ZDo6bW92ZShkZWNscyksIGludGVyZmFjZS5HZXRTcGxpdFBhY2thZ2UoKSl9fTsKLX0KLQotdW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRJbnRlcmZhY2VTb3VyY2UoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVfbGlzdHsKLSAgICAgIEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlKSwKLSAgICAgIEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQsIGZhbHNlKSwKLSAgfTsKLQotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xzOwotCi0gIHVuaXF1ZV9wdHI8TWFjcm9EZWNsPiBtZXRhX2lmewotICAgICAgbmV3IE1hY3JvRGVjbHsiRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UiLAotICAgICAgICAgICAgICAgICAgICBBcmdMaXN0e3ZlY3RvcjxzdHJpbmc+e0NsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkJBU0UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyArIGludGVyZmFjZS5HZXREZXNjcmlwdG9yKCkgKyAnIid9fX19OwotICBkZWNscy5wdXNoX2JhY2soc3RkOjptb3ZlKG1ldGFfaWYpKTsKLQotICBCdWlsZENvbnN0YW50RGVmaW5pdGlvbnMoaW50ZXJmYWNlLCB0eXBlbmFtZXMsIHt9LCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHMpOwotCi0gIHJldHVybiB1bmlxdWVfcHRyPERvY3VtZW50PntuZXcgQ3BwU291cmNlewotICAgICAgaW5jbHVkZV9saXN0LAotICAgICAgTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoZGVjbHMpLCBpbnRlcmZhY2UuR2V0U3BsaXRQYWNrYWdlKCkpfX07Ci19Ci0KLXVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkQ2xpZW50SGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBjb25zdCBzdHJpbmcgaV9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKLSAgY29uc3Qgc3RyaW5nIGJwX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotCi0gIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzID0ge2tJQmluZGVySGVhZGVyLCBrSUludGVyZmFjZUhlYWRlciwgInV0aWxzL0Vycm9ycy5oIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UpfTsKLQotICB1bmlxdWVfcHRyPENvbnN0cnVjdG9yRGVjbD4gY29uc3RydWN0b3J7bmV3IENvbnN0cnVjdG9yRGVjbHsKLSAgICAgIGJwX25hbWUsCi0gICAgICBBcmdMaXN0e1N0cmluZ1ByaW50ZigiY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1wbFZhck5hbWUpfSwKLSAgICAgIENvbnN0cnVjdG9yRGVjbDo6SVNfRVhQTElDSVQKLSAgfX07Ci0gIHVuaXF1ZV9wdHI8Q29uc3RydWN0b3JEZWNsPiBkZXN0cnVjdG9ye25ldyBDb25zdHJ1Y3RvckRlY2x7Ci0gICAgICAifiIgKyBicF9uYW1lLAotICAgICAgQXJnTGlzdHt9LAotICAgICAgQ29uc3RydWN0b3JEZWNsOjpJU19WSVJUVUFMIHwgQ29uc3RydWN0b3JEZWNsOjpJU19ERUZBVUxUfX07Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwdWJsaWNzOwotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IHByaXZhdGVzOwotCi0gIHB1YmxpY3MucHVzaF9iYWNrKHN0ZDo6bW92ZShjb25zdHJ1Y3RvcikpOwotICBwdWJsaWNzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGVzdHJ1Y3RvcikpOwotCi0gIGZvciAoY29uc3QgYXV0byYgbWV0aG9kOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7Ci0gICAgaWYgKG1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSB7Ci0gICAgICBwdWJsaWNzLnB1c2hfYmFjayhCdWlsZE1ldGhvZERlY2woKm1ldGhvZCwgdHlwZW5hbWVzLCBmYWxzZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwdWJsaWNzLnB1c2hfYmFjayhCdWlsZE1ldGFNZXRob2REZWNsKCptZXRob2QsIHR5cGVuYW1lcywgb3B0aW9ucywgZmFsc2UpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIGluY2x1ZGVzLmVtcGxhY2VfYmFjaygiZnVuY3Rpb25hbCIpOyAgLy8gZm9yIHN0ZDo6ZnVuY3Rpb24KLSAgICBpbmNsdWRlcy5lbXBsYWNlX2JhY2soImFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oIik7Ci0KLSAgICBwdWJsaWNzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2x7a1RyYW5zYWN0aW9uTG9nU3RydWN0fSk7Ci0gICAgcHVibGljcy5lbXBsYWNlX2JhY2soCi0gICAgICAgIG5ldyBMaXRlcmFsRGVjbHsic3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFuc2FjdGlvbkxvZyYpPiBsb2dGdW5jO1xuIn0pOwotICB9Ci0KLSAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgIHByaXZhdGVzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woImludDMyX3QgY2FjaGVkX3ZlcnNpb25fID0gLTE7XG4iKSk7Ci0gIH0KLSAgaWYgKCFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgcHJpdmF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbCgic3RkOjpzdHJpbmcgY2FjaGVkX2hhc2hfID0gXCItMVwiO1xuIikpOwotICAgIHByaXZhdGVzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woInN0ZDo6bXV0ZXggY2FjaGVkX2hhc2hfbXV0ZXhfO1xuIikpOwotICB9Ci0KLSAgY29uc3Qgc3RyaW5nIGF0dHJpYnV0ZSA9IEdldERlcHJlY2F0ZWRBdHRyaWJ1dGUoaW50ZXJmYWNlKTsKLSAgdW5pcXVlX3B0cjxDbGFzc0RlY2w+IGJwX2NsYXNze25ldyBDbGFzc0RlY2x7Ci0gICAgICBicF9uYW1lLAotICAgICAgIjo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8IiArIGlfbmFtZSArICI+IiwKLSAgICAgIHt9LAotICAgICAgc3RkOjptb3ZlKHB1YmxpY3MpLAotICAgICAgc3RkOjptb3ZlKHByaXZhdGVzKSwKLSAgICAgIGF0dHJpYnV0ZSwKLSAgfX07Ci0KLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+ewotICAgICAgbmV3IENwcEhlYWRlcntpbmNsdWRlcywgTmVzdEluTmFtZXNwYWNlcyhzdGQ6Om1vdmUoYnBfY2xhc3MpLCBpbnRlcmZhY2UuR2V0U3BsaXRQYWNrYWdlKCkpfX07Ci19Ci0KLXVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkU2VydmVySGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIC8qIHR5cGVuYW1lcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBzdHJpbmcgaV9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKICAgY29uc3Qgc3RyaW5nIGJuX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworICBjb25zdCBzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlNFUlZFUik7CiAKLSAgdW5pcXVlX3B0cjxDb25zdHJ1Y3RvckRlY2w+IGNvbnN0cnVjdG9yewotICAgICAgbmV3IENvbnN0cnVjdG9yRGVjbHtibl9uYW1lLCBBcmdMaXN0e30sIENvbnN0cnVjdG9yRGVjbDo6SVNfRVhQTElDSVR9fTsKKyAgRW50ZXJOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIlxuIjsKIAotICB1bmlxdWVfcHRyPERlY2xhcmF0aW9uPiBvbl90cmFuc2FjdHtuZXcgTWV0aG9kRGVjbHsKLSAgICAgIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwgIm9uVHJhbnNhY3QiLAotICAgICAgQXJnTGlzdHt7U3RyaW5nUHJpbnRmKCJ1aW50MzJfdCAlcyIsIGtDb2RlVmFyTmFtZSksCi0gICAgICAgICAgICAgICBTdHJpbmdQcmludGYoImNvbnN0ICVzJiAlcyIsIGtBbmRyb2lkUGFyY2VsTGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVZhck5hbWUpLAotICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCIlcyogJXMiLCBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtSZXBseVZhck5hbWUpLAotICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJ1aW50MzJfdCAlcyIsIGtGbGFnc1Zhck5hbWUpfX0sCi0gICAgICBNZXRob2REZWNsOjpJU19PVkVSUklERQotICB9fTsKLSAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXMgPSB7ImJpbmRlci9JSW50ZXJmYWNlLmgiLCBIZWFkZXJGaWxlKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSl9OwotCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gcHVibGljczsKLSAgdmVjdG9yPHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBwcml2YXRlczsKLQotICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OXyIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgIDw8ICI6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAiIDw8IG1ldGhvZC0+R2V0SWQoKSA8PCAiO1xuIjsKLSAgICBwdWJsaWNzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPExpdGVyYWxEZWNsPihjb2RlLnN0cigpKSk7CisgIC8vIGNvbnN0cnVjdG9yCisgIG91dC5Xcml0ZSgiJXM6OiVzKClcbiIsIHFfbmFtZS5jX3N0cigpLCBibl9uYW1lLmNfc3RyKCkpOworICBvdXQgPDwgIntcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgaWYgKGludGVyZmFjZS5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKKyAgICBvdXQgPDwgIjo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya1ZpbnRmKHRoaXMpO1xuIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIjo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTtcbiI7CiAgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn1cbiI7CisgIG91dCA8PCAiXG4iOwogCi0gIHB1YmxpY3MucHVzaF9iYWNrKHN0ZDo6bW92ZShjb25zdHJ1Y3RvcikpOwotICBwdWJsaWNzLnB1c2hfYmFjayhzdGQ6Om1vdmUob25fdHJhbnNhY3QpKTsKKyAgR2VuZXJhdGVTZXJ2ZXJPblRyYW5zYWN0KG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOwogCiAgIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJpbnQzMl90ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIGZpbmFsO1xuIjsKLSAgICBwdWJsaWNzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOworICAgIG91dCA8PCAiaW50MzJfdCAiIDw8IHFfbmFtZSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKSB7XG4iCisgICAgICAgIDw8ICIgIHJldHVybiAiIDw8IGlfbmFtZSA8PCAiOjpWRVJTSU9OO1xuIgorICAgICAgICA8PCAifVxuIjsKICAgfQogICBpZiAoIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJzdGQ6OnN0cmluZyAiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKTtcbiI7Ci0gICAgcHVibGljcy5lbXBsYWNlX2JhY2sobmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKTsKKyAgICBvdXQgPDwgInN0ZDo6c3RyaW5nICIgPDwgcV9uYW1lIDw8ICI6OiIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpIHtcbiIKKyAgICAgICAgPDwgIiAgcmV0dXJuICIgPDwgaV9uYW1lIDw8ICI6OkhBU0g7XG4iCisgICAgICAgIDw8ICJ9XG4iOworICB9CisgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CisgICAgb3V0IDw8ICJzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgIiArIHFfbmFtZSArICI6OlRyYW5zYWN0aW9uTG9nJik+ICIgPDwgcV9uYW1lCisgICAgICAgIDw8ICI6OmxvZ0Z1bmM7XG4iOworICB9CisKKyAgTGVhdmVOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOworfQorCit2b2lkIEdlbmVyYXRlSW50ZXJmYWNlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmKSB7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UpIDw8ICI+XG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQsIGZhbHNlKSA8PCAiPlxuIjsKKworICBFbnRlck5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7CisKKyAgaWYgKGF1dG8gcGFyZW50ID0gaW50ZXJmYWNlLkdldFBhcmVudFR5cGUoKTsgcGFyZW50KSB7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX05FU1RFRF9JTlRFUkZBQ0Uoe30sIHt9LCBcInt9XCIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBHZXRRdWFsaWZpZWROYW1lKCpwYXJlbnQpLCBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpCQVNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLkdldERlc2NyaXB0b3IoKSk7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRSh7fSwgXCJ7fVwiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6QkFTRSksIGludGVyZmFjZS5HZXREZXNjcmlwdG9yKCkpOworICB9CisKKyAgR2VuZXJhdGVDb25zdGFudERlZmluaXRpb25zKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIC8qdGVtcGxhdGVfZGVjbD0qLyIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKSk7CisKKyAgTGVhdmVOYW1lc3BhY2Uob3V0LCBpbnRlcmZhY2UpOworfQorCit2b2lkIEdlbmVyYXRlQ2xpZW50Q2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RyaW5nIGJwX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpDTElFTlQpOworICBjb25zdCBzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOworCisgIG91dCA8PCAiY2xhc3MiOworICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIiAiIDw8IGJwX25hbWUgPDwgIiA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPCIgPDwgaWZhY2UgPDwgIj4ge1xuIjsKKyAgb3V0IDw8ICJwdWJsaWM6XG4iOworICBvdXQuSW5kZW50KCk7CisgIG91dCA8PCAiZXhwbGljaXQgIiA8PCBicF9uYW1lIDw8ICIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiAiIDw8IGtJbXBsVmFyTmFtZQorICAgICAgPDwgIik7XG4iOworICBvdXQgPDwgInZpcnR1YWwgfiIgPDwgYnBfbmFtZSA8PCAiKCkgPSBkZWZhdWx0O1xuIjsKKworICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIEdlbmVyYXRlTWV0aG9kRGVjbChvdXQsIHR5cGVuYW1lcywgKm1ldGhvZCwgLypjbGF6ej0qLyIiKTsKKyAgICAgIG91dCA8PCAiIG92ZXJyaWRlIjsKKyAgICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICptZXRob2QpOworICAgICAgb3V0IDw8ICI7XG4iOworICAgIH0gZWxzZSBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CisgICAgICBvdXQgPDwgImludDMyX3QgIiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiKCkgb3ZlcnJpZGU7XG4iOworICAgIH0gZWxzZSBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAic3RkOjpzdHJpbmcgIiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiKCkgb3ZlcnJpZGU7XG4iOworICAgIH0KICAgfQogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgaW5jbHVkZXMuZW1wbGFjZV9iYWNrKCJmdW5jdGlvbmFsIik7ICAvLyBmb3Igc3RkOjpmdW5jdGlvbgotICAgIGluY2x1ZGVzLmVtcGxhY2VfYmFjaygiYW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmgiKTsKLQotICAgIHB1YmxpY3MuZW1wbGFjZV9iYWNrKG5ldyBMaXRlcmFsRGVjbHtrVHJhbnNhY3Rpb25Mb2dTdHJ1Y3R9KTsKLSAgICBwdWJsaWNzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgbmV3IExpdGVyYWxEZWNseyJzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7XG4ifSk7CisgICAgb3V0IDw8IGtUcmFuc2FjdGlvbkxvZ1N0cnVjdDsKKyAgICBvdXQgPDwgInN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYztcbiI7CiAgIH0KLSAgY29uc3Qgc3RyaW5nIGF0dHJpYnV0ZSA9IEdldERlcHJlY2F0ZWRBdHRyaWJ1dGUoaW50ZXJmYWNlKTsKLSAgdW5pcXVlX3B0cjxDbGFzc0RlY2w+IGJuX2NsYXNze25ldyBDbGFzc0RlY2x7Ci0gICAgICBibl9uYW1lLAotICAgICAgIjo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8IiArIGlfbmFtZSArICI+IiwKLSAgICAgIHt9LAotICAgICAgc3RkOjptb3ZlKHB1YmxpY3MpLAotICAgICAgc3RkOjptb3ZlKHByaXZhdGVzKSwKLSAgICAgIGF0dHJpYnV0ZSwKLSAgfX07CisgIG91dC5EZWRlbnQoKTsKIAotICByZXR1cm4gdW5pcXVlX3B0cjxEb2N1bWVudD57Ci0gICAgICBuZXcgQ3BwSGVhZGVye2luY2x1ZGVzLCBOZXN0SW5OYW1lc3BhY2VzKHN0ZDo6bW92ZShibl9jbGFzcyksIGludGVyZmFjZS5HZXRTcGxpdFBhY2thZ2UoKSl9fTsKKyAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCB8fCAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCAicHJpdmF0ZTpcbiI7CisgICAgb3V0LkluZGVudCgpOworICAgIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICAgIG91dCA8PCAiaW50MzJfdCBjYWNoZWRfdmVyc2lvbl8gPSAtMTtcbiI7CisgICAgfQorICAgIGlmICghb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJzdGQ6OnN0cmluZyBjYWNoZWRfaGFzaF8gPSBcIi0xXCI7XG4iOworICAgICAgb3V0IDw8ICJzdGQ6Om11dGV4IGNhY2hlZF9oYXNoX211dGV4XztcbiI7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgfQorCisgIG91dCA8PCAifTsgIC8vIGNsYXNzICIgPDwgYnBfbmFtZSA8PCAiXG4iOwogfQogCi11bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZEludGVyZmFjZUhlYWRlcihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgc2V0PHN0cmluZz4gaW5jbHVkZXMgPSB7a0lCaW5kZXJIZWFkZXIsIGtJSW50ZXJmYWNlSGVhZGVyLCBrU3RhdHVzSGVhZGVyLCBrU3Ryb25nUG9pbnRlckhlYWRlcn07Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBhcmd1bWVudCA6IG1ldGhvZC0+R2V0QXJndW1lbnRzKCkpIHsKLSAgICAgIEFkZEhlYWRlcnMoYXJndW1lbnQtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCAmaW5jbHVkZXMpOwotICAgIH0KLQotICAgIEFkZEhlYWRlcnMobWV0aG9kLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgJmluY2x1ZGVzKTsKK3ZvaWQgR2VuZXJhdGVDbGllbnRIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuXG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IGtJQmluZGVySGVhZGVyIDw8ICI+XG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IGtJSW50ZXJmYWNlSGVhZGVyIDw8ICI+XG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPCIgPDwgSGVhZGVyRmlsZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UpIDw8ICI+XG4iOworICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgeworICAgIG91dCA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+XG4iOyAgLy8gZm9yIHN0ZDo6ZnVuY3Rpb24KKyAgICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD5cbiI7CiAgIH0KKyAgb3V0IDw8ICJcbiI7CisgIEVudGVyTmFtZXNwYWNlKG91dCwgaW50ZXJmYWNlKTsKKyAgR2VuZXJhdGVDbGllbnRDbGFzc0RlY2wob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIExlYXZlTmFtZXNwYWNlKG91dCwgaW50ZXJmYWNlKTsKK30KIAotICBjb25zdCBzdHJpbmcgaV9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKLSAgY29uc3Qgc3RyaW5nIGF0dHJpYnV0ZSA9IEdldERlcHJlY2F0ZWRBdHRyaWJ1dGUoaW50ZXJmYWNlKTsKLSAgdW5pcXVlX3B0cjxDbGFzc0RlY2w+IGlmX2NsYXNze25ldyBDbGFzc0RlY2x7aV9uYW1lLCAiOjphbmRyb2lkOjpJSW50ZXJmYWNlIiwge30sIGF0dHJpYnV0ZX19OwotICBpZl9jbGFzcy0+QWRkUHVibGljKHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+e25ldyBNYWNyb0RlY2x7Ci0gICAgICAiREVDTEFSRV9NRVRBX0lOVEVSRkFDRSIsCi0gICAgICBBcmdMaXN0e3ZlY3RvcjxzdHJpbmc+e0NsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkJBU0UpfX19fSk7Cit2b2lkIEdlbmVyYXRlU2VydmVyQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RyaW5nIGJuX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpTRVJWRVIpOworICBjb25zdCBzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogCisgIG91dCA8PCAiY2xhc3MiOworICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIiAiIDw8IGJuX25hbWUgPDwgIiA6IHB1YmxpYyAiCisgICAgICA8PCAiOjphbmRyb2lkOjpCbkludGVyZmFjZTwiIDw8IGlmYWNlIDw8ICI+IHtcbiI7CisgIG91dCA8PCAicHVibGljOlxuIjsKKyAgb3V0LkluZGVudCgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKKyAgICBvdXQgPDwgInN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fIiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiID0gIgorICAgICAgICA8PCAiOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgIiA8PCBzdGQ6OnRvX3N0cmluZyhtZXRob2QtPkdldElkKCkpCisgICAgICAgIDw8ICI7XG4iOworICB9CisgIG91dCA8PCAiZXhwbGljaXQgIiA8PCBibl9uYW1lIDw8ICIoKTtcbiI7CisgIG91dCA8PCBmbXQ6OmZvcm1hdCgie30gb25UcmFuc2FjdCh1aW50MzJfdCB7fSwgY29uc3Qge30mIHt9LCB7fSoge30sIHVpbnQzMl90IHt9KSBvdmVycmlkZTtcbiIsCisgICAgICAgICAgICAgICAgICAgICBrQW5kcm9pZFN0YXR1c0xpdGVyYWwsIGtDb2RlVmFyTmFtZSwga0FuZHJvaWRQYXJjZWxMaXRlcmFsLCBrRGF0YVZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICBrQW5kcm9pZFBhcmNlbExpdGVyYWwsIGtSZXBseVZhck5hbWUsIGtGbGFnc1Zhck5hbWUpOwogICBpZiAob3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gICAgY29kZSA8PCAiY29uc3QgaW50MzJfdCBWRVJTSU9OID0gIiA8PCBvcHRpb25zLlZlcnNpb24oKSA8PCAiO1xuIjsKLQotICAgIGlmX2NsYXNzLT5BZGRQdWJsaWModW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4obmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKSk7CisgICAgb3V0IDw8ICJpbnQzMl90ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpO1xuIjsKICAgfQogICBpZiAoIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICBjb2RlIDw8ICJjb25zdCBzdGQ6OnN0cmluZyBIQVNIID0gXCIiIDw8IG9wdGlvbnMuSGFzaCgpIDw8ICJcIjtcbiI7Ci0KLSAgICBpZl9jbGFzcy0+QWRkUHVibGljKHVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+KG5ldyBMaXRlcmFsRGVjbChjb2RlLnN0cigpKSkpOworICAgIG91dCA8PCAic3RkOjpzdHJpbmcgIiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCk7XG4iOwogICB9Ci0KLSAgQnVpbGRDb25zdGFudERlY2xhcmF0aW9ucyhpbnRlcmZhY2UsIHR5cGVuYW1lcywgaWZfY2xhc3MsIGluY2x1ZGVzKTsKLQotICBpZiAob3B0aW9ucy5HZW5UcmFjZXMoKSkgewotICAgIGluY2x1ZGVzLmluc2VydChrVHJhY2VIZWFkZXIpOworICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgeworICAgIG91dCA8PCBrVHJhbnNhY3Rpb25Mb2dTdHJ1Y3Q7CisgICAgb3V0IDw8ICJzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7XG4iOwogICB9CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9OyAgLy8gY2xhc3MgIiA8PCBibl9uYW1lIDw8ICJcblxuIjsKIAotICBpZiAoIWludGVyZmFjZS5HZXRNZXRob2RzKCkuZW1wdHkoKSkgewotICAgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaW50ZXJmYWNlLkdldE1ldGhvZHMoKSkgewotICAgICAgaWYgKG1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSB7Ci0gICAgICAgIC8vIEVhY2ggbWV0aG9kIGdldHMgYW4gZW51bSBlbnRyeSBhbmQgcHVyZSB2aXJ0dWFsIGRlY2xhcmF0aW9uLgotICAgICAgICBpZl9jbGFzcy0+QWRkUHVibGljKEJ1aWxkTWV0aG9kRGVjbCgqbWV0aG9kLCB0eXBlbmFtZXMsIHRydWUpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmX2NsYXNzLT5BZGRQdWJsaWMoQnVpbGRNZXRhTWV0aG9kRGVjbCgqbWV0aG9kLCB0eXBlbmFtZXMsIG9wdGlvbnMsIHRydWUpKTsKKyAgc3RkOjpzdHJpbmcgZF9uYW1lID0gQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6REVMRUdBVE9SX0lNUEwpOworICBvdXQgPDwgImNsYXNzIjsKKyAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgaW50ZXJmYWNlKTsKKyAgb3V0IDw8ICIgIiA8PCBkX25hbWUgPDwgIiA6IHB1YmxpYyAiIDw8IGJuX25hbWUgPDwgIiB7XG4iOworICBvdXQgPDwgInB1YmxpYzpcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgb3V0IDw8ICJleHBsaWNpdCAiIDw8IGRfbmFtZSA8PCAiKCIgPDwgU3RyaW5nUHJpbnRmKCI6OmFuZHJvaWQ6OnNwPCVzPiAmaW1wbCIsIGlmYWNlLmNfc3RyKCkpCisgICAgICA8PCAiKSAiIDw8IFN0cmluZ1ByaW50ZigiOiAlcyhpbXBsKSIsIGtEZWxlZ2F0ZUltcGxWYXJOYW1lKSA8PCAiIHt9XG5cbiI7CisKKyAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7CisgICAgaWYgKG1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSB7CisgICAgICBHZW5lcmF0ZU1ldGhvZERlY2wob3V0LCB0eXBlbmFtZXMsICptZXRob2QsIC8qY2xheno9Ki8iIik7CisgICAgICBvdXQgPDwgIiBvdmVycmlkZSI7CisgICAgICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCAqbWV0aG9kKTsKKworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IG1ldGhvZC0+R2V0QXJndW1lbnRzKCkpIHsKKyAgICAgICAgaWYgKElzTm9uQ29weWFibGVUeXBlKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpKSB7CisgICAgICAgICAgYXJncy5wdXNoX2JhY2soU3RyaW5nUHJpbnRmKCJzdGQ6Om1vdmUoJXMpIiwgYXJnLT5HZXROYW1lKCkuY19zdHIoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKGFyZy0+R2V0TmFtZSgpKTsKKyAgICAgICAgfQogICAgICAgfQorICAgICAgaWYgKG1ldGhvZC0+R2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKKyAgICAgICAgYXJncy5wdXNoX2JhY2soa1JldHVyblZhck5hbWUpOworICAgICAgfQorICAgICAgb3V0IDw8ICIge1xuIgorICAgICAgICAgIDw8ICIgIHJldHVybiAiIDw8IGtEZWxlZ2F0ZUltcGxWYXJOYW1lIDw8ICItPiIgPDwgbWV0aG9kLT5HZXROYW1lKCkgPDwgIigiCisgICAgICAgICAgPDwgYmFzZTo6Sm9pbihhcmdzLCAiLCAiKSA8PCAiKTtcbiI7CisgICAgICBvdXQgPDwgIn1cbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSkgeworICAgICAgb3V0IDw8ICJpbnQzMl90ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIgorICAgICAgICAgIDw8ICIgb3ZlcnJpZGUge1xuIjsKKyAgICAgIG91dC5JbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiaW50MzJfdCBfZGVsZWdhdG9yX3ZlciA9ICIgPDwgYm5fbmFtZSA8PCAiOjoiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKTtcbiI7CisgICAgICBvdXQgPDwgImludDMyX3QgX2ltcGxfdmVyID0gIiA8PCBrRGVsZWdhdGVJbXBsVmFyTmFtZSA8PCAiLT4iIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uCisgICAgICAgICAgPDwgIigpO1xuIjsKKyAgICAgIG91dCA8PCAicmV0dXJuIF9kZWxlZ2F0b3JfdmVyIDwgX2ltcGxfdmVyID8gX2RlbGVnYXRvcl92ZXIgOiBfaW1wbF92ZXI7XG4iOworICAgICAgb3V0LkRlZGVudCgpOworICAgICAgb3V0IDw8ICJ9XG4iOworICAgIH0gZWxzZSBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAic3RkOjpzdHJpbmcgIiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkiCisgICAgICAgICAgPDwgIiBvdmVycmlkZSB7XG4iOworICAgICAgb3V0IDw8ICIgIHJldHVybiAiIDw8IGtEZWxlZ2F0ZUltcGxWYXJOYW1lIDw8ICItPiIgPDwga0dldEludGVyZmFjZUhhc2ggPDwgIigpO1xuIjsKKyAgICAgIG91dCA8PCAifVxuIjsKICAgICB9CiAgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgInByaXZhdGU6XG4iOworICBvdXQuSW5kZW50KCk7CisgIG91dCA8PCAiOjphbmRyb2lkOjpzcDwiIDw8IGlmYWNlIDw8ICI+ICIgPDwga0RlbGVnYXRlSW1wbFZhck5hbWUgPDwgIjtcbiI7CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9OyAgLy8gY2xhc3MgIiA8PCBkX25hbWUgPDwgIlxuIjsKK30KKwordm9pZCBHZW5lcmF0ZVNlcnZlckhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+XG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IEhlYWRlckZpbGUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlKSA8PCAiPlxuIjsKKyAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKKyAgICBvdXQgPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPlxuIjsgIC8vIGZvciBzdGQ6OmZ1bmN0aW9uCisgICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+XG4iOworICB9CisgIG91dCA8PCAiXG4iOworICBFbnRlck5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7CisgIEdlbmVyYXRlU2VydmVyQ2xhc3NEZWNsKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICBMZWF2ZU5hbWVzcGFjZShvdXQsIGludGVyZmFjZSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKwordm9pZCBHZW5lcmF0ZU5lc3RlZFR5cGVEZWNscyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGF1dG8gdmlzaXQgPSBbJl0oY29uc3QgYXV0byYgbmVzdGVkKSB7IEdlbmVyYXRlQ2xhc3NEZWNsKG91dCwgbmVzdGVkLCB0eXBlbmFtZXMsIG9wdGlvbnMpOyB9OworICBBSURMX0ZBVEFMX0lGKCFUb3BvbG9naWNhbFZpc2l0KHR5cGUuR2V0TmVzdGVkVHlwZXMoKSwgdmlzaXQpLCB0eXBlKSA8PCAiQ3ljbGUgZGV0ZWN0ZWQuIjsKK30KKwordm9pZCBHZW5lcmF0ZUludGVyZmFjZUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGNvbnN0IHN0cmluZyBpX25hbWUgPSBDbGFzc05hbWUoaW50ZXJmYWNlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOworCisgIG91dCA8PCAiY2xhc3MiOworICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIiAiIDw8IGlfbmFtZSA8PCAiIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7XG4iOworICBvdXQgPDwgInB1YmxpYzpcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgb3V0IDw8ICJERUNMQVJFX01FVEFfSU5URVJGQUNFKCIgPDwgQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6QkFTRSkgPDwgIilcbiI7CisgIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICBvdXQgPDwgImNvbnN0IGludDMyX3QgVkVSU0lPTiA9ICIgPDwgc3RkOjp0b19zdHJpbmcob3B0aW9ucy5WZXJzaW9uKCkpIDw8ICI7XG4iOworICB9CisgIGlmICghb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCAiY29uc3Qgc3RkOjpzdHJpbmcgSEFTSCA9IFwiIiA8PCBvcHRpb25zLkhhc2goKSA8PCAiXCI7XG4iOworICB9CisgIEdlbmVyYXRlTmVzdGVkVHlwZURlY2xzKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMpOworICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS5HZXRNZXRob2RzKCkpIHsKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIG91dCA8PCAidmlydHVhbCAiOworICAgICAgR2VuZXJhdGVNZXRob2REZWNsKG91dCwgdHlwZW5hbWVzLCAqbWV0aG9kLCAvKmNsYXp6PSovIiIpOworICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKm1ldGhvZCk7CisgICAgICBvdXQgPDwgIiA9IDA7XG4iOworICAgIH0gZWxzZSBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CisgICAgICBvdXQgPDwgInZpcnR1YWwgaW50MzJfdCAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoKSA9IDA7XG4iOworICAgIH0gZWxzZSBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAidmlydHVhbCBzdGQ6OnN0cmluZyAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoKSA9IDA7XG4iOworICAgIH0KKyAgfQorICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifTsgIC8vIGNsYXNzICIgPDwgaV9uYW1lIDw8ICJcbiI7CisgIG91dCA8PCAiXG4iOwogCiAgIC8vIEltcGxlbWVudCB0aGUgZGVmYXVsdCBpbXBsIGNsYXNzLgotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IG1ldGhvZF9kZWNsczsKKyAgY29uc3Qgc3RyaW5nIGRlZmF1bHRfaW1wbCA9IENsYXNzTmFtZShpbnRlcmZhY2UsIENsYXNzTmFtZXM6OkRFRkFVTFRfSU1QTCk7CisgIG91dCA8PCAiY2xhc3MiOworICBHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBpbnRlcmZhY2UpOworICBvdXQgPDwgIiAiIDw8IGRlZmF1bHRfaW1wbCA8PCAiIDogcHVibGljICIgPDwgaV9uYW1lIDw8ICIge1xuIjsKKyAgb3V0IDw8ICJwdWJsaWM6XG4iOworICBvdXQuSW5kZW50KCk7CiAgIC8vIG9uQXNCaW5kZXIgcmV0dXJucyBudWxscHRyIGFzIHRoaXMgaW50ZXJmYWNlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYQogICAvLyByZWFsIGJpbmRlci4KLSAgbWV0aG9kX2RlY2xzLmVtcGxhY2VfYmFjaygKLSAgICAgIG5ldyBMaXRlcmFsRGVjbCgiOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUge1xuIgotICAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBudWxscHRyO1xuIgotICAgICAgICAgICAgICAgICAgICAgICJ9XG4iKSk7CisgIG91dCA8PCAiOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUge1xuIgorICAgICAgPDwgIiAgcmV0dXJuIG51bGxwdHI7XG4iCisgICAgICA8PCAifVxuIjsKKwogICAvLyBFYWNoIGludGVyZmFjZSBtZXRob2QgYnkgZGVmYXVsdCByZXR1cm5zIFVOS05PV05fVFJBTlNBQ1RJT04gd2l0aCBpcwogICAvLyB0aGUgc2FtZSBzdGF0dXMgdGhhdCBpcyByZXR1cm5lZCBieSB0cmFuc2FjdCgpIHdoZW4gdGhlIG1ldGhvZCBpcwogICAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIHNlcnZlciBzaWRlLiBJbiBvdGhlciB3b3JkcywgdGhlc2UgZGVmYXVsdApAQCAtMTA2MCwxMTcgKzkzNiw4MSBAQAogICAvLyBpbXBsIGNsYXNzIHdpdGhvdXQgaGF2aW5nIHRvIG92ZXJyaWRlIGFsbCBtZXRob2RzIGluIGFuIGludGVyZmFjZS4KICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBpbnRlcmZhY2UuR2V0TWV0aG9kcygpKSB7CiAgICAgaWYgKG1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSB7Ci0gICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgICAgIGNvZGUgPDwgIjo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgIiA8PCBtZXRob2QtPkdldE5hbWUoKQotICAgICAgICAgICA8PCBCdWlsZEFyZ0xpc3QodHlwZW5hbWVzLCAqbWV0aG9kLCB0cnVlLCB0cnVlKS5Ub1N0cmluZygpIDw8ICIgb3ZlcnJpZGUiOwotICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKGNvZGUsICptZXRob2QpOwotICAgICAgY29kZSA8PCAiIHtcbiIKLSAgICAgICAgICAgPDwgIiAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7XG4iCi0gICAgICAgICAgIDw8ICJ9XG4iOwotICAgICAgbWV0aG9kX2RlY2xzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7Ci0gICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgICAgICBjb2RlIDw8ICJpbnQzMl90ICIgPDwga0dldEludGVyZmFjZVZlcnNpb24gPDwgIigpIG92ZXJyaWRlIHtcbiIKLSAgICAgICAgICAgICA8PCAiICByZXR1cm4gMDtcbiIKLSAgICAgICAgICAgICA8PCAifVxuIjsKLSAgICAgICAgbWV0aG9kX2RlY2xzLmVtcGxhY2VfYmFjayhuZXcgTGl0ZXJhbERlY2woY29kZS5zdHIoKSkpOwotICAgICAgfQotICAgICAgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgICAgICBjb2RlIDw8ICJzdGQ6OnN0cmluZyAiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSBvdmVycmlkZSB7XG4iCi0gICAgICAgICAgICAgPDwgIiAgcmV0dXJuIFwiXCI7XG4iCi0gICAgICAgICAgICAgPDwgIn1cbiI7Ci0gICAgICAgIG1ldGhvZF9kZWNscy5lbXBsYWNlX2JhY2sobmV3IExpdGVyYWxEZWNsKGNvZGUuc3RyKCkpKTsKLSAgICAgIH0KKyAgICAgIG91dCA8PCAiOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyAiIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoIgorICAgICAgICAgIDw8IEdlbmVyYXRlQXJnTGlzdCh0eXBlbmFtZXMsICptZXRob2QsIC8qZm9yX2RlY2xhcmF0aW9uPSovdHJ1ZSwgLyp0eXBlX25hbWVfb25seT0qL3RydWUpCisgICAgICAgICAgPDwgIikgb3ZlcnJpZGUiOworICAgICAgR2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKm1ldGhvZCk7CisgICAgICBvdXQgPDwgIiB7XG4iCisgICAgICAgICAgPDwgIiAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7XG4iCisgICAgICAgICAgPDwgIn1cbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICAgIG91dCA8PCAiaW50MzJfdCAiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKSBvdmVycmlkZSB7XG4iCisgICAgICAgICAgPDwgIiAgcmV0dXJuIDA7XG4iCisgICAgICAgICAgPDwgIn1cbiI7CisgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJzdGQ6OnN0cmluZyAiIDw8IGtHZXRJbnRlcmZhY2VIYXNoIDw8ICIoKSBvdmVycmlkZSB7XG4iCisgICAgICAgICAgPDwgIiAgcmV0dXJuIFwiXCI7XG4iCisgICAgICAgICAgPDwgIn1cbiI7CiAgICAgfQogICB9CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9OyAgLy8gY2xhc3MgIiA8PCBkZWZhdWx0X2ltcGwgPDwgIlxuIjsKIAotICB2ZWN0b3I8dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xzOwotICBkZWNscy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGlmX2NsYXNzKSk7Ci0gIGRlY2xzLmVtcGxhY2VfYmFjayhuZXcgQ2xhc3NEZWNsewotICAgICAgQ2xhc3NOYW1lKGludGVyZmFjZSwgQ2xhc3NOYW1lczo6REVGQVVMVF9JTVBMKSwKLSAgICAgIGlfbmFtZSwKLSAgICAgIHt9LAotICAgICAgc3RkOjptb3ZlKG1ldGhvZF9kZWNscyksCi0gICAgICB7fSwKLSAgICAgIGF0dHJpYnV0ZSwgIC8vIGluaGVyaXRzIHRoZSBzYW1lIGF0dHJpYnV0ZXMKLSAgfSk7Ci0KLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+ewotICAgICAgbmV3IENwcEhlYWRlcnt2ZWN0b3I8c3RyaW5nPihpbmNsdWRlcy5iZWdpbigpLCBpbmNsdWRlcy5lbmQoKSksCi0gICAgICAgICAgICAgICAgICAgIE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGRlY2xzKSwgaW50ZXJmYWNlLkdldFNwbGl0UGFja2FnZSgpKX19OwotfQotCi1zdHJpbmcgR2V0SW5pdGlhbGl6ZXIoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdmFyaWFibGUpIHsKLSAgc3RyaW5nIGNwcFR5cGUgPSBDcHBOYW1lT2YodmFyaWFibGUuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotICByZXR1cm4gY3BwVHlwZSArICIoIiArIHZhcmlhYmxlLlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpICsgIikiOwotfQotCi12b2lkIEFkZFR5cGVTcGVjaWZpY0hlYWRlcnMoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpbmNsdWRlcykgewotICBpbmNsdWRlcy5pbnNlcnQoInR1cGxlIik7ICAvLyBzdGQ6OnRpZSBpbiBjb21wYXJpc29uIG9wZXJhdG9ycwotfQotCi12b2lkIEJ1aWxkUmVhZEZyb21QYXJjZWwoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBwYXJjZWwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRCbG9jayogcmVhZF9ibG9jaykgewotICByZWFkX2Jsb2NrLT5BZGRMaXRlcmFsKAotICAgICAgU3RyaW5nUHJpbnRmKCIlcyAlcyA9ICVzIiwga0FuZHJvaWRTdGF0dXNMaXRlcmFsLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsIGtBbmRyb2lkU3RhdHVzT2spKTsKLQotICByZWFkX2Jsb2NrLT5BZGRMaXRlcmFsKAotICAgICAgIltbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7XG4iCi0gICAgICAiaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoKTtcbiIKLSAgICAgICJpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTtcbiIKLSAgICAgICJbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAiCi0gICAgICAic3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTtcbiIKLSAgICAgICJpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTtcbiIsCi0gICAgICAvKmFkZF9zZW1pY29sb249Ki9mYWxzZSk7Ci0KLSAgYXV0byBjaGVja0F2YWlsYWJsZURhdGEgPSBTdHJpbmdQcmludGYoCi0gICAgICAiaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7XG4iCi0gICAgICAiICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIgotICAgICAgIiAgcmV0dXJuICVzO1xuIgotICAgICAgIn1cbiIsCi0gICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpOwotCi0gIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwuR2V0RmllbGRzKCkpIHsKLSAgICByZWFkX2Jsb2NrLT5BZGRMaXRlcmFsKGNoZWNrQXZhaWxhYmxlRGF0YSwgLyphZGRfc2VtaWNvbG9uPSovZmFsc2UpOwotICAgIHN0cmluZyBtZXRob2QgPSBQYXJjZWxSZWFkTWV0aG9kT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICByZWFkX2Jsb2NrLT5BZGRTdGF0ZW1lbnQobmV3IEFzc2lnbm1lbnQoCi0gICAgICAgIGtBbmRyb2lkU3RhdHVzVmFyTmFtZSwgbmV3IE1ldGhvZENhbGwoU3RyaW5nUHJpbnRmKCJfYWlkbF9wYXJjZWwtPiVzIiwgbWV0aG9kLmNfc3RyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbFJlYWRDYXN0T2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiYiICsgdmFyaWFibGUtPkdldE5hbWUoKSkpKSk7Ci0gICAgcmVhZF9ibG9jay0+QWRkU3RhdGVtZW50KFJldHVybk9uU3RhdHVzTm90T2soKSk7CisgIC8vIFdoZW4gYW4gaW50ZXJmYWNlIGlzIG5lc3RlZCwgZXZlcnkgY2xhc3Mgc2hvdWxkIGJlIGRlZmluZWQgdG9nZXRoZXIgaGVyZQorICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgc2VwYXJhdGUgaGVhZGVycyBmb3IgdGhlbS4KKyAgLy8gKGUuZy4gSUZvbywgSUZvb0RlZmF1bHQsIEJwRm9vLCBCbkZvbywgSUZvb0RlbGVnYXRvcikKKyAgaWYgKGludGVyZmFjZS5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICBHZW5lcmF0ZUNsaWVudENsYXNzRGVjbChvdXQsIGludGVyZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICBHZW5lcmF0ZVNlcnZlckNsYXNzRGVjbChvdXQsIGludGVyZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKICAgfQotICByZWFkX2Jsb2NrLT5BZGRMaXRlcmFsKCJfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIik7Ci0gIHJlYWRfYmxvY2stPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCJyZXR1cm4gJXMiLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpKTsKIH0KIAotdm9pZCBCdWlsZFdyaXRlVG9QYXJjZWwoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBwYXJjZWwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudEJsb2NrKiB3cml0ZV9ibG9jaykgewotICB3cml0ZV9ibG9jay0+QWRkTGl0ZXJhbCgKLSAgICAgIFN0cmluZ1ByaW50ZigiJXMgJXMgPSAlcyIsIGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCwga0FuZHJvaWRTdGF0dXNWYXJOYW1lLCBrQW5kcm9pZFN0YXR1c09rKSk7Cit2b2lkIEdlbmVyYXRlUmVhZEZyb21QYXJjZWwoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgb3V0IDw8ICI6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LO1xuIjsKKyAgb3V0IDw8ICJzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTtcbiI7CisgIG91dCA8PCAiaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDtcbiI7CisgIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTtcbiI7CisgIG91dCA8PCAiaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkge1xuIjsKKyAgb3V0IDw8ICIgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIjsKKyAgb3V0IDw8ICJ9XG4iOworICBvdXQgPDwgImlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFO1xuIjsKKyAgb3V0IDw8ICJzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTtcbiI7CisgIG91dCA8PCAiaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7XG4iOworICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLkdldEZpZWxkcygpKSB7CisgICAgc3RyaW5nIG1ldGhvZCA9IFBhcmNlbFJlYWRNZXRob2RPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgIHN0cmluZyBhcmcgPSBQYXJjZWxSZWFkQ2FzdE9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgIiYiICsgdmFyaWFibGUtPkdldE5hbWUoKSk7CisgICAgb3V0IDw8ICJpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHtcbiI7CisgICAgb3V0IDw8ICIgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7XG4iOworICAgIG91dCA8PCAiICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1cztcbiI7CisgICAgb3V0IDw8ICJ9XG4iOworICAgIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+IiA8PCBtZXRob2QgPDwgIigiIDw8IGFyZyA8PCAiKTtcbiI7CisgICAgb3V0IDw8ICJpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7XG4iOworICAgIG91dCA8PCAiICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1cztcbiI7CisgICAgb3V0IDw8ICJ9XG4iOworICB9CisgIG91dCA8PCAiX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiI7CisgIG91dCA8PCAicmV0dXJuIF9haWRsX3JldF9zdGF0dXM7XG4iOworfQogCi0gIHdyaXRlX2Jsb2NrLT5BZGRMaXRlcmFsKAotICAgICAgImF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTtcbiIKLSAgICAgICJfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7XG4iLAotICAgICAgLyphZGRfc2VtaWNvbG9uPSovZmFsc2UpOwotCit2b2lkIEdlbmVyYXRlV3JpdGVUb1BhcmNlbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CisgIG91dCA8PCAiOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSztcbiI7CisgIG91dCA8PCAiYXV0byBfYWlkbF9zdGFydF9wb3MgPSAiIDw8IGtQYXJjZWxWYXJOYW1lIDw8ICItPmRhdGFQb3NpdGlvbigpO1xuIjsKKyAgb3V0IDw8IGtQYXJjZWxWYXJOYW1lIDw8ICItPndyaXRlSW50MzIoMCk7XG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLkdldEZpZWxkcygpKSB7CiAgICAgc3RyaW5nIG1ldGhvZCA9IFBhcmNlbFdyaXRlTWV0aG9kT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKTsKLSAgICB3cml0ZV9ibG9jay0+QWRkU3RhdGVtZW50KG5ldyBBc3NpZ25tZW50KAotICAgICAgICBrQW5kcm9pZFN0YXR1c1Zhck5hbWUsCi0gICAgICAgIG5ldyBNZXRob2RDYWxsKFN0cmluZ1ByaW50ZigiX2FpZGxfcGFyY2VsLT4lcyIsIG1ldGhvZC5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsV3JpdGVDYXN0T2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCB2YXJpYWJsZS0+R2V0TmFtZSgpKSkpKTsKLSAgICB3cml0ZV9ibG9jay0+QWRkU3RhdGVtZW50KFJldHVybk9uU3RhdHVzTm90T2soKSk7CisgICAgc3RyaW5nIGFyZyA9IFBhcmNlbFdyaXRlQ2FzdE9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgdmFyaWFibGUtPkdldE5hbWUoKSk7CisgICAgb3V0IDw8ICJfYWlkbF9yZXRfc3RhdHVzID0gIiA8PCBrUGFyY2VsVmFyTmFtZSA8PCAiLT4iIDw8IG1ldGhvZCA8PCAiKCIgPDwgYXJnIDw8ICIpO1xuIjsKKyAgICBvdXQgPDwgImlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHtcbiI7CisgICAgb3V0IDw8ICIgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIjsKKyAgICBvdXQgPDwgIn1cbiI7CiAgIH0KLQotICB3cml0ZV9ibG9jay0+QWRkTGl0ZXJhbCgKLSAgICAgICJhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpO1xuIgotICAgICAgIl9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7XG4iCi0gICAgICAiX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpO1xuIgotICAgICAgIl9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpO1xuIiwKLSAgICAgIC8qYWRkX3NlbWljb2xvbj0qL2ZhbHNlKTsKLSAgd3JpdGVfYmxvY2stPkFkZExpdGVyYWwoU3RyaW5nUHJpbnRmKCJyZXR1cm4gJXMiLCBrQW5kcm9pZFN0YXR1c1Zhck5hbWUpKTsKKyAgb3V0IDw8ICJhdXRvIF9haWRsX2VuZF9wb3MgPSAiIDw8IGtQYXJjZWxWYXJOYW1lIDw8ICItPmRhdGFQb3NpdGlvbigpO1xuIjsKKyAgb3V0IDw8IGtQYXJjZWxWYXJOYW1lIDw8ICItPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpO1xuIjsKKyAgb3V0IDw8IGtQYXJjZWxWYXJOYW1lIDw8ICItPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7XG4iOworICBvdXQgPDwga1BhcmNlbFZhck5hbWUgPDwgIi0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpO1xuIjsKKyAgb3V0IDw8ICJyZXR1cm4gX2FpZGxfcmV0X3N0YXR1cztcbiI7CiB9CiAKIFBhcmNlbFdyaXRlckNvbnRleHQgR2V0UGFyY2VsV3JpdGVyQ29udGV4dChjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKQEAgLTExOTEsMzgyICsxMDMxLDE1NyBAQAogICB9OwogfQogCi12b2lkIEFkZFR5cGVTcGVjaWZpY0hlYWRlcnMoY29uc3QgQWlkbFVuaW9uRGVjbCYsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgaW5jbHVkZXMpIHsKLSAgaW5jbHVkZXMuaW5zZXJ0KHN0ZDo6YmVnaW4oVW5pb25Xcml0ZXI6OmhlYWRlcnMpLCBzdGQ6OmVuZChVbmlvbldyaXRlcjo6aGVhZGVycykpOwotfQotCi12b2lkIEJ1aWxkUmVhZEZyb21QYXJjZWwoY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVjbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudEJsb2NrKiByZWFkX2Jsb2NrKSB7Ci0gIHN0cmluZyBib2R5Owordm9pZCBHZW5lcmF0ZVJlYWRGcm9tUGFyY2VsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKICAgVW5pb25Xcml0ZXIgdXd7ZGVjbCwgdHlwZW5hbWVzLCAmQ3BwTmFtZU9mLCAmQ29uc3RhbnRWYWx1ZURlY29yYXRvcn07Ci0gIHV3LlJlYWRGcm9tUGFyY2VsKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmJvZHkpLCBHZXRQYXJjZWxXcml0ZXJDb250ZXh0KHR5cGVuYW1lcykpOwotICByZWFkX2Jsb2NrLT5BZGRMaXRlcmFsKGJvZHksIC8qYWRkX3NlbWljb2xvbj0qL2ZhbHNlKTsKKyAgdXcuUmVhZEZyb21QYXJjZWwob3V0LCBHZXRQYXJjZWxXcml0ZXJDb250ZXh0KHR5cGVuYW1lcykpOwogfQogCi12b2lkIEJ1aWxkV3JpdGVUb1BhcmNlbChjb25zdCBBaWRsVW5pb25EZWNsJiBkZWNsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRCbG9jayogd3JpdGVfYmxvY2spIHsKLSAgc3RyaW5nIGJvZHk7Cit2b2lkIEdlbmVyYXRlV3JpdGVUb1BhcmNlbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKICAgVW5pb25Xcml0ZXIgdXd7ZGVjbCwgdHlwZW5hbWVzLCAmQ3BwTmFtZU9mLCAmQ29uc3RhbnRWYWx1ZURlY29yYXRvcn07Ci0gIHV3LldyaXRlVG9QYXJjZWwoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmYm9keSksIEdldFBhcmNlbFdyaXRlckNvbnRleHQodHlwZW5hbWVzKSk7Ci0gIHdyaXRlX2Jsb2NrLT5BZGRMaXRlcmFsKGJvZHksIC8qYWRkX3NlbWljb2xvbj0qL2ZhbHNlKTsKKyAgdXcuV3JpdGVUb1BhcmNlbChvdXQsIEdldFBhcmNlbFdyaXRlckNvbnRleHQodHlwZW5hbWVzKSk7CiB9CiAKLXZvaWQgQnVpbGRQYXJjZWxGaWVsZHMoQ2xhc3NEZWNsJiBjbGF6eiwgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBkZWNsLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3ZvaWQgR2VuZXJhdGVQYXJjZWxGaWVsZHMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogZGVjbC5HZXRGaWVsZHMoKSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgc3RkOjpzdHJpbmcgY3BwVHlwZSA9IENwcE5hbWVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOwotICAgIG91dCA8PCBjcHBUeXBlOworICAgIGNvbnN0IGF1dG8mIHR5cGUgPSB2YXJpYWJsZS0+R2V0VHlwZSgpOworICAgIHN0ZDo6c3RyaW5nIGNwcF90eXBlID0gQ3BwTmFtZU9mKHR5cGUsIHR5cGVuYW1lcyk7CisgICAgb3V0IDw8IGNwcF90eXBlOwogICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICp2YXJpYWJsZSk7Ci0gICAgb3V0IDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpLmNfc3RyKCk7CisgICAgb3V0IDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpOwogICAgIGlmICh2YXJpYWJsZS0+R2V0RGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgIG91dCA8PCAiID0gIiA8PCBHZXRJbml0aWFsaXplcih0eXBlbmFtZXMsICp2YXJpYWJsZSk7Ci0gICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+R2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiUGFyY2VsYWJsZUhvbGRlciIpIHsKLSAgICAgIGlmIChkZWNsLklzVmludGZTdGFiaWxpdHkoKSkgewotICAgICAgICBvdXQgPDwgIiB7IDo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5OjpTVEFCSUxJVFlfVklOVEYgfSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiB7IDo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5OjpTVEFCSUxJVFlfTE9DQUwgfSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdXRvIHR5cGUgPSB2YXJpYWJsZS0+R2V0VHlwZSgpLkdldERlZmluZWRUeXBlKCk7IHR5cGUpIHsKLSAgICAgIGlmIChhdXRvIGVudW1fdHlwZSA9IHR5cGUtPkFzRW51bURlY2xhcmF0aW9uKCk7IGVudW1fdHlwZSkgewotICAgICAgICBpZiAoIXZhcmlhYmxlLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7Ci0gICAgICAgICAgLy8gaWYgYW4gZW51bSBkb2Vzbid0IGhhdmUgZXhwbGljaXQgZGVmYXVsdCB2YWx1ZSwgZG8gemVyby1pbml0aWFsaXphdGlvbgotICAgICAgICAgIG91dCA8PCAiID0gIiA8PCBjcHBUeXBlIDw8ICIoMCkiOworICAgICAgb3V0IDw8ICIgPSAiIDw8IHZhcmlhYmxlLT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU29tZSB0eXBlcyBuZWVkcyB0byBiZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGV2ZW4gd2hlbiBubyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KKyAgICAgIC8vIC0gUGFyY2VsYWJsZUhvbGRlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzdGFiaWxpdHkKKyAgICAgIC8vIC0gZW51bSBzaG91bGQgYmUgemVybyBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGluZGV0ZXJtaW5hdGUKKyAgICAgIC8vIC0gZml4ZWQtc2l6ZSBhcnJheXMgc2hvdWxkIGJlIGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHZhbHVlIHdpbGwgYmUgaW5kZXRlcm1pbmF0ZQorICAgICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIikgeworICAgICAgICBpZiAoZGVjbC5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiB7IDo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5OjpTVEFCSUxJVFlfVklOVEYgfSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIgeyA6OmFuZHJvaWQ6OlBhcmNlbGFibGU6OlN0YWJpbGl0eTo6U1RBQklMSVRZX0xPQ0FMIH0iOwogICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGVuYW1lcy5HZXRFbnVtRGVjbGFyYXRpb24odHlwZSkgJiYgIXR5cGUuSXNBcnJheSgpKSB7CisgICAgICAgIG91dCA8PCAiID0gIiA8PCBjcHBfdHlwZSA8PCAiKDApIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS5Jc0ZpeGVkU2l6ZUFycmF5KCkgJiYgIXR5cGUuSXNOdWxsYWJsZSgpKSB7CisgICAgICAgIG91dCA8PCAiID0ge3t9fSI7CiAgICAgICB9CiAgICAgfQogICAgIG91dCA8PCAiO1xuIjsKLQotICAgIGNsYXp6LkFkZFB1YmxpYyhzdGQ6OnVuaXF1ZV9wdHI8TGl0ZXJhbERlY2w+KG5ldyBMaXRlcmFsRGVjbChvdXQuc3RyKCkpKSk7CiAgIH0KIH0KIAotdm9pZCBCdWlsZFBhcmNlbEZpZWxkcyhDbGFzc0RlY2wmIGNsYXp6LCBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWNsLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3ZvaWQgR2VuZXJhdGVQYXJjZWxGaWVsZHMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKICAgVW5pb25Xcml0ZXIgdXd7ZGVjbCwgdHlwZW5hbWVzLCAmQ3BwTmFtZU9mLCAmQ29uc3RhbnRWYWx1ZURlY29yYXRvcn07Ci0gIHN0cmluZyBwdWJsaWNfZmllbGRzOwotICBzdHJpbmcgcHJpdmF0ZV9maWVsZHM7Ci0gIHV3LlB1YmxpY0ZpZWxkcygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZwdWJsaWNfZmllbGRzKSk7Ci0gIHV3LlByaXZhdGVGaWVsZHMoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmcHJpdmF0ZV9maWVsZHMpKTsKLSAgY2xhenouQWRkUHVibGljKHN0ZDo6bWFrZV91bmlxdWU8TGl0ZXJhbERlY2w+KHB1YmxpY19maWVsZHMpKTsKLSAgY2xhenouQWRkUHJpdmF0ZShzdGQ6Om1ha2VfdW5pcXVlPExpdGVyYWxEZWNsPihwcml2YXRlX2ZpZWxkcykpOworICB1dy5QdWJsaWNGaWVsZHMob3V0KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFBhcmNlbGFibGVUeXBlPgotc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiBCdWlsZFBhcmNlbEhlYWRlcihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbGFibGVUeXBlJiBwYXJjZWwsIGNvbnN0IE9wdGlvbnMmKSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdHlwZV9wYXJhbXMgPQotICAgICAgcGFyY2VsLklzR2VuZXJpYygpID8gcGFyY2VsLkdldFR5cGVQYXJhbWV0ZXJzKCkgOiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXR0cmlidXRlID0gR2V0RGVwcmVjYXRlZEF0dHJpYnV0ZShwYXJjZWwpOwotICB1bmlxdWVfcHRyPENsYXNzRGVjbD4gcGFyY2VsX2NsYXNzewotICAgICAgbmV3IENsYXNzRGVjbHtwYXJjZWwuR2V0TmFtZSgpLCAiOjphbmRyb2lkOjpQYXJjZWxhYmxlIiwgdHlwZV9wYXJhbXMsIGF0dHJpYnV0ZX19Owordm9pZCBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFBhcmNlbGFibGVUeXBlJiBwYXJjZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdHJpbmcgY2xhenogPSBwYXJjZWwuR2V0TmFtZSgpOwogCi0gIHNldDxzdHJpbmc+IGluY2x1ZGVzID0ge2tTdGF0dXNIZWFkZXIsIGtQYXJjZWxIZWFkZXIsIGtTdHJpbmcxNkhlYWRlcn07Ci0gIEFkZFR5cGVTcGVjaWZpY0hlYWRlcnMocGFyY2VsLCBpbmNsdWRlcyk7CisgIG91dCA8PCBUZW1wbGF0ZURlY2wocGFyY2VsKTsKKyAgb3V0IDw8ICJjbGFzcyI7CisgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsIHBhcmNlbCk7CisgIG91dCA8PCAiICIgPDwgY2xhenogPDwgIiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUge1xuIjsKKyAgb3V0IDw8ICJwdWJsaWM6XG4iOworICBvdXQuSW5kZW50KCk7CiAKLSAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IHBhcmNlbC5HZXRGaWVsZHMoKSkgewotICAgIEFkZEhlYWRlcnModmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCAmaW5jbHVkZXMpOwotICB9Ci0KLSAgc3RyaW5nIG9wZXJhdG9yX2NvZGU7Ci0gIEdlbmVyYXRlUGFyY2VsYWJsZUNvbXBhcmlzb25PcGVyYXRvcnMoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmb3BlcmF0b3JfY29kZSksIHBhcmNlbCk7Ci0gIHBhcmNlbF9jbGFzcy0+QWRkUHVibGljKHN0ZDo6bWFrZV91bmlxdWU8TGl0ZXJhbERlY2w+KG9wZXJhdG9yX2NvZGUpKTsKLQotICBCdWlsZFBhcmNlbEZpZWxkcygqcGFyY2VsX2NsYXNzLCBwYXJjZWwsIHR5cGVuYW1lcyk7Ci0gIEJ1aWxkQ29uc3RhbnREZWNsYXJhdGlvbnMocGFyY2VsLCB0eXBlbmFtZXMsIHBhcmNlbF9jbGFzcywgaW5jbHVkZXMpOworICBHZW5lcmF0ZU5lc3RlZFR5cGVEZWNscyhvdXQsIHBhcmNlbCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgR2VuZXJhdGVQYXJjZWxGaWVsZHMob3V0LCBwYXJjZWwsIHR5cGVuYW1lcyk7CisgIEdlbmVyYXRlUGFyY2VsYWJsZUNvbXBhcmlzb25PcGVyYXRvcnMob3V0LCBwYXJjZWwpOworICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKG91dCwgcGFyY2VsLCB0eXBlbmFtZXMpOwogCiAgIGlmIChwYXJjZWwuSXNWaW50ZlN0YWJpbGl0eSgpKSB7Ci0gICAgcGFyY2VsX2NsYXNzLT5BZGRQdWJsaWMoc3RkOjp1bmlxdWVfcHRyPExpdGVyYWxEZWNsPigKLSAgICAgICAgbmV3IExpdGVyYWxEZWNsKCI6OmFuZHJvaWQ6OlBhcmNlbGFibGU6OlN0YWJpbGl0eSBnZXRTdGFiaWxpdHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiOjphbmRyb2lkOjpQYXJjZWxhYmxlOjpTdGFiaWxpdHk6OlNUQUJJTElUWV9WSU5URjsgfVxuIikpKTsKKyAgICBvdXQgPDwgIjo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5IGdldFN0YWJpbGl0eSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICIKKyAgICAgICAgICAgIjo6YW5kcm9pZDo6UGFyY2VsYWJsZTo6U3RhYmlsaXR5OjpTVEFCSUxJVFlfVklOVEY7IH1cbiI7CiAgIH0KIAotICB1bmlxdWVfcHRyPE1ldGhvZERlY2w+IHJlYWQobmV3IE1ldGhvZERlY2woa0FuZHJvaWRTdGF0dXNMaXRlcmFsLCAicmVhZEZyb21QYXJjZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdCgiY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbDo6SVNfRklOQUwpKTsKLSAgcGFyY2VsX2NsYXNzLT5BZGRQdWJsaWMoc3RkOjptb3ZlKHJlYWQpKTsKLSAgdW5pcXVlX3B0cjxNZXRob2REZWNsPiB3cml0ZShuZXcgTWV0aG9kRGVjbChrQW5kcm9pZFN0YXR1c0xpdGVyYWwsICJ3cml0ZVRvUGFyY2VsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0KCI6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbDo6SVNfQ09OU1QgfCBNZXRob2REZWNsOjpJU19GSU5BTCkpOwotICBwYXJjZWxfY2xhc3MtPkFkZFB1YmxpYyhzdGQ6Om1vdmUod3JpdGUpKTsKKyAgb3V0IDw8IGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCA8PCAiIHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsO1xuIjsKKyAgb3V0IDw8IGtBbmRyb2lkU3RhdHVzTGl0ZXJhbCA8PCAiIHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7XG4iOwogCi0gIHBhcmNlbF9jbGFzcy0+QWRkUHVibGljKHN0ZDo6dW5pcXVlX3B0cjxMaXRlcmFsRGVjbD4oCi0gICAgICBuZXcgTGl0ZXJhbERlY2woU3RyaW5nUHJpbnRmKCJzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodVwiJXNcIik7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBERVNDSVBUT1I7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWwuR2V0Q2Fub25pY2FsTmFtZSgpLmNfc3RyKCkpKSkpOworICBjb25zdCBzdHJpbmcgY2Fub25pY2FsX25hbWUgPSBwYXJjZWwuR2V0Q2Fub25pY2FsTmFtZSgpOworICBvdXQgPDwgInN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHtcbiIKKyAgICAgIDw8ICIgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodVwiIiA8PCBjYW5vbmljYWxfbmFtZSA8PCAiXCIpO1xuIgorICAgICAgPDwgIiAgcmV0dXJuIERFU0NJUFRPUjtcbiIKKyAgICAgIDw8ICJ9XG4iOwogCi0gIC8vIHRvU3RyaW5nKCkgbWV0aG9kCi0gIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmgiKTsKLSAgc3RyaW5nIHRvX3N0cmluZzsKLSAgR2VuZXJhdGVUb1N0cmluZygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZ0b19zdHJpbmcpLCBwYXJjZWwpOwotICBwYXJjZWxfY2xhc3MtPkFkZFB1YmxpYyhzdGQ6Om1ha2VfdW5pcXVlPExpdGVyYWxEZWNsPih0b19zdHJpbmcpKTsKKyAgR2VuZXJhdGVUb1N0cmluZyhvdXQsIHBhcmNlbCk7CiAKLSAgYXV0byBkZWNscyA9IE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKHBhcmNlbF9jbGFzcyksIHBhcmNlbC5HZXRTcGxpdFBhY2thZ2UoKSk7Ci0gIC8vIFRPRE8oYi8zMTU1OTA5NSkgYmlvbmljIG9uIGhvc3Qgc2hvdWxkIGRlZmluZSB0aGlzCi0gIGlmIChwYXJjZWwuQXNVbmlvbkRlY2xhcmF0aW9uKCkpIHsKLSAgICBkZWNscy5pbnNlcnQoZGVjbHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxMaXRlcmFsRGVjbD4oCi0gICAgICAgICAgICAgICAgICAgICAiI2lmbmRlZiBfX0JJT05JQ19fXG4jZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMClcbiNlbmRpZlxuXG4iKSk7CisgIG91dC5EZWRlbnQoKTsKKworICBpZiAoYXV0byBkZWNsID0gQWlkbENhc3Q8QWlkbFVuaW9uRGVjbD4ocGFyY2VsKTsgZGVjbCkgeworICAgIG91dCA8PCAicHJpdmF0ZTpcbiI7CisgICAgb3V0LkluZGVudCgpOworICAgIFVuaW9uV3JpdGVyIHV3eypkZWNsLCB0eXBlbmFtZXMsICZDcHBOYW1lT2YsICZDb25zdGFudFZhbHVlRGVjb3JhdG9yfTsKKyAgICB1dy5Qcml2YXRlRmllbGRzKG91dCk7CisgICAgb3V0LkRlZGVudCgpOwogICB9Ci0gIHJldHVybiB1bmlxdWVfcHRyPERvY3VtZW50PnsKLSAgICAgIG5ldyBDcHBIZWFkZXJ7dmVjdG9yPHN0cmluZz4oaW5jbHVkZXMuYmVnaW4oKSwgaW5jbHVkZXMuZW5kKCkpLCBzdGQ6Om1vdmUoZGVjbHMpfX07CisKKyAgb3V0IDw8ICJ9OyAgLy8gY2xhc3MgIiA8PCBjbGF6eiA8PCAiXG4iOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRQYXJjZWxTb3VyY2UoY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBUJiBwYXJjZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmKSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdHlwZV9wYXJhbXMgPQotICAgICAgcGFyY2VsLklzR2VuZXJpYygpID8gcGFyY2VsLkdldFR5cGVQYXJhbWV0ZXJzKCkgOiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKLSAgYXV0byByZWFkID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8TWV0aG9kSW1wbD4oa0FuZHJvaWRTdGF0dXNMaXRlcmFsLCBwYXJjZWwuR2V0TmFtZSgpLCAicmVhZEZyb21QYXJjZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3BhcmFtcywgQXJnTGlzdCgiY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCIpKTsKLSAgQnVpbGRSZWFkRnJvbVBhcmNlbChwYXJjZWwsIHR5cGVuYW1lcywgcmVhZC0+R2V0U3RhdGVtZW50QmxvY2soKSk7Cit2b2lkIEdlbmVyYXRlUGFyY2VsU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgVCYgcGFyY2VsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmKSB7CisgIHN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKHBhcmNlbCk7CisgIGlmIChwYXJjZWwuSXNHZW5lcmljKCkpIHsKKyAgICBxX25hbWUgKz0gIjwiICsgSm9pbihwYXJjZWwuR2V0VHlwZVBhcmFtZXRlcnMoKSwgIiwiKSArICI+IjsKKyAgfQogCi0gIGF1dG8gd3JpdGUgPSBzdGQ6Om1ha2VfdW5pcXVlPE1ldGhvZEltcGw+KAotICAgICAga0FuZHJvaWRTdGF0dXNMaXRlcmFsLCBwYXJjZWwuR2V0TmFtZSgpLCAid3JpdGVUb1BhcmNlbCIsIHR5cGVfcGFyYW1zLAotICAgICAgQXJnTGlzdCgiOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCIpLCB0cnVlIC8qY29uc3QqLyk7Ci0gIEJ1aWxkV3JpdGVUb1BhcmNlbChwYXJjZWwsIHR5cGVuYW1lcywgd3JpdGUtPkdldFN0YXRlbWVudEJsb2NrKCkpOworICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IENwcEhlYWRlckZvclR5cGUocGFyY2VsKSA8PCAiPlxuXG4iOwogCi0gIHZlY3Rvcjx1bmlxdWVfcHRyPERlY2xhcmF0aW9uPj4gZmlsZV9kZWNsczsKLSAgQnVpbGRDb25zdGFudERlZmluaXRpb25zKHBhcmNlbCwgdHlwZW5hbWVzLCB0eXBlX3BhcmFtcywgcGFyY2VsLkdldE5hbWUoKSwgZmlsZV9kZWNscyk7Ci0gIGZpbGVfZGVjbHMucHVzaF9iYWNrKHN0ZDo6bW92ZShyZWFkKSk7Ci0gIGZpbGVfZGVjbHMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3cml0ZSkpOworICBFbnRlck5hbWVzcGFjZShvdXQsIHBhcmNlbCk7CisgIEdlbmVyYXRlQ29uc3RhbnREZWZpbml0aW9ucyhvdXQsIHBhcmNlbCwgdHlwZW5hbWVzLCBUZW1wbGF0ZURlY2wocGFyY2VsKSwgcV9uYW1lKTsKIAotICBzZXQ8c3RyaW5nPiBpbmNsdWRlcyA9IHt9OwotICBBZGRIZWFkZXJzKHBhcmNlbCwgJmluY2x1ZGVzKTsKKyAgb3V0IDw8IFRlbXBsYXRlRGVjbChwYXJjZWwpOworICBvdXQgPDwgIjo6YW5kcm9pZDo6c3RhdHVzX3QgIiA8PCBxX25hbWUgPDwgIjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqICIKKyAgICAgIDw8IGtQYXJjZWxWYXJOYW1lIDw8ICIpIHtcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgR2VuZXJhdGVSZWFkRnJvbVBhcmNlbChvdXQsIHBhcmNlbCwgdHlwZW5hbWVzKTsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn1cbiI7CiAKLSAgcmV0dXJuIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+ewotICAgICAgbmV3IENwcFNvdXJjZXt2ZWN0b3I8c3RyaW5nPihpbmNsdWRlcy5iZWdpbigpLCBpbmNsdWRlcy5lbmQoKSksCi0gICAgICAgICAgICAgICAgICAgIE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGZpbGVfZGVjbHMpLCBwYXJjZWwuR2V0U3BsaXRQYWNrYWdlKCkpfX07CisgIG91dCA8PCBUZW1wbGF0ZURlY2wocGFyY2VsKTsKKyAgb3V0IDw8ICI6OmFuZHJvaWQ6OnN0YXR1c190ICIgPDwgcV9uYW1lIDw8ICI6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqICIgPDwga1BhcmNlbFZhck5hbWUKKyAgICAgIDw8ICIpIGNvbnN0IHtcbiI7CisgIG91dC5JbmRlbnQoKTsKKyAgR2VuZXJhdGVXcml0ZVRvUGFyY2VsKG91dCwgcGFyY2VsLCB0eXBlbmFtZXMpOworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKKyAgTGVhdmVOYW1lc3BhY2Uob3V0LCBwYXJjZWwpOwogfQogCi1zdGQ6OnN0cmluZyBHZW5lcmF0ZUVudW1Ub1N0cmluZyhjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gIGNvZGUgPDwgIltbbm9kaXNjYXJkXV0iOwotICBHZW5lcmF0ZURlcHJlY2F0ZWQoY29kZSwgZW51bV9kZWNsKTsKLSAgY29kZSA8PCAiIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICIgdmFsKSI7Ci0gIGNvZGUgPDwgIiB7XG4iOwotICBjb2RlIDw8ICIgIHN3aXRjaCh2YWwpIHtcbiI7Ci0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1bmlxdWVfY2FzZXM7Ci0gIGZvciAoY29uc3QgYXV0byYgZW51bWVyYXRvciA6IGVudW1fZGVjbC5HZXRFbnVtZXJhdG9ycygpKSB7Ci0gICAgc3RkOjpzdHJpbmcgYyA9IGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKLSAgICAvLyBPbmx5IGFkZCBhIGNhc2UgaWYgaXRzIHZhbHVlIGhhcyBub3QgeWV0IGJlZW4gdXNlZCBpbiB0aGUgc3dpdGNoCi0gICAgLy8gc3RhdGVtZW50LiBDKysgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgY2FzZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgYnV0Ci0gICAgLy8gZW51bXMgZG9lcyBhbGxvdyB0aGlzLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgZmlyc3QgZGVjbGFyZWQKLSAgICAvLyBlbnVtZXJhdG9yIHdpdGggdGhlIGdpdmVuIHZhbHVlIGlzIHByaW50ZWQuCi0gICAgaWYgKHVuaXF1ZV9jYXNlcy5jb3VudChjKSA9PSAwKSB7Ci0gICAgICB1bmlxdWVfY2FzZXMuaW5zZXJ0KGMpOwotICAgICAgY29kZSA8PCAiICBjYXNlICIgPDwgZW51bV9kZWNsLkdldE5hbWUoKSA8PCAiOjoiIDw8IGVudW1lcmF0b3ItPkdldE5hbWUoKSA8PCAiOlxuIjsKLSAgICAgIGNvZGUgPDwgIiAgICByZXR1cm4gXCIiIDw8IGVudW1lcmF0b3ItPkdldE5hbWUoKSA8PCAiXCI7XG4iOwotICAgIH0KLSAgfQotICBjb2RlIDw8ICIgIGRlZmF1bHQ6XG4iOwotICBjb2RlIDw8ICIgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PCIKLSAgICAgICA8PCBDcHBOYW1lT2YoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIHR5cGVuYW1lcykgPDwgIj4odmFsKSk7XG4iOwotICBjb2RlIDw8ICIgIH1cbiI7Ci0gIGNvZGUgPDwgIn1cbiI7Ci0gIHJldHVybiBjb2RlLnN0cigpOwordm9pZCBHZW5lcmF0ZUVudW1DbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgY3BwOjpHZW5lcmF0ZUVudW1DbGFzc0RlY2wob3V0LCBlbnVtX2RlY2wsIENwcE5hbWVPZihlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgdHlwZW5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQnVpbGRFbnVtSGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgewotICBjb25zdCBzdGQ6OnN0cmluZyBhdHRyaWJ1dGUgPSBHZXREZXByZWNhdGVkQXR0cmlidXRlKGVudW1fZGVjbCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxFbnVtPiBnZW5lcmF0ZWRfZW51bXtuZXcgRW51bXsKLSAgICAgIGVudW1fZGVjbC5HZXROYW1lKCksIENwcE5hbWVPZihlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgdHlwZW5hbWVzKSwgdHJ1ZSwgYXR0cmlidXRlfX07Ci0gIGZvciAoY29uc3QgYXV0byYgZW51bWVyYXRvciA6IGVudW1fZGVjbC5HZXRFbnVtZXJhdG9ycygpKSB7Ci0gICAgZ2VuZXJhdGVkX2VudW0tPkFkZFZhbHVlKAotICAgICAgICBlbnVtZXJhdG9yLT5HZXROYW1lKCksCi0gICAgICAgIGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7Cit2b2lkIEdlbmVyYXRlQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBpZmFjZSA9IEFpZGxDYXN0PEFpZGxJbnRlcmZhY2U+KGRlZmluZWRfdHlwZSk7IGlmYWNlKSB7CisgICAgR2VuZXJhdGVJbnRlcmZhY2VDbGFzc0RlY2wob3V0LCAqaWZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgR2VuZXJhdGVQYXJjZWxDbGFzc0RlY2wob3V0LCAqcGFyY2VsYWJsZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIHVuaW9uX2RlY2wgPSBBaWRsQ2FzdDxBaWRsVW5pb25EZWNsPihkZWZpbmVkX3R5cGUpOyB1bmlvbl9kZWNsKSB7CisgICAgR2VuZXJhdGVQYXJjZWxDbGFzc0RlY2wob3V0LCAqdW5pb25fZGVjbCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIGVudW1fZGVjbCA9IEFpZGxDYXN0PEFpZGxFbnVtRGVjbGFyYXRpb24+KGRlZmluZWRfdHlwZSk7IGVudW1fZGVjbCkgeworICAgIEdlbmVyYXRlRW51bUNsYXNzRGVjbChvdXQsICplbnVtX2RlY2wsIHR5cGVuYW1lcyk7CisgIH0gZWxzZSB7CisgICAgQUlETF9GQVRBTChkZWZpbmVkX3R5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSBzZW50IGZvciBDUFAgZ2VuZXJhdGlvbi4iOwogICB9Ci0KLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGluY2x1ZGVzID0gewotICAgICAgImFycmF5IiwKLSAgICAgICJiaW5kZXIvRW51bXMuaCIsCi0gICAgICAic3RyaW5nIiwKLSAgfTsKLSAgQWRkSGVhZGVycyhlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgdHlwZW5hbWVzLCAmaW5jbHVkZXMpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZWNsYXJhdGlvbj4+IGRlY2xzMTsKLSAgZGVjbHMxLnB1c2hfYmFjayhzdGQ6Om1vdmUoZ2VuZXJhdGVkX2VudW0pKTsKLSAgZGVjbHMxLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPExpdGVyYWxEZWNsPihHZW5lcmF0ZUVudW1Ub1N0cmluZyh0eXBlbmFtZXMsIGVudW1fZGVjbCkpKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGVjbGFyYXRpb24+PiBkZWNsczI7Ci0gIGRlY2xzMi5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxMaXRlcmFsRGVjbD4oR2VuZXJhdGVFbnVtVmFsdWVzKGVudW1fZGVjbCwgeyIifSkpKTsKLQotICByZXR1cm4gdW5pcXVlX3B0cjxEb2N1bWVudD57Ci0gICAgICBuZXcgQ3BwSGVhZGVye3ZlY3RvcjxzdHJpbmc+KGluY2x1ZGVzLmJlZ2luKCksIGluY2x1ZGVzLmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgQXBwZW5kKE5lc3RJbk5hbWVzcGFjZXMoc3RkOjptb3ZlKGRlY2xzMSksIGVudW1fZGVjbC5HZXRTcGxpdFBhY2thZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0SW5OYW1lc3BhY2VzKHN0ZDo6bW92ZShkZWNsczIpLCB7ImFuZHJvaWQiLCAiaW50ZXJuYWwifSkpfX07Ci19Ci0KLWJvb2wgV3JpdGVIZWFkZXIoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICBDbGFzc05hbWVzIGhlYWRlcl90eXBlKSB7Ci0gIHVuaXF1ZV9wdHI8RG9jdW1lbnQ+IGhlYWRlcjsKLSAgc3dpdGNoIChoZWFkZXJfdHlwZSkgewotICAgIGNhc2UgQ2xhc3NOYW1lczo6SU5URVJGQUNFOgotICAgICAgaGVhZGVyID0gQnVpbGRJbnRlcmZhY2VIZWFkZXIodHlwZW5hbWVzLCBpbnRlcmZhY2UsIG9wdGlvbnMpOwotICAgICAgaGVhZGVyX3R5cGUgPSBDbGFzc05hbWVzOjpSQVc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENsYXNzTmFtZXM6OkNMSUVOVDoKLSAgICAgIGhlYWRlciA9IEJ1aWxkQ2xpZW50SGVhZGVyKHR5cGVuYW1lcywgaW50ZXJmYWNlLCBvcHRpb25zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ2xhc3NOYW1lczo6U0VSVkVSOgotICAgICAgaGVhZGVyID0gQnVpbGRTZXJ2ZXJIZWFkZXIodHlwZW5hbWVzLCBpbnRlcmZhY2UsIG9wdGlvbnMpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFJRExfRkFUQUwoaW50ZXJmYWNlKSA8PCAiYWlkbCBpbnRlcm5hbCBlcnJvciI7Ci0gIH0KLSAgaWYgKCFoZWFkZXIpIHsKLSAgICBBSURMX0VSUk9SKGludGVyZmFjZSkgPDwgImFpZGwgaW50ZXJuYWwgZXJyb3I6IEZhaWxlZCB0byBnZW5lcmF0ZSBoZWFkZXIuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBzdHJpbmcgaGVhZGVyX3BhdGggPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShpbnRlcmZhY2UsIGhlYWRlcl90eXBlKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBjb2RlX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGhlYWRlcl9wYXRoKSk7Ci0gIGhlYWRlci0+V3JpdGUoY29kZV93cml0ZXIuZ2V0KCkpOwotCi0gIGNvbnN0IGJvb2wgc3VjY2VzcyA9IGNvZGVfd3JpdGVyLT5DbG9zZSgpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBpb19kZWxlZ2F0ZS5SZW1vdmVQYXRoKGhlYWRlcl9wYXRoKTsKLSAgfQotCi0gIHJldHVybiBzdWNjZXNzOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWxzCiAKIHVzaW5nIG5hbWVzcGFjZSBpbnRlcm5hbHM7CiAKLWJvb2wgR2VuZXJhdGVDcHBJbnRlcmZhY2UoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGF1dG8gaW50ZXJmYWNlX3NyYyA9IEJ1aWxkSW50ZXJmYWNlU291cmNlKHR5cGVuYW1lcywgaW50ZXJmYWNlLCBvcHRpb25zKTsKLSAgYXV0byBjbGllbnRfc3JjID0gQnVpbGRDbGllbnRTb3VyY2UodHlwZW5hbWVzLCBpbnRlcmZhY2UsIG9wdGlvbnMpOwotICBhdXRvIHNlcnZlcl9zcmMgPSBCdWlsZFNlcnZlclNvdXJjZSh0eXBlbmFtZXMsIGludGVyZmFjZSwgb3B0aW9ucyk7Ci0KLSAgaWYgKCFpbnRlcmZhY2Vfc3JjIHx8ICFjbGllbnRfc3JjIHx8ICFzZXJ2ZXJfc3JjKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFXcml0ZUhlYWRlcihvcHRpb25zLCB0eXBlbmFtZXMsIGludGVyZmFjZSwgaW9fZGVsZWdhdGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSkgfHwKLSAgICAgICFXcml0ZUhlYWRlcihvcHRpb25zLCB0eXBlbmFtZXMsIGludGVyZmFjZSwgaW9fZGVsZWdhdGUsIENsYXNzTmFtZXM6OkNMSUVOVCkgfHwKLSAgICAgICFXcml0ZUhlYWRlcihvcHRpb25zLCB0eXBlbmFtZXMsIGludGVyZmFjZSwgaW9fZGVsZWdhdGUsIENsYXNzTmFtZXM6OlNFUlZFUikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHdyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIob3V0cHV0X2ZpbGUpOwotICBpbnRlcmZhY2Vfc3JjLT5Xcml0ZSh3cml0ZXIuZ2V0KCkpOwotICBjbGllbnRfc3JjLT5Xcml0ZSh3cml0ZXIuZ2V0KCkpOwotICBzZXJ2ZXJfc3JjLT5Xcml0ZSh3cml0ZXIuZ2V0KCkpOwotCi0gIGNvbnN0IGJvb2wgc3VjY2VzcyA9IHdyaXRlci0+Q2xvc2UoKTsKLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgaW9fZGVsZWdhdGUuUmVtb3ZlUGF0aChvdXRwdXRfZmlsZSk7Ci0gIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFBhcmNlbGFibGVUeXBlPgotYm9vbCBHZW5lcmF0ZUNwcFBhcmNlbGFibGUoY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dF9maWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBQYXJjZWxhYmxlVHlwZSYgcGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGF1dG8gaGVhZGVyID0gQnVpbGRQYXJjZWxIZWFkZXIodHlwZW5hbWVzLCBwYXJjZWxhYmxlLCBvcHRpb25zKTsKLSAgYXV0byBzb3VyY2UgPSBCdWlsZFBhcmNlbFNvdXJjZSh0eXBlbmFtZXMsIHBhcmNlbGFibGUsIG9wdGlvbnMpOwotCi0gIGlmICghaGVhZGVyIHx8ICFzb3VyY2UpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBzdHJpbmcgaGVhZGVyX3BhdGggPSBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShwYXJjZWxhYmxlLCBDbGFzc05hbWVzOjpSQVcpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGhlYWRlcl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihoZWFkZXJfcGF0aCkpOwotICBoZWFkZXItPldyaXRlKGhlYWRlcl93cml0ZXIuZ2V0KCkpOwotICBpZiAocGFyY2VsYWJsZS5Jc0dlbmVyaWMoKSkgewotICAgIC8vIE5lZWQgdG8gd3JpdGUgYWxsIG9mIHRoZSBzb3VyY2UgaW4gdGhlIGhlYWRlciBmaWxlLCBub3QgY3BwIGZpbGUuCi0gICAgc291cmNlLT5Xcml0ZShoZWFkZXJfd3JpdGVyLmdldCgpKTsKLSAgfQotICBBSURMX0ZBVEFMX0lGKCFoZWFkZXJfd3JpdGVyLT5DbG9zZSgpLCBoZWFkZXJfcGF0aCk7Ci0KLSAgLy8gVE9ETyhiLzExMTM2MjU5Myk6IG5vIHVuZWNlc3NhcnkgZmlsZXMganVzdCB0byBoYXZlIGNvbnNpc3RlbnQgb3V0cHV0IHdpdGggaW50ZXJmYWNlcwotICBjb25zdCBzdHJpbmcgYnBfaGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUocGFyY2VsYWJsZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBicF93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihicF9oZWFkZXIpKTsKLSAgYnBfd3JpdGVyLT5Xcml0ZSgiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMiKTsKLSAgQUlETF9GQVRBTF9JRighYnBfd3JpdGVyLT5DbG9zZSgpLCBicF9oZWFkZXIpOwotICBjb25zdCBzdHJpbmcgYm5faGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUocGFyY2VsYWJsZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBibl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihibl9oZWFkZXIpKTsKLSAgYm5fd3JpdGVyLT5Xcml0ZSgiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMiKTsKLSAgQUlETF9GQVRBTF9JRighYm5fd3JpdGVyLT5DbG9zZSgpLCBibl9oZWFkZXIpOwotCi0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gc291cmNlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIob3V0cHV0X2ZpbGUpOwotICBpZiAocGFyY2VsYWJsZS5Jc0dlbmVyaWMoKSkgewotICAgIC8vIFNpbmNlIHRoZSB0eXBlIGlzIGdlbmVyaWMsIHRoZSBzb3VyY2UgaXMgd3JpdHRlbiBpbiB0aGUgaGVhZGVyIGZpbGUKLSAgICBhdXRvIGVtcHR5X3NvdXJjZSA9IHVuaXF1ZV9wdHI8RG9jdW1lbnQ+e25ldyBDcHBTb3VyY2V7e30sIHt9fX07Ci0gICAgZW1wdHlfc291cmNlLT5Xcml0ZShzb3VyY2Vfd3JpdGVyLmdldCgpKTsKLSAgfSBlbHNlIHsKLSAgICBzb3VyY2UtPldyaXRlKHNvdXJjZV93cml0ZXIuZ2V0KCkpOwotICB9Ci0gIEFJRExfRkFUQUxfSUYoIXNvdXJjZV93cml0ZXItPkNsb3NlKCksIG91dHB1dF9maWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBHZW5lcmF0ZUNwcFBhcmNlbERlY2xhcmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsUGFyY2VsYWJsZSYgcGFyY2VsYWJsZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgQ29kZVdyaXRlclB0ciBzb3VyY2Vfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7Ci0gICpzb3VyY2Vfd3JpdGVyCi0gICAgICA8PCAiLy8gVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbGVmdCBibGFuayBhcyBwbGFjZWhvbGRlciBmb3IgcGFyY2VsIGRlY2xhcmF0aW9uLlxuIjsKLSAgQUlETF9GQVRBTF9JRighc291cmNlX3dyaXRlci0+Q2xvc2UoKSwgZmlsZW5hbWUpOwotCi0gIC8vIFRPRE8oYi8xMTEzNjI1OTMpOiBubyB1bmVjZXNzYXJ5IGZpbGVzIGp1c3QgdG8gaGF2ZSBjb25zaXN0ZW50IG91dHB1dCB3aXRoIGludGVyZmFjZXMKLSAgY29uc3Qgc3RyaW5nIGhlYWRlcl9wYXRoID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUocGFyY2VsYWJsZSwgQ2xhc3NOYW1lczo6UkFXKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBoZWFkZXJfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoaGVhZGVyX3BhdGgpKTsKLSAgaGVhZGVyX3dyaXRlci0+V3JpdGUoIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBoZWFkZXJzIik7Ci0gIEFJRExfRkFUQUxfSUYoIWhlYWRlcl93cml0ZXItPkNsb3NlKCksIGhlYWRlcl9wYXRoKTsKLSAgY29uc3Qgc3RyaW5nIGJwX2hlYWRlciA9IG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKHBhcmNlbGFibGUsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYnBfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYnBfaGVhZGVyKSk7Ci0gIGJwX3dyaXRlci0+V3JpdGUoIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzIik7Ci0gIEFJRExfRkFUQUxfSUYoIWJwX3dyaXRlci0+Q2xvc2UoKSwgYnBfaGVhZGVyKTsKLSAgY29uc3Qgc3RyaW5nIGJuX2hlYWRlciA9IG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKHBhcmNlbGFibGUsIENsYXNzTmFtZXM6OlNFUlZFUik7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYm5fd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYm5faGVhZGVyKSk7Ci0gIGJuX3dyaXRlci0+V3JpdGUoIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzIik7Ci0gIEFJRExfRkFUQUxfSUYoIWJuX3dyaXRlci0+Q2xvc2UoKSwgYm5faGVhZGVyKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBHZW5lcmF0ZUNwcEVudW1EZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBhdXRvIGhlYWRlciA9IEJ1aWxkRW51bUhlYWRlcih0eXBlbmFtZXMsIGVudW1fZGVjbCk7Ci0gIGlmICghaGVhZGVyKSByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3Qgc3RyaW5nIGhlYWRlcl9wYXRoID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUoZW51bV9kZWNsLCBDbGFzc05hbWVzOjpSQVcpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGhlYWRlcl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihoZWFkZXJfcGF0aCkpOwotICBoZWFkZXItPldyaXRlKGhlYWRlcl93cml0ZXIuZ2V0KCkpOwotICBBSURMX0ZBVEFMX0lGKCFoZWFkZXJfd3JpdGVyLT5DbG9zZSgpLCBoZWFkZXJfcGF0aCk7Ci0KLSAgLy8gVE9ETyhiLzExMTM2MjU5Myk6IG5vIHVubmVjZXNzYXJ5IGZpbGVzIGp1c3QgdG8gaGF2ZSBjb25zaXN0ZW50IG91dHB1dCB3aXRoIGludGVyZmFjZXMKLSAgQ29kZVdyaXRlclB0ciBzb3VyY2Vfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7Ci0gICpzb3VyY2Vfd3JpdGVyCi0gICAgICA8PCAiLy8gVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbGVmdCBibGFuayBhcyBwbGFjZWhvbGRlciBmb3IgZW51bSBkZWNsYXJhdGlvbi5cbiI7Ci0gIEFJRExfRkFUQUxfSUYoIXNvdXJjZV93cml0ZXItPkNsb3NlKCksIGZpbGVuYW1lKTsKLSAgY29uc3Qgc3RyaW5nIGJwX2hlYWRlciA9IG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKGVudW1fZGVjbCwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBicF93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihicF9oZWFkZXIpKTsKLSAgYnBfd3JpdGVyLT5Xcml0ZSgiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMiKTsKLSAgQUlETF9GQVRBTF9JRighYnBfd3JpdGVyLT5DbG9zZSgpLCBicF9oZWFkZXIpOwotICBjb25zdCBzdHJpbmcgYm5faGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUoZW51bV9kZWNsLCBDbGFzc05hbWVzOjpTRVJWRVIpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJuX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJuX2hlYWRlcikpOwotICBibl93cml0ZXItPldyaXRlKCIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcyIpOwotICBBSURMX0ZBVEFMX0lGKCFibl93cml0ZXItPkNsb3NlKCksIGJuX2hlYWRlcik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KIC8vIEVuc3VyZXMgdGhhdCBvdXRwdXRfZmlsZSBpcyAgPG91dF9kaXI+LzxwYWNrYWdlbmFtZT4vPHR5cGVuYW1lPi5jcHAKIGJvb2wgVmFsaWRhdGVPdXRwdXRGaWxlUGF0aChjb25zdCBzdHJpbmcmIG91dHB1dF9maWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlKSB7CkBAIC0xNTkyLDQxICsxMjA3LDIzNSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gQ29sbGVjdCBhbGwgaW5jbHVkZXMgZm9yIHRoZSB0eXBlJ3MgaGVhZGVyLiBOZXN0ZWQgdHlwZXMgYXJlIHZpc2l0ZWQgYXMgd2VsbCB2aWEgVmlzaXRUb3BEb3duLgordm9pZCBHZW5lcmF0ZUhlYWRlckluY2x1ZGVzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lczsKKyAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBpbmNsdWRlczsKKyAgICBWaXNpdG9yKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICAgICAgOiB0eXBlbmFtZXModHlwZW5hbWVzKSwgb3B0aW9ucyhvcHRpb25zKSB7fQorCisgICAgLy8gQ29sbGVjdCBpbmNsdWRlcyBmb3IgZWFjaCB0eXBlIHJlZmVyZW5jZSBpbmNsdWRpbmcgYnVpbHQtaW4gdHlwZQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpIG92ZXJyaWRlIHsKKyAgICAgIGNwcDo6QWRkSGVhZGVycyh0eXBlLCB0eXBlbmFtZXMsICZpbmNsdWRlcyk7CisgICAgfQorCisgICAgLy8gQ29sbGVjdCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBpbmNsdWRlcyBmb3IgZWFjaCB0eXBlIGRlZmluaXRpb24KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlKSBvdmVycmlkZSB7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoa0lCaW5kZXJIZWFkZXIpOyAgICAgICAgLy8gSUJpbmRlcgorICAgICAgaW5jbHVkZXMuaW5zZXJ0KGtJSW50ZXJmYWNlSGVhZGVyKTsgICAgIC8vIElJbnRlcmZhY2UKKyAgICAgIGluY2x1ZGVzLmluc2VydChrU3RhdHVzSGVhZGVyKTsgICAgICAgICAvLyBTdGF0dXMKKyAgICAgIGluY2x1ZGVzLmluc2VydChrU3Ryb25nUG9pbnRlckhlYWRlcik7ICAvLyBzcDw+CisKKyAgICAgIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7CisgICAgICAgIGluY2x1ZGVzLmluc2VydChrVHJhY2VIZWFkZXIpOworICAgICAgfQorCisgICAgICAvLyBGb3IgYSBuZXN0ZWQgaW50ZXJmYWNlLCBjbGllbnQvc2VydmVyIGNsYXNzZXMgYXJlIGRlY2xhcmVkIHRoZSBzYW1lIGhlYWRlciBhcyB3ZWxsLgorICAgICAgaWYgKGlmYWNlLkdldFBhcmVudFR5cGUoKSkgeworICAgICAgICAvLyBjbGllbnQvc2VydmVyIGNsYXNzIHByb3ZpZGVzIGxvZ0Z1bmMgd2hlbiBnZW5fbG9nIGlzIG9uCisgICAgICAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CisgICAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJmdW5jdGlvbmFsIik7ICAgICAgICAgICAgICAgICAgLy8gc3RkOjpmdW5jdGlvbiBmb3IgbG9nRnVuYworICAgICAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmgiKTsgIC8vIEdlbmVyaWMgVG9TdHJpbmcgaGVscGVyCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYpIG92ZXJyaWRlIHsKKyAgICAgIEFkZFBhcmNlbGFibGVDb21tb25IZWFkZXJzKCk7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoInR1cGxlIik7ICAvLyBzdGQ6OnRpZSBpbiBjb21wYXJpc29uIG9wZXJhdG9ycworICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdW5pb25fZGVjbCkgb3ZlcnJpZGUgeworICAgICAgQWRkUGFyY2VsYWJsZUNvbW1vbkhlYWRlcnMoKTsKKyAgICAgIGF1dG8gdW5pb25faGVhZGVycyA9IGNwcDo6VW5pb25Xcml0ZXI6OkdldEhlYWRlcnModW5pb25fZGVjbCk7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoc3RkOjpiZWdpbih1bmlvbl9oZWFkZXJzKSwgc3RkOjplbmQodW5pb25faGVhZGVycykpOworICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYpIG92ZXJyaWRlIHsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYXJyYXkiKTsgICAgICAgICAgIC8vIHVzZWQgaW4gZW51bV92YWx1ZXMKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYmluZGVyL0VudW1zLmgiKTsgIC8vIHByb3ZpZGVzIGVudW1fcmFuZ2UKKyAgICAgIGluY2x1ZGVzLmluc2VydCgic3RyaW5nIik7ICAgICAgICAgIC8vIHRvU3RyaW5nKCkgcmV0dXJucyBzdGQ6OnN0cmluZworICAgIH0KKworICAgIHZvaWQgQWRkUGFyY2VsYWJsZUNvbW1vbkhlYWRlcnMoKSB7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoa1BhcmNlbEhlYWRlcik7ICAgICAgICAgICAgICAgICAvLyBQYXJjZWwgaW4gcmVhZEZyb21QYXJjZWwvd3JpdGVUb1BhcmNlbAorICAgICAgaW5jbHVkZXMuaW5zZXJ0KGtTdGF0dXNIZWFkZXIpOyAgICAgICAgICAgICAgICAgLy8gU3RhdHVzCisgICAgICBpbmNsdWRlcy5pbnNlcnQoa1N0cmluZzE2SGVhZGVyKTsgICAgICAgICAgICAgICAvLyBTdHJpbmcxNiBpbiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcgorICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOyAgLy8gdG9TdHJpbmcoKQorICAgIH0KKyAgfSB2KHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworCisgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IHYuaW5jbHVkZXMpIHsKKyAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IHBhdGggPDwgIj5cbiI7CisgIH0KKyAgb3V0IDw8ICJcbiI7CisgIGlmICh2LmluY2x1ZGVzLmNvdW50KCJjYXNzZXJ0IikpIHsKKyAgICAvLyBUT0RPKGIvMzE1NTkwOTUpIGJpb25pYyBvbiBob3N0IHNob3VsZCBkZWZpbmUgX19hc3NlcnQyCisgICAgb3V0IDw8ICIjaWZuZGVmIF9fQklPTklDX19cbiNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKVxuI2VuZGlmXG5cbiI7CisgIH0KK30KKworLy8gR2VuZXJpYyBwYXJjZWxhYmxlcyBhbmQgZW51bSB1dGlsaXRpZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4gaGVhZGVyLgordm9pZCBHZW5lcmF0ZUhlYWRlckRlZmluaXRpb25zKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIENvZGVXcml0ZXImIG91dDsKKyAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXM7CisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9uczsKKyAgICBWaXNpdG9yKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgICAgICA6IG91dChvdXQpLCB0eXBlbmFtZXModHlwZW5hbWVzKSwgb3B0aW9ucyhvcHRpb25zKSB7fQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IGF1dG8gYmFja2luZ190eXBlID0gQ3BwTmFtZU9mKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMpOworICAgICAgRW50ZXJOYW1lc3BhY2Uob3V0LCBlbnVtX2RlY2wpOworICAgICAgb3V0IDw8IEdlbmVyYXRlRW51bVRvU3RyaW5nKGVudW1fZGVjbCwgYmFja2luZ190eXBlKTsKKyAgICAgIExlYXZlTmFtZXNwYWNlKG91dCwgZW51bV9kZWNsKTsKKworICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgYW5kcm9pZCB7XG4iOworICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgaW50ZXJuYWwge1xuIjsKKyAgICAgIG91dCA8PCBHZW5lcmF0ZUVudW1WYWx1ZXMoZW51bV9kZWNsLCB7IiJ9KTsKKyAgICAgIG91dCA8PCAifSAgLy8gbmFtZXNwYWNlIGludGVybmFsXG4iOworICAgICAgb3V0IDw8ICJ9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZFxuIjsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsYWJsZSkgb3ZlcnJpZGUgeworICAgICAgaWYgKHBhcmNlbGFibGUuSXNHZW5lcmljKCkpIHsKKyAgICAgICAgR2VuZXJhdGVQYXJjZWxTb3VyY2Uob3V0LCBwYXJjZWxhYmxlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdW5pb25fZGVjbCkgb3ZlcnJpZGUgeworICAgICAgaWYgKHVuaW9uX2RlY2wuSXNHZW5lcmljKCkpIHsKKyAgICAgICAgR2VuZXJhdGVQYXJjZWxTb3VyY2Uob3V0LCB1bmlvbl9kZWNsLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0KKworICB9IHYob3V0LCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICBWaXNpdFRvcERvd24odiwgZGVmaW5lZF90eXBlKTsKK30KKwordm9pZCBHZW5lcmF0ZUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGF1dG8gcGFyY2VsYWJsZSA9IEFpZGxDYXN0PEFpZGxQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgaGVhZGVycyI7CisgICAgcmV0dXJuOworICB9CisgIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7CisgIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMob3V0LCBkZWZpbmVkX3R5cGUsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIEVudGVyTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKKyAgLy8gRWFjaCBjbGFzcyBkZWNsIGNvbnRhaW5zIGl0cyBvd24gbmVzdGVkIHR5cGVzJyBjbGFzcyBkZWNscworICBHZW5lcmF0ZUNsYXNzRGVjbChvdXQsIGRlZmluZWRfdHlwZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgTGVhdmVOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOworICBHZW5lcmF0ZUhlYWRlckRlZmluaXRpb25zKG91dCwgZGVmaW5lZF90eXBlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworfQorCit2b2lkIEdlbmVyYXRlQ2xpZW50SGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBpZmFjZSA9IEFpZGxDYXN0PEFpZGxJbnRlcmZhY2U+KGRlZmluZWRfdHlwZSk7IGlmYWNlKSB7CisgICAgR2VuZXJhdGVDbGllbnRIZWFkZXIob3V0LCAqaWZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcyI7CisgIH0gZWxzZSBpZiAoYXV0byB1bmlvbl9kZWNsID0gQWlkbENhc3Q8QWlkbFVuaW9uRGVjbD4oZGVmaW5lZF90eXBlKTsgdW5pb25fZGVjbCkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMiOworICB9IGVsc2UgaWYgKGF1dG8gZW51bV9kZWNsID0gQWlkbENhc3Q8QWlkbEVudW1EZWNsYXJhdGlvbj4oZGVmaW5lZF90eXBlKTsgZW51bV9kZWNsKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcyI7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzIjsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIENQUCBnZW5lcmF0aW9uLiI7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZVNlcnZlckhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGF1dG8gaWZhY2UgPSBBaWRsQ2FzdDxBaWRsSW50ZXJmYWNlPihkZWZpbmVkX3R5cGUpOyBpZmFjZSkgeworICAgIEdlbmVyYXRlU2VydmVySGVhZGVyKG91dCwgKmlmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICB9IGVsc2UgaWYgKGF1dG8gcGFyY2VsYWJsZSA9IEFpZGxDYXN0PEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4oZGVmaW5lZF90eXBlKTsgcGFyY2VsYWJsZSkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMiOworICB9IGVsc2UgaWYgKGF1dG8gdW5pb25fZGVjbCA9IEFpZGxDYXN0PEFpZGxVbmlvbkRlY2w+KGRlZmluZWRfdHlwZSk7IHVuaW9uX2RlY2wpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzIjsKKyAgfSBlbHNlIGlmIChhdXRvIGVudW1fZGVjbCA9IEFpZGxDYXN0PEFpZGxFbnVtRGVjbGFyYXRpb24+KGRlZmluZWRfdHlwZSk7IGVudW1fZGVjbCkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMiOworICB9IGVsc2UgaWYgKGF1dG8gcGFyY2VsYWJsZSA9IEFpZGxDYXN0PEFpZGxQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcyI7CisgIH0gZWxzZSB7CisgICAgQUlETF9GQVRBTChkZWZpbmVkX3R5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSBzZW50IGZvciBDUFAgZ2VuZXJhdGlvbi4iOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIENvZGVXcml0ZXImIG91dDsKKyAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXM7CisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9uczsKKyAgICBWaXNpdG9yKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgICAgICA6IG91dChvdXQpLCB0eXBlbmFtZXModHlwZW5hbWVzKSwgb3B0aW9ucyhvcHRpb25zKSB7fQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UpIG92ZXJyaWRlIHsKKyAgICAgIEdlbmVyYXRlSW50ZXJmYWNlU291cmNlKG91dCwgaW50ZXJmYWNlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgICAgR2VuZXJhdGVDbGllbnRTb3VyY2Uob3V0LCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgICAgICBHZW5lcmF0ZVNlcnZlclNvdXJjZShvdXQsIGludGVyZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsYWJsZSkgb3ZlcnJpZGUgeworICAgICAgaWYgKCFwYXJjZWxhYmxlLklzR2VuZXJpYygpKSB7CisgICAgICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKG91dCwgcGFyY2VsYWJsZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiXG4iOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdW5pb25fZGVjbCkgb3ZlcnJpZGUgeworICAgICAgaWYgKCF1bmlvbl9kZWNsLklzR2VuZXJpYygpKSB7CisgICAgICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKG91dCwgdW5pb25fZGVjbCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiXG4iOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsKSBvdmVycmlkZSB7CisgICAgICBpZiAoIWVudW1fZGVjbC5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICAgICAgb3V0IDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBlbnVtIGRlY2xhcmF0aW9uLlxuIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiBwYXJjZWxhYmxlKSBvdmVycmlkZSB7CisgICAgICBBSURMX0ZBVEFMX0lGKHBhcmNlbGFibGUuR2V0UGFyZW50VHlwZSgpLCBwYXJjZWxhYmxlKQorICAgICAgICAgIDw8ICJVbnN0cnVjdHVyZWQgcGFyY2VsYWJsZSBjYW4ndCBiZSBuZXN0ZWQuIjsKKyAgICAgIG91dCA8PCAiLy8gVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbGVmdCBibGFuayBhcyBwbGFjZWhvbGRlciBmb3IgcGFyY2VsIGRlY2xhcmF0aW9uLlxuIjsKKyAgICB9CisgIH0gdihvdXQsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworfQorCiBib29sIEdlbmVyYXRlQ3BwKGNvbnN0IHN0cmluZyYgb3V0cHV0X2ZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7CiAgIGlmICghVmFsaWRhdGVPdXRwdXRGaWxlUGF0aChvdXRwdXRfZmlsZSwgb3B0aW9ucywgZGVmaW5lZF90eXBlKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7Ci0gIGlmIChwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVDcHBQYXJjZWxhYmxlKG91dHB1dF9maWxlLCBvcHRpb25zLCB0eXBlbmFtZXMsICpwYXJjZWxhYmxlLCBpb19kZWxlZ2F0ZSk7Ci0gIH0KKyAgdXNpbmcgR2VuRm4gPSB2b2lkICgqKShDb2RlV3JpdGVyICYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICAvLyBXcmFwIEdlbmVyYXRlKiBmdW5jdGlvbiB0byBoYW5kbGUgQ29kZVdyaXRlciBmb3IgYSBmaWxlLgorICBhdXRvIGdlbiA9IFsmXShhdXRvIGZpbGUsIEdlbkZuIGZuKSB7CisgICAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiB3cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlKSk7CisgICAgZm4oKndyaXRlciwgZGVmaW5lZF90eXBlLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgIEFJRExfRkFUQUxfSUYoIXdyaXRlci0+Q2xvc2UoKSwgZGVmaW5lZF90eXBlKSA8PCAiSS9PIEVycm9yISI7CisgICAgcmV0dXJuIHRydWU7CisgIH07CiAKLSAgLy8gc2hvdWxkIGNvbWUgYmVmb3JlIEFzUGFyY2VsYWJsZSgpIGJlY2F1c2UgdW5pb24gaXMgYSBwYXJjZWxhYmxlCi0gIGNvbnN0IEFpZGxVbmlvbkRlY2wqIHVuaW9uX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNVbmlvbkRlY2xhcmF0aW9uKCk7Ci0gIGlmICh1bmlvbl9kZWNsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVDcHBQYXJjZWxhYmxlKG91dHB1dF9maWxlLCBvcHRpb25zLCB0eXBlbmFtZXMsICp1bmlvbl9kZWNsLCBpb19kZWxlZ2F0ZSk7Ci0gIH0KLQotICAvLyB1bnN0cnVjdHVyZWQgcGFyY2VsYWJsZQotICBjb25zdCBBaWRsUGFyY2VsYWJsZSogcGFyY2VsYWJsZV9kZWNsID0gZGVmaW5lZF90eXBlLkFzUGFyY2VsYWJsZSgpOwotICBpZiAocGFyY2VsYWJsZV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVDcHBQYXJjZWxEZWNsYXJhdGlvbihvdXRwdXRfZmlsZSwgb3B0aW9ucywgKnBhcmNlbGFibGVfZGVjbCwgaW9fZGVsZWdhdGUpOwotICB9Ci0KLSAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gIGlmIChlbnVtX2RlY2wgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZW5lcmF0ZUNwcEVudW1EZWNsYXJhdGlvbihvdXRwdXRfZmlsZSwgb3B0aW9ucywgdHlwZW5hbWVzLCAqZW51bV9kZWNsLCBpb19kZWxlZ2F0ZSk7Ci0gIH0KLQotICBjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBkZWZpbmVkX3R5cGUuQXNJbnRlcmZhY2UoKTsKLSAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIEdlbmVyYXRlQ3BwSW50ZXJmYWNlKG91dHB1dF9maWxlLCBvcHRpb25zLCB0eXBlbmFtZXMsICppbnRlcmZhY2UsIGlvX2RlbGVnYXRlKTsKLSAgfQotCi0gIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgY3BwIGdlbmVyYXRpb24uIjsKLSAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gZ2VuKG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXKSwKKyAgICAgICAgICAgICAmR2VuZXJhdGVIZWFkZXIpICYmCisgICAgICAgICBnZW4ob3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIEhlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpLAorICAgICAgICAgICAgICZHZW5lcmF0ZUNsaWVudEhlYWRlcikgJiYKKyAgICAgICAgIGdlbihvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiksCisgICAgICAgICAgICAgJkdlbmVyYXRlU2VydmVySGVhZGVyKSAmJgorICAgICAgICAgZ2VuKG91dHB1dF9maWxlLCAmR2VuZXJhdGVTb3VyY2UpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgY3BwCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9jcHAuaCBiL2dlbmVyYXRlX2NwcC5oCmluZGV4IDNiN2QyYjkuLmFjZDNkMzkgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX2NwcC5oCisrKyBiL2dlbmVyYXRlX2NwcC5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZS5oIgogI2luY2x1ZGUgImFpZGxfdG9fY3BwLmgiCiAjaW5jbHVkZSAiYWlkbF90b19jcHBfY29tbW9uLmgiCi0jaW5jbHVkZSAiYXN0X2NwcC5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzIsMjggKzMxLDYgQEAKIGJvb2wgR2VuZXJhdGVDcHAoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAogICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHBhcnNlZF9kb2MsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKIAotbmFtZXNwYWNlIGludGVybmFscyB7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkQ2xpZW50U291cmNlKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgcGFyc2VkX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkU2VydmVyU291cmNlKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgcGFyc2VkX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkSW50ZXJmYWNlU291cmNlKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgcGFyc2VkX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkQ2xpZW50SGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgcGFyc2VkX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkU2VydmVySGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgcGFyc2VkX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkSW50ZXJmYWNlSGVhZGVyKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgcGFyc2VkX2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci1zdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEJ1aWxkRW51bUhlYWRlcihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBwYXJzZWRfZG9jKTsKLX0KIH0gIC8vIG5hbWVzcGFjZSBjcHAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfY3BwX3VuaXR0ZXN0LmNwcCBiL2dlbmVyYXRlX2NwcF91bml0dGVzdC5jcHAKaW5kZXggY2U3YzE4Yy4uZDc5ZjIyNSAxMDA2NDQKLS0tIGEvZ2VuZXJhdGVfY3BwX3VuaXR0ZXN0LmNwcAorKysgYi9nZW5lcmF0ZV9jcHBfdW5pdHRlc3QuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAKICNpbmNsdWRlICJhaWRsLmgiCiAjaW5jbHVkZSAiYWlkbF9sYW5ndWFnZS5oIgotI2luY2x1ZGUgImFzdF9jcHAuaCIKICNpbmNsdWRlICJjb2RlX3dyaXRlci5oIgogI2luY2x1ZGUgImdlbmVyYXRlX2NwcC5oIgogI2luY2x1ZGUgIm9zLmgiCkBAIC00Nyw3ICs0Niw3IEBACiAgICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zXy5JbnB1dEZpbGVzKCkuYXQoMCksIGZpbGVfY29udGVudHNfKTsKIAogICAgIHZlY3RvcjxzdHJpbmc+IGltcG9ydGVkX2ZpbGVzOwotICAgIEltcG9ydFJlc29sdmVyIGltcG9ydF9yZXNvbHZlcntpb19kZWxlZ2F0ZV8sIG9wdGlvbnNfLklucHV0RmlsZXMoKS5hdCgwKSwgeyIuIn0sIHt9fTsKKyAgICBJbXBvcnRSZXNvbHZlciBpbXBvcnRfcmVzb2x2ZXJ7aW9fZGVsZWdhdGVfLCBvcHRpb25zXy5JbnB1dEZpbGVzKCkuYXQoMCksIHsiLiJ9fTsKICAgICBBaWRsRXJyb3IgZXJyID0gOjphbmRyb2lkOjphaWRsOjppbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoCiAgICAgICAgIG9wdGlvbnNfLklucHV0RmlsZXMoKS5mcm9udCgpLCBvcHRpb25zXywgaW9fZGVsZWdhdGVfLCAmdHlwZW5hbWVzXywgJmltcG9ydGVkX2ZpbGVzKTsKIApAQCAtNjIsMzYgKzYxLDYgQEAKICAgICByZXR1cm4gZGVmaW5lZF90eXBlcy5mcm9udCgpLmdldCgpLT5Bc0ludGVyZmFjZSgpOwogICB9CiAKLSAgQWlkbEVudW1EZWNsYXJhdGlvbiogUGFyc2VTaW5nbGVFbnVtRGVjbGFyYXRpb24oKSB7Ci0gICAgaW9fZGVsZWdhdGVfLlNldEZpbGVDb250ZW50cyhvcHRpb25zXy5JbnB1dEZpbGVzKCkuYXQoMCksIGZpbGVfY29udGVudHNfKTsKLQotICAgIHZlY3RvcjxzdHJpbmc+IGltcG9ydGVkX2ZpbGVzOwotICAgIEFpZGxFcnJvciBlcnIgPSA6OmFuZHJvaWQ6OmFpZGw6OmludGVybmFsczo6bG9hZF9hbmRfdmFsaWRhdGVfYWlkbCgKLSAgICAgICAgb3B0aW9uc18uSW5wdXRGaWxlcygpLmZyb250KCksIG9wdGlvbnNfLCBpb19kZWxlZ2F0ZV8sICZ0eXBlbmFtZXNfLCAmaW1wb3J0ZWRfZmlsZXMpOwotCi0gICAgaWYgKGVyciAhPSBBaWRsRXJyb3I6Ok9LKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvJiBkZWZpbmVkX3R5cGVzID0gdHlwZW5hbWVzXy5NYWluRG9jdW1lbnQoKS5EZWZpbmVkVHlwZXMoKTsKLSAgICBFWFBFQ1RfRVEoMXVsLCBkZWZpbmVkX3R5cGVzLnNpemUoKSk7Ci0gICAgRVhQRUNUX05FKG51bGxwdHIsIGRlZmluZWRfdHlwZXMuZnJvbnQoKS5nZXQoKS0+QXNFbnVtRGVjbGFyYXRpb24oKSk7Ci0KLSAgICByZXR1cm4gZGVmaW5lZF90eXBlcy5mcm9udCgpLmdldCgpLT5Bc0VudW1EZWNsYXJhdGlvbigpOwotICB9Ci0KLSAgdm9pZCBDb21wYXJlKERvY3VtZW50KiBkb2MsIGNvbnN0IGNoYXIqIGV4cGVjdGVkKSB7Ci0gICAgc3RyaW5nIG91dHB1dDsKLSAgICBkb2MtPldyaXRlKENvZGVXcml0ZXI6OkZvclN0cmluZygmb3V0cHV0KS5nZXQoKSk7Ci0KLSAgICBpZiAoZXhwZWN0ZWQgPT0gb3V0cHV0KSB7Ci0gICAgICByZXR1cm47IC8vIFN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0ZXN0OjpQcmludERpZmYoZXhwZWN0ZWQsIG91dHB1dCk7Ci0gICAgRkFJTCgpIDw8ICJEb2N1bWVudCBjb250ZW50cyBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGNvbnRlbnRzIjsKLSAgfQotCiAgIGNvbnN0IE9wdGlvbnMgb3B0aW9uc187CiAgIGNvbnN0IHN0cmluZyBmaWxlX2NvbnRlbnRzXzsKICAgRmFrZUlvRGVsZWdhdGUgaW9fZGVsZWdhdGVfOwpAQCAtMTMxLDExICsxMDAsMTAgQEAKICAgICAgIFN0cmluZ1ByaW50ZigiJXMlYyVzIiwga0hlYWRlckRpciwgT1NfUEFUSF9TRVBBUkFUT1IsCiAgICAgICAgICAgICAgICAgICAga0ludGVyZmFjZUhlYWRlclJlbFBhdGgpOwogICBpb19kZWxlZ2F0ZV8uQWRkQnJva2VuRmlsZVBhdGgoaGVhZGVyX3BhdGgpOwotICBBU1NFUlRfRkFMU0UoR2VuZXJhdGVDcHAob3B0aW9uc18uT3V0cHV0RmlsZSgpLCBvcHRpb25zXywgdHlwZW5hbWVzXywgKmludGVyZmFjZSwgaW9fZGVsZWdhdGVfKSk7CisgIEFTU0VSVF9ERUFUSChHZW5lcmF0ZUNwcChvcHRpb25zXy5PdXRwdXRGaWxlKCksIG9wdGlvbnNfLCB0eXBlbmFtZXNfLCAqaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZV8pLAorICAgICAgICAgICAgICAgIkkvTyBFcnJvciEiKTsKICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGF0dGVtcHQgdG8gd3JpdGUgdGhlIEMrKyBmaWxlIGlmIHdlIGZhaWwgd3JpdGluZyBoZWFkZXJzLgogICBBU1NFUlRfRkFMU0UoaW9fZGVsZWdhdGVfLkdldFdyaXR0ZW5Db250ZW50cyhrT3V0cHV0UGF0aCwgbnVsbHB0cikpOwotICAvLyBXZSBzaG91bGQgcmVtb3ZlIHBhcnRpYWwgcmVzdWx0cy4KLSAgQVNTRVJUX1RSVUUoaW9fZGVsZWdhdGVfLlBhdGhXYXNSZW1vdmVkKGhlYWRlcl9wYXRoKSk7CiB9CiAKIFRFU1RfRihJb0Vycm9ySGFuZGxpbmdUZXN0LCBIYW5kbGVzQmFkQ3BwV3JpdGUpIHsKQEAgLTE0NSw5ICsxMTMsOCBAQAogCiAgIC8vIFNpbXVsYXRlIGlzc3VlcyBjbG9zaW5nIHRoZSBjcHAgZmlsZS4KICAgaW9fZGVsZWdhdGVfLkFkZEJyb2tlbkZpbGVQYXRoKGtPdXRwdXRQYXRoKTsKLSAgQVNTRVJUX0ZBTFNFKEdlbmVyYXRlQ3BwKG9wdGlvbnNfLk91dHB1dEZpbGUoKSwgb3B0aW9uc18sIHR5cGVuYW1lc18sICppbnRlcmZhY2UsIGlvX2RlbGVnYXRlXykpOwotICAvLyBXZSBzaG91bGQgcmVtb3ZlIHBhcnRpYWwgcmVzdWx0cy4KLSAgQVNTRVJUX1RSVUUoaW9fZGVsZWdhdGVfLlBhdGhXYXNSZW1vdmVkKGtPdXRwdXRQYXRoKSk7CisgIEFTU0VSVF9ERUFUSChHZW5lcmF0ZUNwcChvcHRpb25zXy5PdXRwdXRGaWxlKCksIG9wdGlvbnNfLCB0eXBlbmFtZXNfLCAqaW50ZXJmYWNlLCBpb19kZWxlZ2F0ZV8pLAorICAgICAgICAgICAgICAgIkkvTyBFcnJvciEiKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNwcApkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfamF2YS5jcHAgYi9nZW5lcmF0ZV9qYXZhLmNwcAppbmRleCBmM2I3YTkzLi5hOGRkMjMyIDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9qYXZhLmNwcAorKysgYi9nZW5lcmF0ZV9qYXZhLmNwcApAQCAtNDQsMTUgKzQ0LDE1IEBACiB1c2luZyBhbmRyb2lkOjphaWRsOjpqYXZhOjpDb2RlR2VuZXJhdG9yQ29udGV4dDsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNvbnN0YW50VmFsdWVEZWNvcmF0b3I7CiAKLWlubGluZSBzdHJpbmcgZ2V0dGVyX25hbWUoY29uc3QgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mIHZhcmlhYmxlKSB7CitpbmxpbmUgc3RyaW5nIEdldHRlck5hbWUoY29uc3QgQWlkbFZhcmlhYmxlRGVjbGFyYXRpb24mIHZhcmlhYmxlKSB7CiAgIHJldHVybiAiZ2V0IiArIHZhcmlhYmxlLkdldENhcGl0YWxpemVkTmFtZSgpOwogfQotaW5saW5lIHN0cmluZyBzZXR0ZXJfbmFtZShjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdmFyaWFibGUpIHsKK2lubGluZSBzdHJpbmcgU2V0dGVyTmFtZShjb25zdCBBaWRsVmFyaWFibGVEZWNsYXJhdGlvbiYgdmFyaWFibGUpIHsKICAgcmV0dXJuICJzZXQiICsgdmFyaWFibGUuR2V0Q2FwaXRhbGl6ZWROYW1lKCk7CiB9CiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKLWNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gY29udGVudHNfZGVzY3JpYmVycyB7Citjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+IGtDb250ZW50c0Rlc2NyaWJlcnMgewogICB7IkZpbGVEZXNjcmlwdG9yIiwgUiIoaWYgKF92IGluc3RhbmNlb2YgamF2YS5pby5GaWxlRGVzY3JpcHRvcikgewogICByZXR1cm4gYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNPTlRFTlRTX0ZJTEVfREVTQ1JJUFRPUjsKIH0pIn0sCkBAIC02OSw4ICs2OSw3IEBACiAgIH0KICAgcmV0dXJuIF9tYXNrOwogfSkifSwKLSAgeyJBcnJheSIsIFIiKENsYXNzPD8+IF9jbGF6eiA9IF92LmdldENsYXNzKCk7Ci1pZiAoX2NsYXp6LmlzQXJyYXkoKSAmJiBfY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpID09IE9iamVjdC5jbGFzcykgeworICB7IkFycmF5IiwgUiIoaWYgKF92IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKICAgaW50IF9tYXNrID0gMDsKICAgZm9yIChPYmplY3QgbyA6IChPYmplY3RbXSkgX3YpIHsKICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG8pOwpAQCAtODUsNyArODQsNyBAQAogICBvdXQuSW5kZW50KCk7CiAgIG91dCA8PCAiaWYgKF92ID09IG51bGwpIHJldHVybiAwO1xuIjsKICAgZm9yIChjb25zdCBhdXRvJiBkIDogZGVzY3JpYmVycykgewotICAgIG91dCA8PCBjb250ZW50c19kZXNjcmliZXJzLmF0KGQpIDw8ICJcbiI7CisgICAgb3V0IDw8IGtDb250ZW50c0Rlc2NyaWJlcnMuYXQoZCkgPDwgIlxuIjsKICAgfQogICBvdXQgPDwgInJldHVybiAwO1xuIjsKICAgb3V0LkRlZGVudCgpOwpAQCAtOTcsNyArOTYsMTIgQEAKIGJvb2wgQ2FuRGVzY3JpYmVDb250ZW50cyhjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4qIGRlc2NyaWJlcnMpIHsKICAgaWYgKHR5cGUuSXNBcnJheSgpKSB7Ci0gICAgaWYgKENhbkRlc2NyaWJlQ29udGVudHModHlwZS5BcnJheUJhc2UoKSwgdHlwZXMsIGRlc2NyaWJlcnMpKSB7CisgICAgYm9vbCBjYW5EZXNjcmliZSA9IGZhbHNlOworICAgIHR5cGUuVmlld0FzQXJyYXlCYXNlKFsmXShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgYmFzZSkgeworICAgICAgY2FuRGVzY3JpYmUgPSBDYW5EZXNjcmliZUNvbnRlbnRzKGJhc2UsIHR5cGVzLCBkZXNjcmliZXJzKTsKKyAgICB9KTsKKworICAgIGlmIChjYW5EZXNjcmliZSkgewogICAgICAgZGVzY3JpYmVycy0+aW5zZXJ0KCJBcnJheSIpOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTY4LDcgKzE3Miw3IEBACiAgICAgaWYgKENhbkRlc2NyaWJlQ29udGVudHMoZi0+R2V0VHlwZSgpLCB0eXBlcywgJmRlc2NyaWJlcnMpKSB7CiAgICAgICBvdXQgPDwgImNhc2UgIiA8PCBmLT5HZXROYW1lKCkgPDwgIjpcbiI7CiAgICAgICBvdXQuSW5kZW50KCk7Ci0gICAgICBvdXQgPDwgIl9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMoIiA8PCBnZXR0ZXJfbmFtZSgqZikgPDwgIigpKTtcbiI7CisgICAgICBvdXQgPDwgIl9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMoIiA8PCBHZXR0ZXJOYW1lKCpmKSA8PCAiKCkpO1xuIjsKICAgICAgIG91dCA8PCAiYnJlYWs7XG4iOwogICAgICAgb3V0LkRlZGVudCgpOwogICAgIH0KQEAgLTE4Myw3ICsxODcsNyBAQAogfQogCiB2b2lkIEdlbmVyYXRlVG9TdHJpbmcoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgb3V0IDw8ICJAT3ZlcnJpZGVcbiI7CiAgIG91dCA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKQEAgLTE5NSw2ICsxOTksNyBAQAogICAgICAgICAudHlwZW5hbWVzID0gdHlwZW5hbWVzLAogICAgICAgICAudHlwZSA9IGZpZWxkLT5HZXRUeXBlKCksCiAgICAgICAgIC52YXIgPSBmaWVsZC0+R2V0TmFtZSgpLAorICAgICAgICAubWluX3Nka192ZXJzaW9uID0gb3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCksCiAgICAgfTsKICAgICBvdXQgPDwgIl9haWRsX3NqLmFkZChcIiIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiOiBcIiArICgiOwogICAgIFRvU3RyaW5nRm9yKGN0eCk7CkBAIC0yMDUsOCArMjEwLDggQEAKICAgb3V0IDw8ICJ9XG4iOwogfQogCi12b2lkIEdlbmVyYXRlVG9TdHJpbmcoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsJiBwYXJjZWwsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Cit2b2lkIEdlbmVyYXRlVG9TdHJpbmcoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsJiBwYXJjZWwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIG91dCA8PCAiQE92ZXJyaWRlXG4iOwogICBvdXQgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7XG4iOwogICBvdXQuSW5kZW50KCk7CkBAIC0yMTYsNyArMjIxLDggQEAKICAgICAgICAgLndyaXRlciA9IG91dCwKICAgICAgICAgLnR5cGVuYW1lcyA9IHR5cGVuYW1lcywKICAgICAgICAgLnR5cGUgPSBmaWVsZC0+R2V0VHlwZSgpLAotICAgICAgICAudmFyID0gZ2V0dGVyX25hbWUoKmZpZWxkKSArICIoKSIsCisgICAgICAgIC52YXIgPSBHZXR0ZXJOYW1lKCpmaWVsZCkgKyAiKCkiLAorICAgICAgICAubWluX3Nka192ZXJzaW9uID0gb3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCksCiAgICAgfTsKICAgICBvdXQgPDwgImNhc2UgIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICI6IHJldHVybiBcIiIgPDwgcGFyY2VsLkdldENhbm9uaWNhbE5hbWUoKSA8PCAiLiIKICAgICAgICAgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiKFwiICsgKCI7CkBAIC0yOTAsMTEgKzI5Niw3IEBACiBuYW1lc3BhY2UgamF2YSB7CiAKIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQ29tbWVudHMoY29uc3QgQWlkbENvbW1lbnRhYmxlJiBub2RlKSB7Ci0gIHN0ZDo6c3RyaW5nIGNvbW1lbnRzID0gRm9ybWF0Q29tbWVudHNGb3JKYXZhKG5vZGUuR2V0Q29tbWVudHMoKSk7Ci0gIGlmICghY29tbWVudHMuZW1wdHkoKSAmJiBjb21tZW50cy5iYWNrKCkgIT0gJ1xuJykgewotICAgIGNvbW1lbnRzICs9ICdcbic7Ci0gIH0KLSAgcmV0dXJuIGNvbW1lbnRzOworICByZXR1cm4gRm9ybWF0Q29tbWVudHNGb3JKYXZhKG5vZGUuR2V0Q29tbWVudHMoKSk7CiB9CiAKIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQW5ub3RhdGlvbnMoY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKQEAgLTMwNSw3NiArMzA3LDkgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYm9vbCBnZW5lcmF0ZV9qYXZhX2ludGVyZmFjZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBhdXRvIGNsID0gZ2VuZXJhdGVfYmluZGVyX2ludGVyZmFjZV9jbGFzcyhpZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IGRvY3VtZW50ID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RG9jdW1lbnQ+KCIiIC8qIG5vIGNvbW1lbnQgKi8sIGlmYWNlLT5HZXRQYWNrYWdlKCksIHN0ZDo6bW92ZShjbCkpOwotCi0gIENvZGVXcml0ZXJQdHIgY29kZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLSAgZG9jdW1lbnQtPldyaXRlKGNvZGVfd3JpdGVyLmdldCgpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBnZW5lcmF0ZV9qYXZhX3BhcmNlbChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGF1dG8gY2wgPSBnZW5lcmF0ZV9wYXJjZWxfY2xhc3MocGFyY2VsLCB0eXBlbmFtZXMpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gZG9jdW1lbnQgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEb2N1bWVudD4oIiIgLyogbm8gY29tbWVudCAqLywgcGFyY2VsLT5HZXRQYWNrYWdlKCksIHN0ZDo6bW92ZShjbCkpOwotCi0gIENvZGVXcml0ZXJQdHIgY29kZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLSAgZG9jdW1lbnQtPldyaXRlKGNvZGVfd3JpdGVyLmdldCgpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBnZW5lcmF0ZV9qYXZhX2VudW1fZGVjbGFyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7Ci0gIGdlbmVyYXRlX2VudW0oY29kZV93cml0ZXIsIGVudW1fZGVjbCwgdHlwZW5hbWVzKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZ2VuZXJhdGVfamF2YV91bmlvbl9kZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IEFpZGxVbmlvbkRlY2wqIGRlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIENvZGVXcml0ZXJQdHIgY29kZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLSAgZ2VuZXJhdGVfdW5pb24oKmNvZGVfd3JpdGVyLCBkZWNsLCB0eXBlbmFtZXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBnZW5lcmF0ZV9qYXZhKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgQWlkbERlZmluZWRUeXBlKiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIGlmIChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbGFibGUgPSBkZWZpbmVkX3R5cGUtPkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKLSAgICAgIHBhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBnZW5lcmF0ZV9qYXZhX3BhcmNlbChmaWxlbmFtZSwgcGFyY2VsYWJsZSwgdHlwZW5hbWVzLCBpb19kZWxlZ2F0ZSk7Ci0gIH0KLQotICBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwotICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfamF2YV9lbnVtX2RlY2xhcmF0aW9uKGZpbGVuYW1lLCBlbnVtX2RlY2wsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUpOwotICB9Ci0KLSAgaWYgKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfamF2YV9pbnRlcmZhY2UoZmlsZW5hbWUsIGludGVyZmFjZSwgdHlwZW5hbWVzLCBpb19kZWxlZ2F0ZSwgb3B0aW9ucyk7Ci0gIH0KLQotICBpZiAoY29uc3QgQWlkbFVuaW9uRGVjbCogdW5pb25fZGVjbCA9IGRlZmluZWRfdHlwZS0+QXNVbmlvbkRlY2xhcmF0aW9uKCk7IHVuaW9uX2RlY2wgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBnZW5lcmF0ZV9qYXZhX3VuaW9uX2RlY2xhcmF0aW9uKGZpbGVuYW1lLCB1bmlvbl9kZWNsLCB0eXBlbmFtZXMsIGlvX2RlbGVnYXRlKTsKLSAgfQotCi0gIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgSmF2YSBnZW5lcmF0aW9uLiI7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNsYXNzPiBnZW5lcmF0ZV9wYXJjZWxfY2xhc3MoCi0gICAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgeworc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmFpZGw6OmphdmE6OkNsYXNzPiBHZW5lcmF0ZVBhcmNlbGFibGVDbGFzcygKKyAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgYXV0byBwYXJjZWxfY2xhc3MgPSBzdGQ6Om1ha2VfdW5pcXVlPENsYXNzPigpOwogICBwYXJjZWxfY2xhc3MtPmNvbW1lbnQgPSBHZW5lcmF0ZUNvbW1lbnRzKCpwYXJjZWwpOwogICBwYXJjZWxfY2xhc3MtPm1vZGlmaWVycyA9IFBVQkxJQzsKQEAgLTM4Miw2ICszMTcsOSBAQAogICBwYXJjZWxfY2xhc3MtPnR5cGUgPSBwYXJjZWwtPkdldENhbm9uaWNhbE5hbWUoKTsKICAgcGFyY2VsX2NsYXNzLT5pbnRlcmZhY2VzLnB1c2hfYmFjaygiYW5kcm9pZC5vcy5QYXJjZWxhYmxlIik7CiAgIHBhcmNlbF9jbGFzcy0+YW5ub3RhdGlvbnMgPSBKYXZhQW5ub3RhdGlvbnNGb3IoKnBhcmNlbCk7CisgIGlmIChwYXJjZWwtPkdldFBhcmVudFR5cGUoKSkgeworICAgIHBhcmNlbF9jbGFzcy0+bW9kaWZpZXJzIHw9IFNUQVRJQzsKKyAgfQogCiAgIGlmIChwYXJjZWwtPklzR2VuZXJpYygpKSB7CiAgICAgcGFyY2VsX2NsYXNzLT50eXBlICs9ICI8IiArIGJhc2U6OkpvaW4ocGFyY2VsLT5HZXRUeXBlUGFyYW1ldGVycygpLCAiLCIpICsgIj4iOwpAQCAtMzk2LDEyICszMzQsMTIgQEAKICAgICBpZiAodmFyaWFibGUtPkdldFR5cGUoKS5HZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiIHx8IHBhcmNlbC0+SXNKYXZhT25seUltbXV0YWJsZSgpKSB7CiAgICAgICBvdXQgPDwgImZpbmFsICI7CiAgICAgfQotICAgIG91dCA8PCBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSA8PCAiICIgPDwgdmFyaWFibGUtPkdldE5hbWUoKTsKKyAgICBvdXQgPDwgSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCkpIDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpOwogICAgIGlmICghcGFyY2VsLT5Jc0phdmFPbmx5SW1tdXRhYmxlKCkgJiYgdmFyaWFibGUtPkdldERlZmF1bHRWYWx1ZSgpKSB7CiAgICAgICBvdXQgPDwgIiA9ICIgPDwgdmFyaWFibGUtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwogICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPkdldFR5cGUoKS5HZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7CiAgICAgICBvdXQgPDwgc3RkOjpib29sYWxwaGE7Ci0gICAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IEphdmFTaWduYXR1cmVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpIDw8ICIoIjsKKyAgICAgIG91dCA8PCAiID0gbmV3ICIgPDwgSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCkpIDw8ICIoIjsKICAgICAgIGlmIChwYXJjZWwtPklzVmludGZTdGFiaWxpdHkoKSkgewogICAgICAgICBvdXQgPDwgImFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1NUQUJJTElUWV9WSU5URiI7CiAgICAgICB9IGVsc2UgewpAQCAtNDIzLDE1ICszNjEsMTMgQEAKIAogICAgIG91dC5zdHIoIiIpOwogICAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7Ci0gICAgICBvdXQgPDwgInByaXZhdGUgIiA8PCBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSA8PCAiICIKLSAgICAgICAgICA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpOworICAgICAgb3V0IDw8ICJwcml2YXRlICIgPDwgSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCkpIDw8ICIgIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpOwogICAgICAgaWYgKHZhcmlhYmxlLT5HZXREZWZhdWx0VmFsdWUoKSkgewogICAgICAgICBvdXQgPDwgIiA9ICIgPDwgdmFyaWFibGUtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwogICAgICAgfQogICAgICAgb3V0IDw8ICI7XG4iOwotICAgICAgb3V0IDw8ICJwdWJsaWMgQnVpbGRlciAiIDw8IHNldHRlcl9uYW1lKCp2YXJpYWJsZSkgPDwgIigiCi0gICAgICAgICAgPDwgSmF2YVNpZ25hdHVyZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykgPDwgIiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkKLSAgICAgICAgICA8PCAiKSB7XG4iCisgICAgICBvdXQgPDwgInB1YmxpYyBCdWlsZGVyICIgPDwgU2V0dGVyTmFtZSgqdmFyaWFibGUpIDw8ICIoIgorICAgICAgICAgIDw8IEphdmFTaWduYXR1cmVPZih2YXJpYWJsZS0+R2V0VHlwZSgpKSA8PCAiICIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiKSB7XG4iCiAgICAgICAgICAgPDwgIiAgIgogICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiID0gIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICI7XG4iCiAgICAgICAgICAgPDwgIiAgcmV0dXJuIHRoaXM7XG4iCkBAIC00OTksNiArNDM1LDcgQEAKICAgICAgICAgLnR5cGUgPSBmaWVsZC0+R2V0VHlwZSgpLAogICAgICAgICAucGFyY2VsID0gcGFyY2VsX3ZhcmlhYmxlLT5uYW1lLAogICAgICAgICAudmFyID0gZmllbGQtPkdldE5hbWUoKSwKKyAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAogICAgICAgICAuaXNfcmV0dXJuX3ZhbHVlID0gZmFsc2UsCiAgICAgfTsKICAgICBXcml0ZVRvUGFyY2VsRm9yKGNvbnRleHQpOwpAQCAtNTIyLDggKzQ1OSw4IEBACiAgICAgY29uc3RydWN0b3ItPm5hbWUgPSBwYXJjZWwtPkdldE5hbWUoKTsKICAgICBjb25zdHJ1Y3Rvci0+c3RhdGVtZW50cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhdGVtZW50QmxvY2s+KCk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IHBhcmNlbC0+R2V0RmllbGRzKCkpIHsKLSAgICAgIGNvbnN0cnVjdG9yLT5wYXJhbWV0ZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPigKLSAgICAgICAgICBKYXZhU2lnbmF0dXJlT2YoZmllbGQtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSwgZmllbGQtPkdldE5hbWUoKSkpOworICAgICAgY29uc3RydWN0b3ItPnBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZihmaWVsZC0+R2V0VHlwZSgpKSwgZmllbGQtPkdldE5hbWUoKSkpOwogICAgICAgb3V0LnN0cigiIik7CiAKICAgICAgIG91dCA8PCAidGhpcy4iIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIiA9ICI7CkBAIC01NjYsNyArNTAzLDggQEAKICAgb3V0IDw8ICJpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpO1xuIgogICAgICAgPDwgImludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpO1xuIgogICAgICAgPDwgInRyeSB7XG4iCi0gICAgICA8PCAiICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuIjsKKyAgICAgIDw8ICIgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgIgorICAgICAgICAgImFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbihcIlBhcmNlbGFibGUgdG9vIHNtYWxsXCIpOyI7CiAgIGlmIChwYXJjZWwtPklzSmF2YU9ubHlJbW11dGFibGUoKSkgewogICAgIG91dCA8PCAiICIgPDwgYnVpbGRlcl92YXJpYWJsZSA8PCAiLmJ1aWxkKCkiOwogICB9CkBAIC01OTcsMTYgKzUzNSwxNyBAQAogICAgICAgICAudHlwZSA9IGZpZWxkLT5HZXRUeXBlKCksCiAgICAgICAgIC5wYXJjZWwgPSBwYXJjZWxfdmFyaWFibGUtPm5hbWUsCiAgICAgICAgIC52YXIgPSBmaWVsZF92YXJpYWJsZV9uYW1lLAorICAgICAgICAubWluX3Nka192ZXJzaW9uID0gb3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCksCiAgICAgICAgIC5pc19jbGFzc2xvYWRlcl9jcmVhdGVkID0gJmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWQsCiAgICAgfTsKICAgICBjb250ZXh0LndyaXRlci5JbmRlbnQoKTsKICAgICBpZiAocGFyY2VsLT5Jc0phdmFPbmx5SW1tdXRhYmxlKCkpIHsKLSAgICAgIGNvbnRleHQud3JpdGVyLldyaXRlKCIlcyAlcztcbiIsIEphdmFTaWduYXR1cmVPZihmaWVsZC0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCisgICAgICBjb250ZXh0LndyaXRlci5Xcml0ZSgiJXMgJXM7XG4iLCBKYXZhU2lnbmF0dXJlT2YoZmllbGQtPkdldFR5cGUoKSkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3ZhcmlhYmxlX25hbWUuY19zdHIoKSk7CiAgICAgfQogICAgIENyZWF0ZUZyb21QYXJjZWxGb3IoY29udGV4dCk7CiAgICAgaWYgKHBhcmNlbC0+SXNKYXZhT25seUltbXV0YWJsZSgpKSB7Ci0gICAgICBjb250ZXh0LndyaXRlci5Xcml0ZSgiJXMuJXMoJXMpO1xuIiwgYnVpbGRlcl92YXJpYWJsZS5jX3N0cigpLCBzZXR0ZXJfbmFtZSgqZmllbGQpLmNfc3RyKCksCisgICAgICBjb250ZXh0LndyaXRlci5Xcml0ZSgiJXMuJXMoJXMpO1xuIiwgYnVpbGRlcl92YXJpYWJsZS5jX3N0cigpLCBTZXR0ZXJOYW1lKCpmaWVsZCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3ZhcmlhYmxlX25hbWUuY19zdHIoKSk7CiAgICAgfQogICAgIHdyaXRlci0+Q2xvc2UoKTsKQEAgLTYzMCwxMiArNTY5LDEyIEBACiAgIHBhcmNlbF9jbGFzcy0+ZWxlbWVudHMucHVzaF9iYWNrKHJlYWRfb3JfY3JlYXRlX21ldGhvZCk7CiAKICAgc3RyaW5nIGNvbnN0YW50czsKLSAgZ2VuZXJhdGVfY29uc3RhbnRfZGVjbGFyYXRpb25zKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvbnN0YW50cyksICpwYXJjZWwpOworICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvbnN0YW50cyksICpwYXJjZWwpOwogICBwYXJjZWxfY2xhc3MtPmVsZW1lbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KGNvbnN0YW50cykpOwogCiAgIGlmIChwYXJjZWwtPkphdmFEZXJpdmUoInRvU3RyaW5nIikpIHsKICAgICBzdHJpbmcgdG9fc3RyaW5nOwotICAgIEdlbmVyYXRlVG9TdHJpbmcoKkNvZGVXcml0ZXI6OkZvclN0cmluZygmdG9fc3RyaW5nKSwgKnBhcmNlbCwgdHlwZW5hbWVzKTsKKyAgICBHZW5lcmF0ZVRvU3RyaW5nKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJnRvX3N0cmluZyksICpwYXJjZWwsIHR5cGVuYW1lcywgb3B0aW9ucyk7CiAgICAgcGFyY2VsX2NsYXNzLT5lbGVtZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50Pih0b19zdHJpbmcpKTsKICAgfQogCkBAIC02NTAsNTAgKzU4OSw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lcyk7CiAgIHBhcmNlbF9jbGFzcy0+ZWxlbWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oZGVzY3JpYmVfY29udGVudHMpKTsKIAorICAvLyBhbGwgdGhlIG5lc3RlZCB0eXBlcworICBzdHJpbmcgY29kZTsKKyAgYXV0byB3cml0ZXIgPSBDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvZGUpOworICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IHBhcmNlbC0+R2V0TmVzdGVkVHlwZXMoKSkgeworICAgIEdlbmVyYXRlQ2xhc3MoKndyaXRlciwgKm5lc3RlZCwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgfQorICBHZW5lcmF0ZVBhcmNlbEhlbHBlcnMoKndyaXRlciwgKnBhcmNlbCwgb3B0aW9ucyk7CisgIHdyaXRlci0+Q2xvc2UoKTsKKyAgcGFyY2VsX2NsYXNzLT5lbGVtZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50Pihjb2RlKSk7CisKICAgcmV0dXJuIHBhcmNlbF9jbGFzczsKIH0KIAotdm9pZCBnZW5lcmF0ZV9lbnVtKGNvbnN0IENvZGVXcml0ZXJQdHImIGNvZGVfd3JpdGVyLCBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIGNvZGVfd3JpdGVyLT5Xcml0ZSgKLSAgICAgICIvKlxuIgotICAgICAgIiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuXG4iCi0gICAgICAiICovXG4iKTsKLQotICBjb2RlX3dyaXRlci0+V3JpdGUoInBhY2thZ2UgJXM7XG4iLCBlbnVtX2RlY2wtPkdldFBhY2thZ2UoKS5jX3N0cigpKTsKLSAgKCpjb2RlX3dyaXRlcikgPDwgR2VuZXJhdGVDb21tZW50cygqZW51bV9kZWNsKTsKLSAgKCpjb2RlX3dyaXRlcikgPDwgR2VuZXJhdGVBbm5vdGF0aW9ucygqZW51bV9kZWNsKTsKLSAgY29kZV93cml0ZXItPldyaXRlKCJwdWJsaWMgQGludGVyZmFjZSAlcyB7XG4iLCBlbnVtX2RlY2wtPkdldE5hbWUoKS5jX3N0cigpKTsKLSAgY29kZV93cml0ZXItPkluZGVudCgpOwotICBmb3IgKGNvbnN0IGF1dG8mIGVudW1lcmF0b3IgOiBlbnVtX2RlY2wtPkdldEVudW1lcmF0b3JzKCkpIHsKLSAgICAoKmNvZGVfd3JpdGVyKSA8PCBHZW5lcmF0ZUNvbW1lbnRzKCplbnVtZXJhdG9yKTsKLSAgICAoKmNvZGVfd3JpdGVyKSA8PCBHZW5lcmF0ZUFubm90YXRpb25zKCplbnVtZXJhdG9yKTsKLSAgICBjb2RlX3dyaXRlci0+V3JpdGUoCi0gICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsICVzICVzID0gJXM7XG4iLAotICAgICAgICBKYXZhU2lnbmF0dXJlT2YoZW51bV9kZWNsLT5HZXRCYWNraW5nVHlwZSgpLCB0eXBlbmFtZXMpLmNfc3RyKCksCi0gICAgICAgIGVudW1lcmF0b3ItPkdldE5hbWUoKS5jX3N0cigpLAotICAgICAgICBlbnVtZXJhdG9yLT5WYWx1ZVN0cmluZyhlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCksIENvbnN0YW50VmFsdWVEZWNvcmF0b3IpLmNfc3RyKCkpOwordm9pZCBHZW5lcmF0ZUVudW1DbGFzcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgeworICBvdXQgPDwgR2VuZXJhdGVDb21tZW50cyhlbnVtX2RlY2wpOworICBvdXQgPDwgR2VuZXJhdGVBbm5vdGF0aW9ucyhlbnVtX2RlY2wpOworICBvdXQgPDwgInB1YmxpYyAiOworICBpZiAoZW51bV9kZWNsLkdldFBhcmVudFR5cGUoKSkgeworICAgIG91dCA8PCAic3RhdGljICI7CiAgIH0KLSAgY29kZV93cml0ZXItPkRlZGVudCgpOwotICBjb2RlX3dyaXRlci0+V3JpdGUoIn1cbiIpOworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICIge1xuIjsKKyAgb3V0LkluZGVudCgpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudW1lcmF0b3IgOiBlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKSkgeworICAgIG91dCA8PCBHZW5lcmF0ZUNvbW1lbnRzKCplbnVtZXJhdG9yKTsKKyAgICBvdXQgPDwgR2VuZXJhdGVBbm5vdGF0aW9ucygqZW51bWVyYXRvcik7CisgICAgb3V0IDw8IGZtdDo6Zm9ybWF0KCJwdWJsaWMgc3RhdGljIGZpbmFsIHt9IHt9ID0ge307XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBKYXZhU2lnbmF0dXJlT2YoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCkpLCBlbnVtZXJhdG9yLT5HZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0b3ItPlZhbHVlU3RyaW5nKGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKSk7CisgIH0KKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn1cbiI7CiB9CiAKLXZvaWQgZ2VuZXJhdGVfdW5pb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsKiBkZWNsLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3ZvaWQgR2VuZXJhdGVVbmlvbkNsYXNzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFVuaW9uRGVjbCogZGVjbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBzdHJpbmcgdGFnX3R5cGUgPSAiaW50IjsKLSAgY29uc3QgQWlkbFR5cGVTcGVjaWZpZXIgdGFnX3R5cGVfc3BlY2lmaWVyKEFJRExfTE9DQVRJT05fSEVSRSwgdGFnX3R5cGUsIGZhbHNlIC8qIGlzQXJyYXkgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIHR5cGVfcGFyYW1zICovLCBDb21tZW50c3t9KTsKKyAgYXV0byB0YWdfdHlwZV9zcGVjaWZpZXIgPQorICAgICAgdHlwZW5hbWVzLk1ha2VSZXNvbHZlZFR5cGUoQUlETF9MT0NBVElPTl9IRVJFLCB0YWdfdHlwZSwgLyogaXNBcnJheSAqLyBmYWxzZSk7CiAgIGNvbnN0IHN0cmluZyBjbGF6eiA9IGRlY2wtPkdldE5hbWUoKTsKIAotICBvdXQgPDwgIi8qXG4iOwotICBvdXQgPDwgIiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuXG4iOwotICBvdXQgPDwgIiAqL1xuIjsKLQotICBvdXQgPDwgInBhY2thZ2UgIiArIGRlY2wtPkdldFBhY2thZ2UoKSArICI7XG4iOwotICBvdXQgPDwgIlxuIjsKICAgb3V0IDw8IEdlbmVyYXRlQ29tbWVudHMoKmRlY2wpOwogICBvdXQgPDwgR2VuZXJhdGVBbm5vdGF0aW9ucygqZGVjbCk7CiAKLSAgb3V0IDw8ICJwdWJsaWMgZmluYWwgY2xhc3MgIiArIGNsYXp6ICsgIiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7XG4iOworICBvdXQgPDwgInB1YmxpYyAiOworICBpZiAoZGVjbC0+R2V0UGFyZW50VHlwZSgpKSB7CisgICAgb3V0IDw8ICJzdGF0aWMgIjsKKyAgfQorICBvdXQgPDwgImZpbmFsIGNsYXNzICIgKyBjbGF6eiArICIgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUge1xuIjsKICAgb3V0LkluZGVudCgpOwogCiAgIHNpemVfdCB0YWdfaW5kZXggPSAwOwpAQCAtNzEyLDEzICs2NTUsMTQgQEAKIAogICBBSURMX0ZBVEFMX0lGKGRlY2wtPkdldEZpZWxkcygpLmVtcHR5KCksICpkZWNsKSA8PCAiVW5pb24gJyIgPDwgY2xhenogPDwgIicgaXMgZW1wdHkuIjsKICAgY29uc3QgYXV0byYgZmlyc3RfZmllbGQgPSBkZWNsLT5HZXRGaWVsZHMoKVswXTsKLSAgY29uc3QgYXV0byYgZmlyc3RfdHlwZSA9IEphdmFTaWduYXR1cmVPZihmaXJzdF9maWVsZC0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICBjb25zdCBhdXRvJiBmaXJzdF90eXBlID0gSmF2YVNpZ25hdHVyZU9mKGZpcnN0X2ZpZWxkLT5HZXRUeXBlKCkpOwogICBjb25zdCBhdXRvJiBmaXJzdF92YWx1ZSA9IGZpcnN0X2ZpZWxkLT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKIAogICAvLyBkZWZhdWx0IGN0b3IoKSBpbml0cyB3aXRoIGZpcnN0IG1lbWJlcidzIGRlZmF1bHQgdmFsdWUKICAgb3V0IDw8ICJwdWJsaWMgIiArIGNsYXp6ICsgIigpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8IGZpcnN0X3R5cGUgKyAiIF92YWx1ZSA9ICIgPDwgKGZpcnN0X3ZhbHVlLmVtcHR5KCkgPyAibnVsbCIgOiBmaXJzdF92YWx1ZSkgPDwgIjtcbiI7CisgIG91dCA8PCBmaXJzdF90eXBlICsgIiBfdmFsdWUgPSAiCisgICAgICA8PCAoZmlyc3RfdmFsdWUuZW1wdHkoKSA/IERlZmF1bHRKYXZhVmFsdWVPZihmaXJzdF9maWVsZC0+R2V0VHlwZSgpKSA6IGZpcnN0X3ZhbHVlKSA8PCAiO1xuIjsKICAgb3V0IDw8ICJ0aGlzLl90YWcgPSAiIDw8IGZpcnN0X2ZpZWxkLT5HZXROYW1lKCkgPDwgIjtcbiI7CiAgIG91dCA8PCAidGhpcy5fdmFsdWUgPSBfdmFsdWU7XG4iOwogICBvdXQuRGVkZW50KCk7CkBAIC03NTEsNyArNjk1LDcgQEAKICAgICBvdXQgPDwgIi8vICIgKyB2YXJpYWJsZS0+U2lnbmF0dXJlKCkgKyAiO1xuXG4iOwogCiAgICAgYXV0byB2YXJfbmFtZSA9IHZhcmlhYmxlLT5HZXROYW1lKCk7Ci0gICAgYXV0byB2YXJfdHlwZSA9IEphdmFTaWduYXR1cmVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgIGF1dG8gdmFyX3R5cGUgPSBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSk7CiAKICAgICAvLyB2YWx1ZSBjdG9yCiAgICAgb3V0IDw8IEdlbmVyYXRlQ29tbWVudHMoKnZhcmlhYmxlKTsKQEAgLTc2Niw3ICs3MTAsNyBAQAogICAgIGlmICh2YXJpYWJsZS0+R2V0VHlwZSgpLklzR2VuZXJpYygpKSB7CiAgICAgICBvdXQgPDwgIkBTdXBwcmVzc1dhcm5pbmdzKFwidW5jaGVja2VkXCIpXG4iOwogICAgIH0KLSAgICBvdXQgPDwgInB1YmxpYyAiICsgdmFyX3R5cGUgKyAiICIgKyBnZXR0ZXJfbmFtZSgqdmFyaWFibGUpICsgIigpIHtcbiI7CisgICAgb3V0IDw8ICJwdWJsaWMgIiArIHZhcl90eXBlICsgIiAiICsgR2V0dGVyTmFtZSgqdmFyaWFibGUpICsgIigpIHtcbiI7CiAgICAgb3V0LkluZGVudCgpOwogICAgIG91dCA8PCAiX2Fzc2VydFRhZygiICsgdmFyX25hbWUgKyAiKTtcbiI7CiAgICAgb3V0IDw8ICJyZXR1cm4gKCIgKyB2YXJfdHlwZSArICIpIF92YWx1ZTtcbiI7CkBAIC03NzUsNyArNzE5LDcgQEAKIAogICAgIC8vIHNldHRlcgogICAgIGlmICghZGVjbC0+SXNKYXZhT25seUltbXV0YWJsZSgpKSB7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkICIgKyBzZXR0ZXJfbmFtZSgqdmFyaWFibGUpICsgIigiICsgdmFyX3R5cGUgKyAiIF92YWx1ZSkge1xuIjsKKyAgICAgIG91dCA8PCAicHVibGljIHZvaWQgIiArIFNldHRlck5hbWUoKnZhcmlhYmxlKSArICIoIiArIHZhcl90eXBlICsgIiBfdmFsdWUpIHtcbiI7CiAgICAgICBvdXQuSW5kZW50KCk7CiAgICAgICBvdXQgPDwgIl9zZXQoIiArIHZhcl9uYW1lICsgIiwgX3ZhbHVlKTtcbiI7CiAgICAgICBvdXQuRGVkZW50KCk7CkBAIC04MTUsNiArNzU5LDcgQEAKICAgICAgICAgLnR5cGUgPSB0eXBlLAogICAgICAgICAucGFyY2VsID0gcGFyY2VsLAogICAgICAgICAudmFyID0gbmFtZSwKKyAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAogICAgICAgICAuaXNfcmV0dXJuX3ZhbHVlID0gZmFsc2UsCiAgICAgfTsKICAgICBXcml0ZVRvUGFyY2VsRm9yKGNvbnRleHQpOwpAQCAtODI1LDEyICs3NzAsMTIgQEAKICAgb3V0IDw8ICJAT3ZlcnJpZGVcbiI7CiAgIG91dCA8PCAicHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKSB7XG4iOwogICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCB3cml0ZV90b19wYXJjZWwodGFnX3R5cGVfc3BlY2lmaWVyLCAiX3RhZyIsICJfYWlkbF9wYXJjZWwiKTsKKyAgb3V0IDw8IHdyaXRlX3RvX3BhcmNlbCgqdGFnX3R5cGVfc3BlY2lmaWVyLCAiX3RhZyIsICJfYWlkbF9wYXJjZWwiKTsKICAgb3V0IDw8ICJzd2l0Y2ggKF90YWcpIHtcbiI7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBkZWNsLT5HZXRGaWVsZHMoKSkgewogICAgIG91dCA8PCAiY2FzZSAiICsgdmFyaWFibGUtPkdldE5hbWUoKSArICI6XG4iOwogICAgIG91dC5JbmRlbnQoKTsKLSAgICBvdXQgPDwgd3JpdGVfdG9fcGFyY2VsKHZhcmlhYmxlLT5HZXRUeXBlKCksIGdldHRlcl9uYW1lKCp2YXJpYWJsZSkgKyAiKCkiLCAiX2FpZGxfcGFyY2VsIik7CisgICAgb3V0IDw8IHdyaXRlX3RvX3BhcmNlbCh2YXJpYWJsZS0+R2V0VHlwZSgpLCBHZXR0ZXJOYW1lKCp2YXJpYWJsZSkgKyAiKCkiLCAiX2FpZGxfcGFyY2VsIik7CiAgICAgb3V0IDw8ICJicmVhaztcbiI7CiAgICAgb3V0LkRlZGVudCgpOwogICB9CkBAIC04NTAsNiArNzk1LDcgQEAKICAgICAgICAgLnR5cGUgPSB0eXBlLAogICAgICAgICAucGFyY2VsID0gcGFyY2VsLAogICAgICAgICAudmFyID0gbmFtZSwKKyAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAogICAgICAgICAuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCA9ICZpc19jbGFzc2xvYWRlcl9jcmVhdGVkLAogICAgIH07CiAgICAgQ3JlYXRlRnJvbVBhcmNlbEZvcihjb250ZXh0KTsKQEAgLTg2NywxMSArODEzLDExIEBACiAgIH0KICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgdGFnX3R5cGUgKyAiIF9haWRsX3RhZztcbiI7Ci0gIG91dCA8PCByZWFkX2Zyb21fcGFyY2VsKHRhZ190eXBlX3NwZWNpZmllciwgIl9haWRsX3RhZyIsICJfYWlkbF9wYXJjZWwiKTsKKyAgb3V0IDw8IHJlYWRfZnJvbV9wYXJjZWwoKnRhZ190eXBlX3NwZWNpZmllciwgIl9haWRsX3RhZyIsICJfYWlkbF9wYXJjZWwiKTsKICAgb3V0IDw8ICJzd2l0Y2ggKF9haWRsX3RhZykge1xuIjsKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IGRlY2wtPkdldEZpZWxkcygpKSB7CiAgICAgYXV0byB2YXJfbmFtZSA9IHZhcmlhYmxlLT5HZXROYW1lKCk7Ci0gICAgYXV0byB2YXJfdHlwZSA9IEphdmFTaWduYXR1cmVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgIGF1dG8gdmFyX3R5cGUgPSBKYXZhU2lnbmF0dXJlT2YodmFyaWFibGUtPkdldFR5cGUoKSk7CiAgICAgb3V0IDw8ICJjYXNlICIgKyB2YXJfbmFtZSArICI6IHtcbiI7CiAgICAgb3V0LkluZGVudCgpOwogICAgIG91dCA8PCB2YXJfdHlwZSArICIgX2FpZGxfdmFsdWU7XG4iOwpAQCAtODg5LDEyICs4MzUsMTIgQEAKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cblxuIjsKIAotICBnZW5lcmF0ZV9jb25zdGFudF9kZWNsYXJhdGlvbnMob3V0LCAqZGVjbCk7CisgIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMob3V0LCAqZGVjbCk7CiAKICAgR2VuZXJhdGVQYXJjZWxhYmxlRGVzY3JpYmVDb250ZW50cyhvdXQsICpkZWNsLCB0eXBlbmFtZXMpOwogICBvdXQgPDwgIlxuIjsKICAgaWYgKGRlY2wtPkphdmFEZXJpdmUoInRvU3RyaW5nIikpIHsKLSAgICBHZW5lcmF0ZVRvU3RyaW5nKG91dCwgKmRlY2wsIHR5cGVuYW1lcyk7CisgICAgR2VuZXJhdGVUb1N0cmluZyhvdXQsICpkZWNsLCB0eXBlbmFtZXMsIG9wdGlvbnMpOwogICB9CiAKICAgaWYgKGRlY2wtPkphdmFEZXJpdmUoImVxdWFscyIpKSB7CkBAIC05MzAsNiArODc2LDEyIEBACiAgICAgb3V0IDw8ICJ9XG4iOwogICB9CiAKKyAgLy8gYWxsIHRoZSBuZXN0ZWQgdHlwZXMKKyAgZm9yIChjb25zdCBhdXRvJiBuZXN0ZWQgOiBkZWNsLT5HZXROZXN0ZWRUeXBlcygpKSB7CisgICAgR2VuZXJhdGVDbGFzcyhvdXQsICpuZXN0ZWQsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIH0KKyAgR2VuZXJhdGVQYXJjZWxIZWxwZXJzKG91dCwgKmRlY2wsIG9wdGlvbnMpOworCiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwogfQpAQCAtOTM4LDcgKzg5MCw3IEBACiAgIHJldHVybiBtZXRob2QuUHJpbnRMb2NhdGlvbigpOwogfQogCi1zdGQ6OnN0cmluZyBnZW5lcmF0ZV9qYXZhX3Vuc3VwcG9ydGVkYXBwdXNhZ2VfcGFyYW1ldGVycyhjb25zdCBBaWRsQW5ub3RhdGlvbiYgYSkgeworc3RkOjpzdHJpbmcgR2VuZXJhdGVKYXZhVW5zdXBwb3J0ZWRBcHBVc2FnZVBhcmFtZXRlcnMoY29uc3QgQWlkbEFubm90YXRpb24mIGEpIHsKICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXMgPSBhLkFubm90YXRpb25QYXJhbXMoQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gcGFyYW1ldGVyc19kZWNsOwogICBmb3IgKGNvbnN0IGF1dG8mIG5hbWVfYW5kX3BhcmFtIDogcGFyYW1zKSB7CkBAIC05NTAsNyArOTAyLDcgQEAKICAgcmV0dXJuICIoIiArIEpvaW4ocGFyYW1ldGVyc19kZWNsLCAiLCAiKSArICIpIjsKIH0KIAotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnMoY29uc3QgQWlkbEFubm90YXRhYmxlJiBhKSB7CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2VuZXJhdGVKYXZhQW5ub3RhdGlvbnMoY29uc3QgQWlkbEFubm90YXRhYmxlJiBhKSB7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXN1bHQ7CiAgIGlmIChhLklzSGlkZSgpKSB7CiAgICAgcmVzdWx0LmVtcGxhY2VfYmFjaygiQGFuZHJvaWQuYW5ub3RhdGlvbi5IaWRlIik7CkBAIC05NTksMjEgKzkxMSwzNSBAQAogICBjb25zdCBBaWRsQW5ub3RhdGlvbiogdW5zdXBwb3J0ZWRfYXBwX3VzYWdlID0gYS5VbnN1cHBvcnRlZEFwcFVzYWdlKCk7CiAgIGlmICh1bnN1cHBvcnRlZF9hcHBfdXNhZ2UgIT0gbnVsbHB0cikgewogICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soIkBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2UiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2phdmFfdW5zdXBwb3J0ZWRhcHB1c2FnZV9wYXJhbWV0ZXJzKCp1bnN1cHBvcnRlZF9hcHBfdXNhZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlSmF2YVVuc3VwcG9ydGVkQXBwVXNhZ2VQYXJhbWV0ZXJzKCp1bnN1cHBvcnRlZF9hcHBfdXNhZ2UpKTsKICAgfQogCiAgIGZvciAoY29uc3QgYXV0byYgYW5ub3RhdGlvbiA6IGEuR2V0QW5ub3RhdGlvbnMoKSkgewotICAgIGlmIChhbm5vdGF0aW9uLkdldFR5cGUoKSA9PSBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9QQVNTVEhST1VHSCkgewotICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhhbm5vdGF0aW9uLlBhcmFtVmFsdWU8c3RkOjpzdHJpbmc+KCJhbm5vdGF0aW9uIikudmFsdWUoKSk7CisgICAgaWYgKGFubm90YXRpb24tPkdldFR5cGUoKSA9PSBBaWRsQW5ub3RhdGlvbjo6VHlwZTo6SkFWQV9QQVNTVEhST1VHSCkgeworICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhhbm5vdGF0aW9uLT5QYXJhbVZhbHVlPHN0ZDo6c3RyaW5nPigiYW5ub3RhdGlvbiIpLnZhbHVlKCkpOworICAgIH0KKyAgICBpZiAoYW5ub3RhdGlvbi0+R2V0VHlwZSgpID09IEFpZGxBbm5vdGF0aW9uOjpUeXBlOjpKQVZBX1NVUFBSRVNTX0xJTlQpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2YWx1ZXM7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIFtuYW1lLCB2YWx1ZV0gOiBhbm5vdGF0aW9uLT5Bbm5vdGF0aW9uUGFyYW1zKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpKSB7CisgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sobmFtZSArICIgPSAiICsgdmFsdWUpOworICAgICAgfQorICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjaygiQGFuZHJvaWQuYW5ub3RhdGlvbi5TdXBwcmVzc0xpbnQoIiArIEpvaW4odmFsdWVzLCAiLCAiKSArICIpIik7CiAgICAgfQogICB9CiAKKyAgaWYgKGF1dG8gZW5mb3JjZV9leHByID0gYS5FbmZvcmNlRXhwcmVzc2lvbigpOyBlbmZvcmNlX2V4cHIpIHsKKyAgICByZXN1bHQuZW1wbGFjZV9iYWNrKCJAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YWlkbDo6cGVybTo6QXNKYXZhQW5ub3RhdGlvbigqZW5mb3JjZV9leHByLmdldCgpKSArICIpIik7CisgIH0gZWxzZSBpZiAoYS5Jc1Blcm1pc3Npb25Ob25lKCkpIHsKKyAgICByZXN1bHQuZW1wbGFjZV9iYWNrKCJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIik7CisgIH0gIC8vIFRPRE86IEFkZCBhbm5vYXRpb24gZm9yIEBQZXJtaXNzaW9uTWFudWFsbHlFbmZvcmNlZAorCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0cnVjdCBKYXZhQW5ub3RhdGlvbnNWaXNpdG9yIDogQWlkbFZpc2l0b3IgewogICBKYXZhQW5ub3RhdGlvbnNWaXNpdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVzdWx0KSA6IHJlc3VsdChyZXN1bHQpIHt9Ci0gIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHQpIG92ZXJyaWRlIHsgcmVzdWx0ID0gZ2VuZXJhdGVfamF2YV9hbm5vdGF0aW9ucyh0KTsgfQorICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0KSBvdmVycmlkZSB7IHJlc3VsdCA9IEdlbmVyYXRlSmF2YUFubm90YXRpb25zKHQpOyB9CiAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgdCkgb3ZlcnJpZGUgeyBGb3JEZWZpbmVkVHlwZSh0KTsgfQogICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7IEZvckRlZmluZWRUeXBlKHQpOyB9CiAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7IEZvckRlZmluZWRUeXBlKHQpOyB9CkBAIC05ODUsMTQgKzk1MSwxNCBAQAogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlc3VsdDsKIAogICB2b2lkIEZvckRlZmluZWRUeXBlKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdCkgewotICAgIHJlc3VsdCA9IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnModCk7CisgICAgcmVzdWx0ID0gR2VuZXJhdGVKYXZhQW5ub3RhdGlvbnModCk7CiAgICAgaWYgKHQuSXNEZXByZWNhdGVkKCkpIHsKICAgICAgIHJlc3VsdC5wdXNoX2JhY2soIkBEZXByZWNhdGVkIik7CiAgICAgfQogICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZW1iZXI+CiAgIHZvaWQgRm9yTWVtYmVyKGNvbnN0IE1lbWJlciYgdCkgewotICAgIHJlc3VsdCA9IGdlbmVyYXRlX2phdmFfYW5ub3RhdGlvbnModC5HZXRUeXBlKCkpOworICAgIHJlc3VsdCA9IEdlbmVyYXRlSmF2YUFubm90YXRpb25zKHQuR2V0VHlwZSgpKTsKICAgICBpZiAodC5Jc0RlcHJlY2F0ZWQoKSkgewogICAgICAgcmVzdWx0LnB1c2hfYmFjaygiQERlcHJlY2F0ZWQiKTsKICAgICB9CkBAIC0xMDA2LDYgKzk3Miw0MyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCit2b2lkIEdlbmVyYXRlQ2xhc3MoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAvLyBHZW5lcmF0ZSBmaWxlIGhlYWRlciAoY29tbWVudHMgYW5kIHBhY2thZ2UpIG9ubHkgaWYgaXQncyBhIHJvb3QgdHlwZS4KKyAgaWYgKGRlZmluZWRfdHlwZS5HZXRQYXJlbnRUeXBlKCkgPT0gbnVsbHB0cikgeworICAgIG91dCA8PCAiLypcbiI7CisgICAgb3V0IDw8ICIgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLlxuIjsKKyAgICBvdXQgPDwgIiAqL1xuIjsKKyAgICBpZiAoY29uc3QgYXV0byBwa2cgPSBkZWZpbmVkX3R5cGUuR2V0UGFja2FnZSgpOyAhcGtnLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAicGFja2FnZSAiIDw8IHBrZyA8PCAiO1xuIjsKKyAgICB9CisgIH0KKworICBpZiAoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlID0gZGVmaW5lZF90eXBlLkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKKyAgICAgIHBhcmNlbGFibGUgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlUGFyY2VsYWJsZUNsYXNzKHBhcmNlbGFibGUsIHR5cGVzLCBvcHRpb25zKS0+V3JpdGUoJm91dCk7CisgIH0gZWxzZSBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLkFzRW51bURlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKKyAgICBHZW5lcmF0ZUVudW1DbGFzcyhvdXQsICplbnVtX2RlY2wpOworICB9IGVsc2UgaWYgKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS5Bc0ludGVyZmFjZSgpOyBpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlSW50ZXJmYWNlQ2xhc3MoaW50ZXJmYWNlLCB0eXBlcywgb3B0aW9ucyktPldyaXRlKCZvdXQpOworICB9IGVsc2UgaWYgKGNvbnN0IEFpZGxVbmlvbkRlY2wqIHVuaW9uX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNVbmlvbkRlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgdW5pb25fZGVjbCAhPSBudWxscHRyKSB7CisgICAgR2VuZXJhdGVVbmlvbkNsYXNzKG91dCwgdW5pb25fZGVjbCwgdHlwZXMsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgSmF2YSBnZW5lcmF0aW9uLiI7CisgIH0KK30KKworLy8gSW4gSmF2YSwgdGhlcmUncyAxOjEgbWFwcGluZyBiZXR3ZWVuIEFJREwgdHlwZSBhbmQgSmF2YSB0eXBlLiBTbyB3ZSBnZW5lcmF0ZSBhIHNpbmdsZSBmaWxlIGZvcgorLy8gdGhlIHR5cGUuCit2b2lkIEdlbmVyYXRlSmF2YShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7CisgIENvZGVXcml0ZXJQdHIgY29kZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKKyAgR2VuZXJhdGVDbGFzcygqY29kZV93cml0ZXIsIGRlZmluZWRfdHlwZSwgdHlwZXMsIG9wdGlvbnMpOworICBBSURMX0ZBVEFMX0lGKCFjb2RlX3dyaXRlci0+Q2xvc2UoKSwgZGVmaW5lZF90eXBlKSA8PCAiSS9PIEVycm9yISI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2dlbmVyYXRlX2phdmEuaCBiL2dlbmVyYXRlX2phdmEuaAppbmRleCBiM2NmZDZmLi5iZmEyMzc2IDEwMDY0NAotLS0gYS9nZW5lcmF0ZV9qYXZhLmgKKysrIGIvZ2VuZXJhdGVfamF2YS5oCkBAIC0yNywyMiArMjcsMTggQEAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBqYXZhIHsKIAotYm9vbCBnZW5lcmF0ZV9qYXZhKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgQWlkbERlZmluZWRUeXBlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAordm9pZCBHZW5lcmF0ZUphdmEoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKKwordm9pZCBHZW5lcmF0ZUNsYXNzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogCi1zdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YWlkbDo6amF2YTo6Q2xhc3M+IGdlbmVyYXRlX2JpbmRlcl9pbnRlcmZhY2VfY2xhc3MoCi0gICAgY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CitzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YWlkbDo6amF2YTo6Q2xhc3M+IEdlbmVyYXRlSW50ZXJmYWNlQ2xhc3MoY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogCi1zdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YWlkbDo6amF2YTo6Q2xhc3M+IGdlbmVyYXRlX3BhcmNlbF9jbGFzcygKLSAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKLQotdm9pZCBnZW5lcmF0ZV9lbnVtKGNvbnN0IENvZGVXcml0ZXJQdHImIGNvZGVfd3JpdGVyLCBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKTsKLQotdm9pZCBnZW5lcmF0ZV91bmlvbihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wqIGRlY2wsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7Ci0KLXZvaWQgZ2VuZXJhdGVfY29uc3RhbnRfZGVjbGFyYXRpb25zKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKTsKK3ZvaWQgR2VuZXJhdGVDb25zdGFudERlY2xhcmF0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSk7CiAKIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQ29tbWVudHMoY29uc3QgQWlkbENvbW1lbnRhYmxlJiBub2RlKTsKIApkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfamF2YV9iaW5kZXIuY3BwIGIvZ2VuZXJhdGVfamF2YV9iaW5kZXIuY3BwCmluZGV4IGZhMWMxNGEuLmZhNmVhNDYgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX2phdmFfYmluZGVyLmNwcAorKysgYi9nZW5lcmF0ZV9qYXZhX2JpbmRlci5jcHAKQEAgLTE2LDEwICsxNiwxMiBAQAogCiAjaW5jbHVkZSAiYWlkbC5oIgogI2luY2x1ZGUgImFpZGxfdG9famF2YS5oIgorI2luY2x1ZGUgImFpZGxfdHlwZW5hbWVzLmgiCiAjaW5jbHVkZSAiYXN0X2phdmEuaCIKICNpbmNsdWRlICJnZW5lcmF0ZV9qYXZhLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC00OSw4ICs1MSw4IEBACiAgIHVzaW5nIFZhcmlhYmxlID0gOjphbmRyb2lkOjphaWRsOjpqYXZhOjpWYXJpYWJsZTsKIAogICBleHBsaWNpdCBWYXJpYWJsZUZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2UpIDogYmFzZV8oYmFzZSksIGluZGV4XygwKSB7fQotICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IEdldChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gICAgYXV0byB2ID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKHR5cGUsIHR5cGVuYW1lcyksCisgIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gR2V0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSB7CisgICAgYXV0byB2ID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKHR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiJXMlZCIsIGJhc2VfLmNfc3RyKCksIGluZGV4XykpOwogICAgIHZhcnNfLnB1c2hfYmFjayh2KTsKICAgICBpbmRleF8rKzsKQEAgLTk0LDEyICs5NiwxMiBAQAogICBzaXplX3QgYWxsX21ldGhvZF9jb3VudDsKIAogICAvLyBGaW5pc2ggZ2VuZXJhdGlvbi4gVGhpcyB3aWxsIGFkZCBhIGRlZmF1bHQgY2FzZSB0byB0aGUgc3dpdGNoLgotICB2b2lkIGZpbmlzaCgpOworICB2b2lkIEZpbmlzaCgpOwogCi0gIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiBnZXRfdHJhbnNhY3RfZGVzY3JpcHRvcihjb25zdCBBaWRsTWV0aG9kKiBtZXRob2QpOworICBzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gR2V0VHJhbnNhY3REZXNjcmlwdG9yKGNvbnN0IEFpZGxNZXRob2QqIG1ldGhvZCk7CiAKICBwcml2YXRlOgotICB2b2lkIG1ha2VfYXNfaW50ZXJmYWNlKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZVR5cGUpOworICB2b2lkIE1ha2VBc0ludGVyZmFjZShjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2VUeXBlKTsKIAogICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IHRyYW5zYWN0X2Rlc2NyaXB0b3I7CiAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnNfOwpAQCAtMTM4LDcgKzE0MCw3IEBACiAgIHRoaXMtPmVsZW1lbnRzLnB1c2hfYmFjayhjdG9yKTsKIAogICAvLyBhc0ludGVyZmFjZQotICBtYWtlX2FzX2ludGVyZmFjZShpbnRlcmZhY2VUeXBlKTsKKyAgTWFrZUFzSW50ZXJmYWNlKGludGVyZmFjZVR5cGUpOwogCiAgIC8vIGFzQmluZGVyCiAgIGF1dG8gYXNCaW5kZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZD4oKTsKQEAgLTE5OSw3ICsyMDEsNyBAQAogICB0aGlzLT50cmFuc2FjdF9zd2l0Y2hfdXNlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3dpdGNoU3RhdGVtZW50Pih0aGlzLT50cmFuc2FjdF9jb2RlKTsKIH0KIAotdm9pZCBTdHViQ2xhc3M6OmZpbmlzaCgpIHsKK3ZvaWQgU3R1YkNsYXNzOjpGaW5pc2goKSB7CiAgIGF1dG8gZGVmYXVsdF9jYXNlID0gc3RkOjptYWtlX3NoYXJlZDxDYXNlPigpOwogCiAgIGF1dG8gc3VwZXJDYWxsID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPigKQEAgLTIwNyw4ICsyMDksMjMgQEAKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPj57dGhpcy0+dHJhbnNhY3RfY29kZSwgdGhpcy0+dHJhbnNhY3RfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dHJhbnNhY3RfcmVwbHksIHRoaXMtPnRyYW5zYWN0X2ZsYWdzfSk7CiAgIGRlZmF1bHRfY2FzZS0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8UmV0dXJuU3RhdGVtZW50PihzdXBlckNhbGwpKTsKKworICBhdXRvIGNhc2VfY291bnQgPSB0cmFuc2FjdF9zd2l0Y2hfdXNlci0+Y2FzZXMuc2l6ZSgpOwogICB0cmFuc2FjdF9zd2l0Y2hfdXNlci0+Y2FzZXMucHVzaF9iYWNrKGRlZmF1bHRfY2FzZSk7CiAKKyAgLy8gSW50ZXJmYWNlIHRva2VuIHZhbGlkYXRpb24gaXMgZG9uZSBmb3IgdXNlci1kZWZpbmVkIHRyYW5zYWN0aW9ucy4KKyAgaWYgKGNhc2VfY291bnQgPiAwKSB7CisgICAgYXV0byBpZlN0YXRlbWVudCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SWZTdGF0ZW1lbnQ+KCk7CisgICAgaWZTdGF0ZW1lbnQtPmV4cHJlc3Npb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxFeHByZXNzaW9uPigKKyAgICAgICAgImNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgIgorICAgICAgICAiY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OIik7CisgICAgaWZTdGF0ZW1lbnQtPnN0YXRlbWVudHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YXRlbWVudEJsb2NrPigpOworICAgIGlmU3RhdGVtZW50LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPigKKyAgICAgICAgdGhpcy0+dHJhbnNhY3RfZGF0YSwgImVuZm9yY2VJbnRlcmZhY2UiLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4+e3RoaXMtPkdldFRyYW5zYWN0RGVzY3JpcHRvcihudWxscHRyKX0pKTsKKyAgICB0cmFuc2FjdF9zdGF0ZW1lbnRzLT5BZGQoaWZTdGF0ZW1lbnQpOworICB9CisKICAgLy8gTWV0YSB0cmFuc2FjdGlvbnMgYXJlIGxvb2tlZCB1cCBwcmlvciB0byB1c2VyLWRlZmluZWQgdHJhbnNhY3Rpb25zLgogICB0cmFuc2FjdF9zdGF0ZW1lbnRzLT5BZGQodGhpcy0+dHJhbnNhY3Rfc3dpdGNoX21ldGEpOwogICB0cmFuc2FjdF9zdGF0ZW1lbnRzLT5BZGQodGhpcy0+dHJhbnNhY3Rfc3dpdGNoX3VzZXIpOwpAQCAtMjIyLDEyICsyMzksMTggQEAKICAgICBjb2RlX3N3aXRjaF9kZWZhdWx0X2Nhc2UtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPFJldHVyblN0YXRlbWVudD4oTlVMTF9WQUxVRSkpOwogICAgIHRoaXMtPmNvZGVfdG9fbWV0aG9kX25hbWVfc3dpdGNoLT5jYXNlcy5wdXNoX2JhY2soY29kZV9zd2l0Y2hfZGVmYXVsdF9jYXNlKTsKICAgfQorCisgIC8vIFRoZXJlIHdpbGwgYmUgYXQgbGVhc3Qgb25lIHN0YXRlbWVudCBmb3IgdGhlIGRlZmF1bHQsIGJ1dCBpZiB3ZSBlbWl0IGEKKyAgLy8gcmV0dXJuIHRydWUgYWZ0ZXIgdGhhdCBkZWZhdWx0LCBpdCB3aWxsIGJlIHVucmVhY2hhYmxlLgorICBpZiAoY2FzZV9jb3VudCA+IDApIHsKKyAgICB0cmFuc2FjdF9zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxSZXR1cm5TdGF0ZW1lbnQ+KFRSVUVfVkFMVUUpKTsKKyAgfQogfQogCiAvLyBUaGUgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBpbnRlcmZhY2UncyBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgd2hlbgogLy8gZ2VuZXJhdGluZyBjb2RlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLiBOdWxsIGlzIGFjY2VwdGFibGUgZm9yIG1ldGhvZAogLy8gYW5kIHN0YW5kcyBmb3Igc3ludGhldGljIGNhc2VzLgotc3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+IFN0dWJDbGFzczo6Z2V0X3RyYW5zYWN0X2Rlc2NyaXB0b3IoY29uc3QgQWlkbE1ldGhvZCogbWV0aG9kKSB7CitzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gU3R1YkNsYXNzOjpHZXRUcmFuc2FjdERlc2NyaXB0b3IoY29uc3QgQWlkbE1ldGhvZCogbWV0aG9kKSB7CiAgIGlmICh0cmFuc2FjdF9vdXRsaW5lKSB7CiAgICAgaWYgKG1ldGhvZCAhPSBudWxscHRyKSB7CiAgICAgICAvLyBXaGVuIG91dGxpbmluZywgZWFjaCBvdXRsaW5lZCBtZXRob2QgbmVlZHMgaXRzIG93biBsaXRlcmFsLgpAQCAtMjUzLDcgKzI3Niw3IEBACiAgIHJldHVybiB0cmFuc2FjdF9kZXNjcmlwdG9yOwogfQogCi12b2lkIFN0dWJDbGFzczo6bWFrZV9hc19pbnRlcmZhY2UoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlVHlwZSkgewordm9pZCBTdHViQ2xhc3M6Ok1ha2VBc0ludGVyZmFjZShjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2VUeXBlKSB7CiAgIGF1dG8gb2JqID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oImFuZHJvaWQub3MuSUJpbmRlciIsICJvYmoiKTsKIAogICBhdXRvIG0gPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZD4oKTsKQEAgLTM1NSwzNCArMzc4LDIwIEBACiBQcm94eUNsYXNzOjp+UHJveHlDbGFzcygpIHt9CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXN0YXRpYyB2b2lkIGdlbmVyYXRlX25ld19hcnJheShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZW1lbnRCbG9jaz4gYWRkVG8sIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IHBhcmNlbCkgewotICBhdXRvIGxlbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KCJpbnQiLCB2LT5uYW1lICsgIl9sZW5ndGgiKTsKLSAgYWRkVG8tPkFkZCgKLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGVEZWNsYXJhdGlvbj4obGVuLCBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KHBhcmNlbCwgInJlYWRJbnQiKSkpOwotICBhdXRvIGxlbmNoZWNrID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKLSAgbGVuY2hlY2stPmV4cHJlc3Npb24gPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb21wYXJpc29uPihsZW4sICI8Iiwgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oIjAiKSk7Ci0gIGxlbmNoZWNrLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxBc3NpZ25tZW50Pih2LCBOVUxMX1ZBTFVFKSk7Ci0gIGxlbmNoZWNrLT5lbHNlaWYgPSBzdGQ6Om1ha2Vfc2hhcmVkPElmU3RhdGVtZW50PigpOwotICBsZW5jaGVjay0+ZWxzZWlmLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxBc3NpZ25tZW50PigKLSAgICAgIHYsIHN0ZDo6bWFrZV9zaGFyZWQ8TmV3QXJyYXlFeHByZXNzaW9uPihJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YodHlwZSwgdHlwZW5hbWVzKSwgbGVuKSkpOwotICBhZGRUby0+QWRkKGxlbmNoZWNrKTsKLX0KIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZW1lbnRCbG9jaz4gYWRkVG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2LCBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JldHVybl92YWx1ZSwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CitzdGF0aWMgdm9pZCBHZW5lcmF0ZVdyaXRlVG9QYXJjZWwoc3RkOjpzaGFyZWRfcHRyPFN0YXRlbWVudEJsb2NrPiBhZGRUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJjZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluX3Nka192ZXJzaW9uLCBib29sIGlzX3JldHVybl92YWx1ZSkgewogICBzdHJpbmcgY29kZTsKICAgQ29kZVdyaXRlclB0ciB3cml0ZXIgPSBDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvZGUpOwogICBDb2RlR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0ewogICAgICAgLndyaXRlciA9ICood3JpdGVyLmdldCgpKSwKICAgICAgIC50eXBlbmFtZXMgPSB0eXBlbmFtZXMsCiAgICAgICAudHlwZSA9IHR5cGUsCi0gICAgICAucGFyY2VsID0gcGFyY2VsLT5uYW1lLAotICAgICAgLnZhciA9IHYtPm5hbWUsCisgICAgICAucGFyY2VsID0gcGFyY2VsLAorICAgICAgLnZhciA9IHZhciwKKyAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBtaW5fc2RrX3ZlcnNpb24sCiAgICAgICAuaXNfcmV0dXJuX3ZhbHVlID0gaXNfcmV0dXJuX3ZhbHVlLAogICB9OwogICBXcml0ZVRvUGFyY2VsRm9yKGNvbnRleHQpOwpAQCAtMzkwLDcgKzM5OSw3IEBACiAgIGFkZFRvLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50Pihjb2RlKSk7CiB9CiAKLXZvaWQgZ2VuZXJhdGVfY29uc3RhbnRfZGVjbGFyYXRpb25zKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7Cit2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIHsKICAgZm9yIChjb25zdCBhdXRvJiBjb25zdGFudCA6IHR5cGUuR2V0Q29uc3RhbnREZWNsYXJhdGlvbnMoKSkgewogICAgIGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlID0gY29uc3RhbnQtPkdldFR5cGUoKTsKICAgICBvdXQgPDwgR2VuZXJhdGVDb21tZW50cygqY29uc3RhbnQpOwpAQCAtNDAwLDE3ICs0MDksMTYgQEAKICAgfQogfQogCi1zdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1ldGhvZD4gZ2VuZXJhdGVfaW50ZXJmYWNlX21ldGhvZChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kPiBHZW5lcmF0ZUludGVyZmFjZU1ldGhvZChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QpIHsKICAgYXV0byBkZWNsID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2Q+KCk7CiAgIGRlY2wtPmNvbW1lbnQgPSBHZW5lcmF0ZUNvbW1lbnRzKG1ldGhvZCk7CiAgIGRlY2wtPm1vZGlmaWVycyA9IFBVQkxJQzsKLSAgZGVjbC0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICBkZWNsLT5yZXR1cm5UeXBlID0gSmF2YVNpZ25hdHVyZU9mKG1ldGhvZC5HZXRUeXBlKCkpOwogICBkZWNsLT5uYW1lID0gbWV0aG9kLkdldE5hbWUoKTsKICAgZGVjbC0+YW5ub3RhdGlvbnMgPSBKYXZhQW5ub3RhdGlvbnNGb3IobWV0aG9kKTsKIAogICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+JiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKLSAgICBhdXRvIHZhciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZihhcmctPkdldFR5cGUoKSwgdHlwZW5hbWVzKSwgYXJnLT5HZXROYW1lKCkpOworICAgIGF1dG8gdmFyID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpKSwgYXJnLT5HZXROYW1lKCkpOwogICAgIHZhci0+YW5ub3RhdGlvbnMgPSBKYXZhQW5ub3RhdGlvbnNGb3IoYXJnLT5HZXRUeXBlKCkpOwogICAgIGRlY2wtPnBhcmFtZXRlcnMucHVzaF9iYWNrKHZhcik7CiAgIH0KQEAgLTQyMCwxMiArNDI4LDEwMiBAQAogICByZXR1cm4gZGVjbDsKIH0KIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVfc3R1Yl9jb2RlKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGJvb2wgb25ld2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gdHJhbnNhY3RfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IHRyYW5zYWN0X3JlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVtZW50QmxvY2s+IHN0YXRlbWVudF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViQ2xhc3MsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKy8vIFZpc2l0b3IgZm9yIHRoZSBwZXJtaXNzaW9uIGRlY2xhcmVkIGluIHRoZSBARW5mb3JjZVBlcm1pc3Npb24gYW5ub3RhdGlvbi4KK3N0cnVjdCBQZXJtaXNzaW9uVmlzaXRvciB7CisgIHNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gb3BlcmF0b3IoKShjb25zdCBwZXJtOjpBbGxPZiYgcXVhbnRpZmllcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBvcGVyYW5kIDogcXVhbnRpZmllci5vcGVyYW5kcykgeworICAgICAgYXV0byBleHByID0gKCp0aGlzKShvcGVyYW5kKTsKKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0ID0gc3RkOjptYWtlX3NoYXJlZDxDb21wYXJpc29uPihyZXN1bHQsICImJiIsIGV4cHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gZXhwcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gb3BlcmF0b3IoKShjb25zdCBwZXJtOjpBbnlPZiYgcXVhbnRpZmllcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPiByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBvcGVyYW5kIDogcXVhbnRpZmllci5vcGVyYW5kcykgeworICAgICAgYXV0byBleHByID0gKCp0aGlzKShvcGVyYW5kKTsKKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0ID0gc3RkOjptYWtlX3NoYXJlZDxDb21wYXJpc29uPihyZXN1bHQsICJ8fCIsIGV4cHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gZXhwcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHNoYXJlZF9wdHI8RXhwcmVzc2lvbj4gb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgcGVybWlzc2lvbikgeworICAgIGF1dG8gYXR0cmlidXRpb25Tb3VyY2UgPQorICAgICAgICBzdGQ6OnN0cmluZygibmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZXRob2RfLkdldEFyZ3VtZW50cygpLnNpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBhdXRvJiBhcmcgPSBtZXRob2RfLkdldEFyZ3VtZW50cygpW2ldOworICAgICAgaWYgKGFyZy0+R2V0VHlwZSgpLkdldE5hbWUoKSA9PSAiYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlIikgeworICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiX2FyZyV6dSIsIGkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgYXV0byBjaGVja1Blcm1pc3Npb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KAorICAgICAgICBUSElTX1ZBTFVFLCAicGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyIiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+PnsKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbEV4cHJlc3Npb24+KCJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uIiArIHBlcm1pc3Npb24pLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPihUSElTX1ZBTFVFLCAiZ2V0Q2FsbGluZ1BpZCIpLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsRXhwcmVzc2lvbj4oYXR0cmlidXRpb25Tb3VyY2UpfSk7CisgICAgcmV0dXJuIGNoZWNrUGVybWlzc2lvbjsKKyAgfQorCisgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZF87Cit9OworCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVBlcm1pc3Npb25XcmFwcGVyKENsYXNzKiBzdHViQ2xhc3MpIHsKKyAgLy8gVE9ETyhiLzIwODcwNzQyMikgYXZvaWQgZ2VuZXJhdGluZyBwbGF0Zm9ybS1zcGVjaWZpYyBBUEkgY2FsbHMuCisgIHN0ZDo6c3RyaW5nIHBlcm1pc3Npb25DaGVja2VyV3JhcHBlckNvZGUgPQorICAgICAgInByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoXG4iCisgICAgICAiICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHtcbiIKKyAgICAgICIgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9XG4iCisgICAgICAiICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpO1xuIgorICAgICAgIiAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KFxuIgorICAgICAgIiAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsIFwiXCIgLyptZXNzYWdlKi8pID09XG4iCisgICAgICAiICAgICAgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRCk7XG4iCisgICAgICAifVxuIjsKKyAgYXV0byBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIgPQorICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PihwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXJDb2RlKTsKKyAgc3R1YkNsYXNzLT5lbGVtZW50cy5wdXNoX2JhY2socGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKTsKK30KKworc3RhdGljIHZvaWQgR2VuZXJhdGVQZXJtaXNzaW9uQ2hlY2soY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBwZXJtOjpFeHByZXNzaW9uJiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlbWVudEJsb2NrPiBhZGRUbykgeworICBhdXRvIGlmc3RhdGVtZW50ID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKKyAgYXV0byBjb21iaW5lZEV4cHIgPSBzdGQ6OnZpc2l0KFBlcm1pc3Npb25WaXNpdG9ye21ldGhvZH0sIGV4cHIpOworICBpZnN0YXRlbWVudC0+ZXhwcmVzc2lvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcGFyaXNvbj4oY29tYmluZWRFeHByLCAiIT0iLCBUUlVFX1ZBTFVFKTsKKyAgaWZzdGF0ZW1lbnQtPnN0YXRlbWVudHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YXRlbWVudEJsb2NrPigpOworICBpZnN0YXRlbWVudC0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oCisgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoInRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcIkFjY2VzcyBkZW5pZWQsIHJlcXVpcmVzOiAlc1wiKTtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybTo6QXNKYXZhQW5ub3RhdGlvbihleHByKS5jX3N0cigpKSkpOworICBhZGRUby0+QWRkKGlmc3RhdGVtZW50KTsKK30KKworc3RhdGljIHZvaWQgR2VuZXJhdGVQZXJtaXNzaW9uQ2hlY2tzKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlbWVudEJsb2NrPiBhZGRUbykgeworICBhdXRvIGlmYWNlUGVybUV4cHIgPSBpZmFjZS5FbmZvcmNlRXhwcmVzc2lvbigpOworICBpZiAoaWZhY2VQZXJtRXhwcikgeworICAgIEdlbmVyYXRlUGVybWlzc2lvbkNoZWNrKG1ldGhvZCwgKmlmYWNlUGVybUV4cHIuZ2V0KCksIGFkZFRvKTsKKyAgfQorICBhdXRvIG1ldGhvZFBlcm1FeHByID0gbWV0aG9kLkdldFR5cGUoKS5FbmZvcmNlRXhwcmVzc2lvbigpOworICBpZiAobWV0aG9kUGVybUV4cHIpIHsKKyAgICBHZW5lcmF0ZVBlcm1pc3Npb25DaGVjayhtZXRob2QsICptZXRob2RQZXJtRXhwci5nZXQoKSwgYWRkVG8pOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdlbmVyYXRlU3R1YkNvZGUoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgYm9vbCBvbmV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYXJpYWJsZT4gdHJhbnNhY3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB0cmFuc2FjdF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVtZW50QmxvY2s+IHN0YXRlbWVudF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICAvLyB0cnkgYW5kIGZpbmFsbHkKICAgYXV0byB0cnlTdGF0ZW1lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyeVN0YXRlbWVudD4oKTsKICAgYXV0byBmaW5hbGx5U3RhdGVtZW50ID0gc3RkOjptYWtlX3NoYXJlZDxGaW5hbGx5U3RhdGVtZW50PigpOwpAQCAtNDQ5LDExICs1NDcsNiBAQAogCiAgIGF1dG8gcmVhbENhbGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KFRISVNfVkFMVUUsIG1ldGhvZC5HZXROYW1lKCkpOwogCi0gIC8vIGludGVyZmFjZSB0b2tlbiB2YWxpZGF0aW9uIGlzIHRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIGRvCi0gIHN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KAotICAgICAgdHJhbnNhY3RfZGF0YSwgImVuZm9yY2VJbnRlcmZhY2UiLAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEV4cHJlc3Npb24+PntzdHViQ2xhc3MtPmdldF90cmFuc2FjdF9kZXNjcmlwdG9yKCZtZXRob2QpfSkpOwotCiAgIC8vIGFyZ3MKICAgVmFyaWFibGVGYWN0b3J5IHN0dWJBcmdzKCJfYXJnIik7CiAgIHsKQEAgLTQ2MSwzNiArNTU0LDYxIEBACiAgICAgLy8gYXQgbW9zdCBvbmNlLgogICAgIGJvb2wgaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCA9IGZhbHNlOwogICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewotICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2ID0gc3R1YkFyZ3MuR2V0KGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2ID0gc3R1YkFyZ3MuR2V0KGFyZy0+R2V0VHlwZSgpKTsKIAogICAgICAgc3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGVEZWNsYXJhdGlvbj4odikpOwogCisgICAgICBzdHJpbmcgY29kZTsKKyAgICAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKICAgICAgIGlmIChhcmctPkdldERpcmVjdGlvbigpICYgQWlkbEFyZ3VtZW50OjpJTl9ESVIpIHsKLSAgICAgICAgc3RyaW5nIGNvZGU7Ci0gICAgICAgIENvZGVXcml0ZXJQdHIgd3JpdGVyID0gQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb2RlKTsKKyAgICAgICAgLy8gImluL2lub3V0IiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSBwYXJjZWwuCiAgICAgICAgIENvZGVHZW5lcmF0b3JDb250ZXh0IGNvbnRleHR7LndyaXRlciA9ICood3JpdGVyLmdldCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZW5hbWVzID0gdHlwZW5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gYXJnLT5HZXRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcmNlbCA9IHRyYW5zYWN0X2RhdGEtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhciA9IHYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc19jbGFzc2xvYWRlcl9jcmVhdGVkID0gJmlzX2NsYXNzbG9hZGVyX2NyZWF0ZWR9OwogICAgICAgICBDcmVhdGVGcm9tUGFyY2VsRm9yKGNvbnRleHQpOwotICAgICAgICB3cml0ZXItPkNsb3NlKCk7Ci0gICAgICAgIHN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KGNvZGUpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghYXJnLT5HZXRUeXBlKCkuSXNBcnJheSgpKSB7Ci0gICAgICAgICAgc3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8QXNzaWdubWVudD4oCi0gICAgICAgICAgICAgIHYsIHN0ZDo6bWFrZV9zaGFyZWQ8TmV3RXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgICAgICAgICBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpKSk7CisgICAgICAgIC8vICJvdXQiIHBhcmFtZXRlciBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBjYWxsaW5nIHRoZSByZWFsIGltcGwuCisgICAgICAgIHN0cmluZyBqYXZhX3R5cGUgPSBJbnN0YW50aWFibGVKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpOworCisgICAgICAgIGlmIChhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CisgICAgICAgICAgLy8gZHluYW1pYyBhcnJheSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGEgcGFzc2VkIGxlbmd0aC4KKyAgICAgICAgICBzdHJpbmcgdmFyX2xlbmd0aCA9IHYtPm5hbWUgKyAiX2xlbmd0aCI7CisgICAgICAgICAgKCp3cml0ZXIpIDw8ICJpbnQgIiA8PCB2YXJfbGVuZ3RoIDw8ICIgPSBkYXRhLnJlYWRJbnQoKTtcbiI7CisgICAgICAgICAgKCp3cml0ZXIpIDw8ICJpZiAoIiA8PCB2YXJfbGVuZ3RoIDw8ICIgPCAwKSB7XG4iOworICAgICAgICAgICgqd3JpdGVyKSA8PCAiICAiIDw8IHYtPm5hbWUgPDwgIiA9IG51bGw7XG4iOworICAgICAgICAgICgqd3JpdGVyKSA8PCAifSBlbHNlIHtcbiI7CisgICAgICAgICAgKCp3cml0ZXIpIDw8ICIgICIgPDwgdi0+bmFtZSA8PCAiID0gbmV3ICIgPDwgamF2YV90eXBlIDw8ICJbIiA8PCB2YXJfbGVuZ3RoIDw8ICJdO1xuIjsKKyAgICAgICAgICAoKndyaXRlcikgPDwgIn1cbiI7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnLT5HZXRUeXBlKCkuSXNGaXhlZFNpemVBcnJheSgpKSB7CisgICAgICAgICAgLy8gZml4ZWQtc2l6ZSBhcnJheSBjYW4gYmUgY3JlYXRlZCB3aXRoIGEga25vd24gc2l6ZQorICAgICAgICAgIHN0cmluZyBkaW1lbnNpb25zOworICAgICAgICAgIGZvciAoYXV0byBkaW0gOiBhcmctPkdldFR5cGUoKS5HZXRGaXhlZFNpemVBcnJheURpbWVuc2lvbnMoKSkgeworICAgICAgICAgICAgZGltZW5zaW9ucyArPSAiWyIgKyBzdGQ6OnRvX3N0cmluZyhkaW0pICsgIl0iOworICAgICAgICAgIH0KKyAgICAgICAgICAoKndyaXRlcikgPDwgdi0+bmFtZSA8PCAiID0gbmV3ICIgPDwgamF2YV90eXBlIDw8IGRpbWVuc2lvbnMgPDwgIjtcbiI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdGVfbmV3X2FycmF5KGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIHN0YXRlbWVudHMsIHYsIHRyYW5zYWN0X2RhdGEpOworICAgICAgICAgIC8vIG90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgICAgKCp3cml0ZXIpIDw8IHYtPm5hbWUgPDwgIiA9IG5ldyAiIDw8IGphdmFfdHlwZSA8PCAiKCk7XG4iOwogICAgICAgICB9CiAgICAgICB9CisgICAgICB3cml0ZXItPkNsb3NlKCk7CisgICAgICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50Pihjb2RlKSk7CiAKICAgICAgIHJlYWxDYWxsLT5hcmd1bWVudHMucHVzaF9iYWNrKHYpOwogICAgIH0KICAgfQogCisgIC8vIEVPRiBjaGVjaworICBpZiAoIW1ldGhvZC5HZXRBcmd1bWVudHMoKS5lbXB0eSgpICYmIG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpID49IDMydSkgeworICAgIHN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KHRyYW5zYWN0X2RhdGEsICJlbmZvcmNlTm9EYXRhQXZhaWwiKSk7CisgIH0KKworICBHZW5lcmF0ZVBlcm1pc3Npb25DaGVja3MoaWZhY2UsIG1ldGhvZCwgc3RhdGVtZW50cyk7CisKICAgLy8gdGhlIHJlYWwgY2FsbAogICBpZiAobWV0aG9kLkdldFR5cGUoKS5HZXROYW1lKCkgPT0gInZvaWQiKSB7CiAgICAgc3RhdGVtZW50cy0+QWRkKHJlYWxDYWxsKTsKQEAgLTUwMSw5ICs2MTksOCBAQAogICAgICAgc3RhdGVtZW50cy0+QWRkKGV4KTsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgYXV0byBfcmVzdWx0ID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcyksICJfcmVzdWx0Iik7Ci0gICAgICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPihfcmVzdWx0LCByZWFsQ2FsbCkpOworICAgIGF1dG8gX3Jlc3VsdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpKSwgIl9yZXN1bHQiKTsKKyAgICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPihfcmVzdWx0LCByZWFsQ2FsbCkpOwogCiAgICAgaWYgKCFvbmV3YXkpIHsKICAgICAgIC8vIHJlcG9ydCB0aGF0IHRoZXJlIHdlcmUgbm8gZXhjZXB0aW9ucwpAQCAtNTEyLDQwICs2MjksMzggQEAKICAgICB9CiAKICAgICAvLyBtYXJzaGFsbCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKG1ldGhvZC5HZXRUeXBlKCksIHN0YXRlbWVudHMsIF9yZXN1bHQsIHRyYW5zYWN0X3JlcGx5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXMpOworICAgIEdlbmVyYXRlV3JpdGVUb1BhcmNlbChzdGF0ZW1lbnRzLCB0eXBlbmFtZXMsIG1ldGhvZC5HZXRUeXBlKCksIHRyYW5zYWN0X3JlcGx5LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LT5uYW1lLCBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwgLyppc19yZXR1cm5fdmFsdWU9Ki90cnVlKTsKICAgfQogCiAgIC8vIG91dCBwYXJhbWV0ZXJzCiAgIGludCBpID0gMDsKICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYXJnIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFZhcmlhYmxlPiB2ID0gc3R1YkFyZ3MuR2V0KGkrKyk7Ci0KICAgICBpZiAoYXJnLT5HZXREaXJlY3Rpb24oKSAmIEFpZGxBcmd1bWVudDo6T1VUX0RJUikgewotICAgICAgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKGFyZy0+R2V0VHlwZSgpLCBzdGF0ZW1lbnRzLCB2LCB0cmFuc2FjdF9yZXBseSwgdHJ1ZSwgdHlwZW5hbWVzKTsKKyAgICAgIEdlbmVyYXRlV3JpdGVUb1BhcmNlbChzdGF0ZW1lbnRzLCB0eXBlbmFtZXMsIGFyZy0+R2V0VHlwZSgpLCB0cmFuc2FjdF9yZXBseS0+bmFtZSwgdi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwgLyppc19yZXR1cm5fdmFsdWU9Ki90cnVlKTsKICAgICB9CiAgIH0KLQotICAvLyByZXR1cm4gdHJ1ZQotICBzdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxSZXR1cm5TdGF0ZW1lbnQ+KFRSVUVfVkFMVUUpKTsKIH0KIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVfc3R1Yl9jYXNlKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWJDbGFzcywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3N0YXRpYyB2b2lkIEdlbmVyYXRlU3R1YkNhc2UoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViQ2xhc3MsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBhdXRvIGMgPSBzdGQ6Om1ha2Vfc2hhcmVkPENhc2U+KHRyYW5zYWN0Q29kZU5hbWUpOwogCi0gIGdlbmVyYXRlX3N0dWJfY29kZShpZmFjZSwgbWV0aG9kLCBvbmV3YXksIHN0dWJDbGFzcy0+dHJhbnNhY3RfZGF0YSwgc3R1YkNsYXNzLT50cmFuc2FjdF9yZXBseSwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lcywgYy0+c3RhdGVtZW50cywgc3R1YkNsYXNzLCBvcHRpb25zKTsKKyAgR2VuZXJhdGVTdHViQ29kZShpZmFjZSwgbWV0aG9kLCBvbmV3YXksIHN0dWJDbGFzcy0+dHJhbnNhY3RfZGF0YSwgc3R1YkNsYXNzLT50cmFuc2FjdF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXMsIGMtPnN0YXRlbWVudHMsIG9wdGlvbnMpOworICBjLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxCcmVha1N0YXRlbWVudD4oKSk7CiAKICAgc3R1YkNsYXNzLT50cmFuc2FjdF9zd2l0Y2hfdXNlci0+Y2FzZXMucHVzaF9iYWNrKGMpOwogfQogCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9zdHViX2Nhc2Vfb3V0bGluZShjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CitzdGF0aWMgdm9pZCBHZW5lcmF0ZVN0dWJDYXNlT3V0bGluZShjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsIGJvb2wgb25ld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIHN0ZDo6c3RyaW5nIG91dGxpbmVfbmFtZSA9ICJvblRyYW5zYWN0JCIgKyBtZXRob2QuR2V0TmFtZSgpICsgIiQiOwogICAvLyBHZW5lcmF0ZSBhbiAib3V0bGluZWQiIG1ldGhvZCB3aXRoIHRoZSBhY3R1YWwgY29kZS4KICAgewpAQCAtNTYxLDggKzY3Niw5IEBACiAgICAgb25UcmFuc2FjdF9jYXNlLT5leGNlcHRpb25zLnB1c2hfYmFjaygiYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iKTsKICAgICBzdHViQ2xhc3MtPmVsZW1lbnRzLnB1c2hfYmFjayhvblRyYW5zYWN0X2Nhc2UpOwogCi0gICAgZ2VuZXJhdGVfc3R1Yl9jb2RlKGlmYWNlLCBtZXRob2QsIG9uZXdheSwgdHJhbnNhY3RfZGF0YSwgdHJhbnNhY3RfcmVwbHksIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgb25UcmFuc2FjdF9jYXNlLT5zdGF0ZW1lbnRzLCBzdHViQ2xhc3MsIG9wdGlvbnMpOworICAgIEdlbmVyYXRlU3R1YkNvZGUoaWZhY2UsIG1ldGhvZCwgb25ld2F5LCB0cmFuc2FjdF9kYXRhLCB0cmFuc2FjdF9yZXBseSwgdHlwZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgb25UcmFuc2FjdF9jYXNlLT5zdGF0ZW1lbnRzLCBvcHRpb25zKTsKKyAgICBvblRyYW5zYWN0X2Nhc2UtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPFJldHVyblN0YXRlbWVudD4oVFJVRV9WQUxVRSkpOwogICB9CiAKICAgLy8gR2VuZXJhdGUgdGhlIGNhc2UgZGlzcGF0Y2guCkBAIC01NzksMjkgKzY5NSwzNiBAQAogICB9CiB9CiAKLXN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kPiBnZW5lcmF0ZV9wcm94eV9tZXRob2QoCi0gICAgY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zYWN0Q29kZU5hbWUsCi0gICAgYm9vbCBvbmV3YXksIHN0ZDo6c2hhcmVkX3B0cjxQcm94eUNsYXNzPiBwcm94eUNsYXNzLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2Q+IEdlbmVyYXRlUHJveHlNZXRob2QoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHJhbnNhY3RDb2RlTmFtZSwgYm9vbCBvbmV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UHJveHlDbGFzcz4gcHJveHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgYXV0byBwcm94eSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kPigpOwogICBwcm94eS0+Y29tbWVudCA9IEdlbmVyYXRlQ29tbWVudHMobWV0aG9kKTsKICAgcHJveHktPm1vZGlmaWVycyA9IFBVQkxJQyB8IE9WRVJSSURFOwotICBwcm94eS0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICBwcm94eS0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpKTsKICAgcHJveHktPm5hbWUgPSBtZXRob2QuR2V0TmFtZSgpOwogICBwcm94eS0+c3RhdGVtZW50cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhdGVtZW50QmxvY2s+KCk7CiAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgewogICAgIHByb3h5LT5wYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oSmF2YVNpZ25hdHVyZU9mKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpLCBhcmctPkdldE5hbWUoKSkpOworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSkpOwogICB9CiAgIHByb3h5LT5leGNlcHRpb25zLnB1c2hfYmFjaygiYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iKTsKIAogICAvLyB0aGUgcGFyY2VscwogICBhdXRvIF9kYXRhID0gc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZT4oImFuZHJvaWQub3MuUGFyY2VsIiwgIl9kYXRhIik7Ci0gIHByb3h5LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPigKLSAgICAgIF9kYXRhLCBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZENhbGw+KCJhbmRyb2lkLm9zLlBhcmNlbCIsICJvYnRhaW4iKSkpOworICBpZiAob3B0aW9ucy5HZW5ScGMoKSkgeworICAgIHByb3h5LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigKKyAgICAgICAgImFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpO1xuIikpOworICB9IGVsc2UgeworICAgIHByb3h5LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigKKyAgICAgICAgImFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iKSk7CisgIH0KIAogICBpZiAoaWZhY2UuSXNTZW5zaXRpdmVEYXRhKCkpIHsKLSAgICBwcm94eS0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oIl9kYXRhLm1hcmtTZW5zaXRpdmUoKTsiKSk7CisgICAgcHJveHktPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KCJfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7XG4iKSk7CiAgIH0KIAogICBzdGQ6OnNoYXJlZF9wdHI8VmFyaWFibGU+IF9yZXBseSA9IG51bGxwdHI7CkBAIC02NDEsOSArNzY0LDkgQEAKIAogICAvLyB0aGUgcGFyYW1ldGVycwogICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+JiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKLSAgICBhdXRvIHYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcyksIGFyZy0+R2V0TmFtZSgpKTsKKyAgICBhdXRvIHYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSk7CiAgICAgQWlkbEFyZ3VtZW50OjpEaXJlY3Rpb24gZGlyID0gYXJnLT5HZXREaXJlY3Rpb24oKTsKLSAgICBpZiAoZGlyID09IEFpZGxBcmd1bWVudDo6T1VUX0RJUiAmJiBhcmctPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICBpZiAoZGlyID09IEFpZGxBcmd1bWVudDo6T1VUX0RJUiAmJiBhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICBhdXRvIGNoZWNrbGVuID0gc3RkOjptYWtlX3NoYXJlZDxJZlN0YXRlbWVudD4oKTsKICAgICAgIGNoZWNrbGVuLT5leHByZXNzaW9uID0gc3RkOjptYWtlX3NoYXJlZDxDb21wYXJpc29uPih2LCAiPT0iLCBOVUxMX1ZBTFVFKTsKICAgICAgIGNoZWNrbGVuLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxNZXRob2RDYWxsPigKQEAgLTY1NSw4ICs3NzgsOCBAQAogICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPj57c3RkOjptYWtlX3NoYXJlZDxGaWVsZFZhcmlhYmxlPih2LCAibGVuZ3RoIil9KSk7CiAgICAgICB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMtPkFkZChjaGVja2xlbik7CiAgICAgfSBlbHNlIGlmIChkaXIgJiBBaWRsQXJndW1lbnQ6OklOX0RJUikgewotICAgICAgZ2VuZXJhdGVfd3JpdGVfdG9fcGFyY2VsKGFyZy0+R2V0VHlwZSgpLCB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMsIHYsIF9kYXRhLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZXMpOworICAgICAgR2VuZXJhdGVXcml0ZVRvUGFyY2VsKHRyeVN0YXRlbWVudC0+c3RhdGVtZW50cywgdHlwZW5hbWVzLCBhcmctPkdldFR5cGUoKSwgX2RhdGEtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+bmFtZSwgb3B0aW9ucy5HZXRNaW5TZGtWZXJzaW9uKCksIC8qaXNfcmV0dXJuX3ZhbHVlPSovZmFsc2UpOwogICAgIH0KICAgfQogCkBAIC02NzQsNiArNzk3LDEyIEBACiAgIGF1dG8gX3N0YXR1cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KCJib29sZWFuIiwgIl9zdGF0dXMiKTsKICAgdHJ5U3RhdGVtZW50LT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxWYXJpYWJsZURlY2xhcmF0aW9uPihfc3RhdHVzLCBjYWxsKSk7CiAKKyAgLy8gVE9ETyhiLzE1MTEwMjQ5NCk6IGFubm90YXRpb24gaXMgYXBwbGllZCBvbiB0aGUgcmV0dXJuIHR5cGUKKyAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuSXNQcm9wYWdhdGVBbGxvd0Jsb2NraW5nKCkpIHsKKyAgICB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMtPkFkZCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PigiX3JlcGx5LnNldFByb3BhZ2F0ZUFsbG93QmxvY2tpbmcoKTtcbiIpKTsKKyAgfQorCiAgIC8vIElmIHRoZSB0cmFuc2FjdGlvbiByZXR1cm5zIGZhbHNlLCB3aGljaCBtZWFucyBVTktOT1dOX1RSQU5TQUNUSU9OLCBmYWxsIGJhY2sgdG8gdGhlIGxvY2FsCiAgIC8vIG1ldGhvZCBpbiB0aGUgZGVmYXVsdCBpbXBsLCBpZiBzZXQgYmVmb3JlLiBPdGhlcndpc2UsIHRocm93IGEgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgaW50ZXJmYWNlCiAgIC8vIGlzIHZlcnNpb25lZC4gV2UgY2FuJ3QgdGhyb3cgdGhlIGV4Y2VwdGlvbiBmb3IgdW52ZXJzaW9uZWQgaW50ZXJmYWNlIGJlY2F1c2UgdGhhdCB3b3VsZCBiZSBhbgpAQCAtNjk2LDE5ICs4MjUsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW4oYXJnX25hbWVzLCAiLCAiKS5jX3N0cigpKSkpOwogICAgIGNoZWNrRGVmYXVsdEltcGwtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KCJyZXR1cm47XG4iKSk7CiAgIH0KKworICBhdXRvIGNoZWNrVHJhbnNhY3Rpb25FcnJvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8SWZTdGF0ZW1lbnQ+KCk7CisgIGNoZWNrVHJhbnNhY3Rpb25FcnJvci0+ZXhwcmVzc2lvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbEV4cHJlc3Npb24+KCIhX3N0YXR1cyIpOworCisgIGlmIChpZmFjZS5Jc0phdmFEZWZhdWx0KCkpIHsKKyAgICBjaGVja1RyYW5zYWN0aW9uRXJyb3ItPnN0YXRlbWVudHMtPkFkZChjaGVja0RlZmF1bHRJbXBsKTsKKyAgfQorCiAgIGlmIChvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICBjaGVja0RlZmF1bHRJbXBsLT5lbHNlaWYgPSBzdGQ6Om1ha2Vfc2hhcmVkPElmU3RhdGVtZW50PigpOwotICAgIGNoZWNrRGVmYXVsdEltcGwtPmVsc2VpZi0+c3RhdGVtZW50cy0+QWRkKAorICAgIGNoZWNrVHJhbnNhY3Rpb25FcnJvci0+c3RhdGVtZW50cy0+QWRkKAogICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxTdGF0ZW1lbnQ+KGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICJ0aHJvdyBuZXcgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24oXCJNZXRob2QgJXMgaXMgdW5pbXBsZW1lbnRlZC5cIik7XG4iLAogICAgICAgICAgICAgbWV0aG9kLkdldE5hbWUoKS5jX3N0cigpKSkpOwogICB9CiAKLSAgYXV0byBjaGVja1RyYW5zYWN0aW9uRXJyb3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPElmU3RhdGVtZW50PigpOwotICBjaGVja1RyYW5zYWN0aW9uRXJyb3ItPmV4cHJlc3Npb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxFeHByZXNzaW9uPigiIV9zdGF0dXMiKTsKLSAgY2hlY2tUcmFuc2FjdGlvbkVycm9yLT5zdGF0ZW1lbnRzLT5BZGQoY2hlY2tEZWZhdWx0SW1wbCk7Ci0KLSAgdHJ5U3RhdGVtZW50LT5zdGF0ZW1lbnRzLT5BZGQoY2hlY2tUcmFuc2FjdGlvbkVycm9yKTsKKyAgaWYgKGlmYWNlLklzSmF2YURlZmF1bHQoKSB8fCBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKKyAgICB0cnlTdGF0ZW1lbnQtPnN0YXRlbWVudHMtPkFkZChjaGVja1RyYW5zYWN0aW9uRXJyb3IpOworICB9CiAKICAgLy8gdGhyb3cgYmFjayBleGNlcHRpb25zLgogICBpZiAoX3JlcGx5KSB7CkBAIC03MjksNiArODYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBtZXRob2QuR2V0VHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyY2VsID0gX3JlcGx5LT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFyID0gX3Jlc3VsdC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbl9zZGtfdmVyc2lvbiA9IG9wdGlvbnMuR2V0TWluU2RrVmVyc2lvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCA9ICZpc19jbGFzc2xvYWRlcl9jcmVhdGVkfTsKICAgICAgIENyZWF0ZUZyb21QYXJjZWxGb3IoY29udGV4dCk7CiAgICAgICB3cml0ZXItPkNsb3NlKCk7CkBAIC03NDUsNiArODgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IGFyZy0+R2V0VHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJjZWwgPSBfcmVwbHktPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhciA9IGFyZy0+R2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5fc2RrX3ZlcnNpb24gPSBvcHRpb25zLkdldE1pblNka1ZlcnNpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNfY2xhc3Nsb2FkZXJfY3JlYXRlZCA9ICZpc19jbGFzc2xvYWRlcl9jcmVhdGVkfTsKICAgICAgICAgUmVhZEZyb21QYXJjZWxGb3IoY29udGV4dCk7CiAgICAgICAgIHdyaXRlci0+Q2xvc2UoKTsKQEAgLTc3MCwxMCArOTA2LDEwIEBACiAgIHJldHVybiBwcm94eTsKIH0KIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVfbWV0aG9kcyhjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBDbGFzcyogaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm94eUNsYXNzPiBwcm94eUNsYXNzLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworc3RhdGljIHZvaWQgR2VuZXJhdGVNZXRob2RzKGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIENsYXNzKiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm94eUNsYXNzPiBwcm94eUNsYXNzLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGNvbnN0IGJvb2wgb25ld2F5ID0gbWV0aG9kLklzT25ld2F5KCk7CiAKICAgLy8gPT0gdGhlIFRSQU5TQUNUXyBjb25zdGFudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTc5Nyw3ICs5MzMsNyBAQAogICAvLyA9PSB0aGUgZGVjbGFyYXRpb24gaW4gdGhlIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBzdGQ6OnNoYXJlZF9wdHI8Q2xhc3NFbGVtZW50PiBkZWNsOwogICBpZiAobWV0aG9kLklzVXNlckRlZmluZWQoKSkgewotICAgIGRlY2wgPSBnZW5lcmF0ZV9pbnRlcmZhY2VfbWV0aG9kKG1ldGhvZCwgdHlwZW5hbWVzKTsKKyAgICBkZWNsID0gR2VuZXJhdGVJbnRlcmZhY2VNZXRob2QobWV0aG9kKTsKICAgfSBlbHNlIHsKICAgICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwpAQCAtODE5LDE3ICs5NTUsMTYgQEAKICAgICBib29sIG91dGxpbmVfc3R1YiA9CiAgICAgICAgIHN0dWJDbGFzcy0+dHJhbnNhY3Rfb3V0bGluZSAmJiBzdHViQ2xhc3MtPm91dGxpbmVfbWV0aG9kcy5jb3VudCgmbWV0aG9kKSAhPSAwOwogICAgIGlmIChvdXRsaW5lX3N0dWIpIHsKLSAgICAgIGdlbmVyYXRlX3N0dWJfY2FzZV9vdXRsaW5lKGlmYWNlLCBtZXRob2QsIHRyYW5zYWN0Q29kZU5hbWUsIG9uZXdheSwgc3R1YkNsYXNzLCB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKKyAgICAgIEdlbmVyYXRlU3R1YkNhc2VPdXRsaW5lKGlmYWNlLCBtZXRob2QsIHRyYW5zYWN0Q29kZU5hbWUsIG9uZXdheSwgc3R1YkNsYXNzLCB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKICAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc3R1Yl9jYXNlKGlmYWNlLCBtZXRob2QsIHRyYW5zYWN0Q29kZU5hbWUsIG9uZXdheSwgc3R1YkNsYXNzLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgICAgR2VuZXJhdGVTdHViQ2FzZShpZmFjZSwgbWV0aG9kLCB0cmFuc2FjdENvZGVOYW1lLCBvbmV3YXksIHN0dWJDbGFzcywgdHlwZW5hbWVzLCBvcHRpb25zKTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CiAgICAgICBhdXRvIGMgPSBzdGQ6Om1ha2Vfc2hhcmVkPENhc2U+KHRyYW5zYWN0Q29kZU5hbWUpOwogICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvZGU7Ci0gICAgICBjb2RlIDw8ICJkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7XG4iCi0gICAgICAgICAgIDw8ICJyZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7XG4iCisgICAgICBjb2RlIDw8ICJyZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7XG4iCiAgICAgICAgICAgIDw8ICJyZXBseS53cml0ZUludCgiIDw8IGtHZXRJbnRlcmZhY2VWZXJzaW9uIDw8ICIoKSk7XG4iCiAgICAgICAgICAgIDw8ICJyZXR1cm4gdHJ1ZTtcbiI7CiAgICAgICBjLT5zdGF0ZW1lbnRzLT5BZGQoc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50Pihjb2RlLnN0cigpKSk7CkBAIC04MzgsOCArOTczLDcgQEAKICAgICBpZiAobWV0aG9kLkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgewogICAgICAgYXV0byBjID0gc3RkOjptYWtlX3NoYXJlZDxDYXNlPih0cmFuc2FjdENvZGVOYW1lKTsKICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb2RlOwotICAgICAgY29kZSA8PCAiZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpO1xuIgotICAgICAgICAgICA8PCAicmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpO1xuIgorICAgICAgY29kZSA8PCAicmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpO1xuIgogICAgICAgICAgICA8PCAicmVwbHkud3JpdGVTdHJpbmcoIiA8PCBrR2V0SW50ZXJmYWNlSGFzaCA8PCAiKCkpO1xuIgogICAgICAgICAgICA8PCAicmV0dXJuIHRydWU7XG4iOwogICAgICAgYy0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oY29kZS5zdHIoKSkpOwpAQCAtODUwLDggKzk4NCw4IEBACiAgIC8vID09IHRoZSBwcm94eSBtZXRob2QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIHN0ZDo6c2hhcmVkX3B0cjxDbGFzc0VsZW1lbnQ+IHByb3h5ID0gbnVsbHB0cjsKICAgaWYgKG1ldGhvZC5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICBwcm94eSA9IGdlbmVyYXRlX3Byb3h5X21ldGhvZChpZmFjZSwgbWV0aG9kLCB0cmFuc2FjdENvZGVOYW1lLCBvbmV3YXksIHByb3h5Q2xhc3MsIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKKyAgICBwcm94eSA9IEdlbmVyYXRlUHJveHlNZXRob2QoaWZhY2UsIG1ldGhvZCwgdHJhbnNhY3RDb2RlTmFtZSwgb25ld2F5LCBwcm94eUNsYXNzLCB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOwogCiAgIH0gZWxzZSB7CiAgICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CkBAIC04NjIsMTcgKzk5NiwyMiBAQAogICAgICAgICAgICA8PCAiYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24ge1xuIgogICAgICAgICAgICA8PCAiICBpZiAobUNhY2hlZFZlcnNpb24gPT0gLTEpIHtcbiIKICAgICAgICAgICAgPDwgIiAgICBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iCi0gICAgICAgICAgIDw8ICIgICAgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTtcbiIKLSAgICAgICAgICAgPDwgIiAgICB0cnkge1xuIgorICAgICAgICAgICA8PCAiICAgIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7XG4iOworICAgICAgaWYgKG9wdGlvbnMuR2VuUnBjKCkpIHsKKyAgICAgICAgY29kZSA8PCAiICAgIGRhdGEubWFya0ZvckJpbmRlcihhc0JpbmRlcigpKTtcbiI7CisgICAgICB9CisgICAgICBjb2RlIDw8ICIgICAgdHJ5IHtcbiIKICAgICAgICAgICAgPDwgIiAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTtcbiIKICAgICAgICAgICAgPDwgIiAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi4iIDw8IHRyYW5zYWN0Q29kZU5hbWUgPDwgIiwgIgotICAgICAgICAgICA8PCAiZGF0YSwgcmVwbHksIDApO1xuIgotICAgICAgICAgICA8PCAiICAgICAgaWYgKCFfc3RhdHVzKSB7XG4iCi0gICAgICAgICAgIDw8ICIgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHtcbiIKLSAgICAgICAgICAgPDwgIiAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5nZXRJbnRlcmZhY2VWZXJzaW9uKCk7XG4iCi0gICAgICAgICAgIDw8ICIgICAgICAgIH1cbiIKLSAgICAgICAgICAgPDwgIiAgICAgIH1cbiIKLSAgICAgICAgICAgPDwgIiAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgICAgPDwgImRhdGEsIHJlcGx5LCAwKTtcbiI7CisgICAgICBpZiAoaWZhY2UuSXNKYXZhRGVmYXVsdCgpKSB7CisgICAgICAgIGNvZGUgPDwgIiAgICAgIGlmICghX3N0YXR1cykge1xuIgorICAgICAgICAgICAgIDw8ICIgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHtcbiIKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLmdldEludGVyZmFjZVZlcnNpb24oKTtcbiIKKyAgICAgICAgICAgICA8PCAiICAgICAgICB9XG4iCisgICAgICAgICAgICAgPDwgIiAgICAgIH1cbiI7CisgICAgICB9CisgICAgICBjb2RlIDw8ICIgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7XG4iCiAgICAgICAgICAgIDw8ICIgICAgICBtQ2FjaGVkVmVyc2lvbiA9IHJlcGx5LnJlYWRJbnQoKTtcbiIKICAgICAgICAgICAgPDwgIiAgICB9IGZpbmFsbHkge1xuIgogICAgICAgICAgICA8PCAiICAgICAgcmVwbHkucmVjeWNsZSgpO1xuIgpAQCAtODkxLDE3ICsxMDMwLDIyIEBACiAgICAgICAgICAgIDw8ICJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7XG4iCiAgICAgICAgICAgIDw8ICIgIGlmIChcIi0xXCIuZXF1YWxzKG1DYWNoZWRIYXNoKSkge1xuIgogICAgICAgICAgICA8PCAiICAgIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTtcbiIKLSAgICAgICAgICAgPDwgIiAgICBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpO1xuIgotICAgICAgICAgICA8PCAiICAgIHRyeSB7XG4iCisgICAgICAgICAgIDw8ICIgICAgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTtcbiI7CisgICAgICBpZiAob3B0aW9ucy5HZW5ScGMoKSkgeworICAgICAgICBjb2RlIDw8ICIgICAgZGF0YS5tYXJrRm9yQmluZGVyKGFzQmluZGVyKCkpO1xuIjsKKyAgICAgIH0KKyAgICAgIGNvZGUgPDwgIiAgICB0cnkge1xuIgogICAgICAgICAgICA8PCAiICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpO1xuIgogICAgICAgICAgICA8PCAiICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLiIgPDwgdHJhbnNhY3RDb2RlTmFtZSA8PCAiLCAiCi0gICAgICAgICAgIDw8ICJkYXRhLCByZXBseSwgMCk7XG4iCi0gICAgICAgICAgIDw8ICIgICAgICBpZiAoIV9zdGF0dXMpIHtcbiIKLSAgICAgICAgICAgPDwgIiAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkge1xuIgotICAgICAgICAgICA8PCAiICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLmdldEludGVyZmFjZUhhc2goKTtcbiIKLSAgICAgICAgICAgPDwgIiAgICAgICAgfVxuIgotICAgICAgICAgICA8PCAiICAgICAgfVxuIgotICAgICAgICAgICA8PCAiICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpO1xuIgorICAgICAgICAgICA8PCAiZGF0YSwgcmVwbHksIDApO1xuIjsKKyAgICAgIGlmIChpZmFjZS5Jc0phdmFEZWZhdWx0KCkpIHsKKyAgICAgICAgY29kZSA8PCAiICAgICAgaWYgKCFfc3RhdHVzKSB7XG4iCisgICAgICAgICAgICAgPDwgIiAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkge1xuIgorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuZ2V0SW50ZXJmYWNlSGFzaCgpO1xuIgorICAgICAgICAgICAgIDw8ICIgICAgICAgIH1cbiIKKyAgICAgICAgICAgICA8PCAiICAgICAgfVxuIjsKKyAgICAgIH0KKyAgICAgIGNvZGUgPDwgIiAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTtcbiIKICAgICAgICAgICAgPDwgIiAgICAgIG1DYWNoZWRIYXNoID0gcmVwbHkucmVhZFN0cmluZygpO1xuIgogICAgICAgICAgICA8PCAiICAgIH0gZmluYWxseSB7XG4iCiAgICAgICAgICAgIDw8ICIgICAgICByZXBseS5yZWN5Y2xlKCk7XG4iCkBAIC05MTgsMTQgKzEwNjIsMTQgQEAKICAgfQogfQogCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9pbnRlcmZhY2VfZGVzY3JpcHRvcnMoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MqIGludGVyZmFjZSwgc3RkOjpzaGFyZWRfcHRyPFN0dWJDbGFzcz4gc3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UHJveHlDbGFzcz4gcHJveHkpIHsKK3N0YXRpYyB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlRGVzY3JpcHRvcnMoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzKiBpbnRlcmZhY2UsIHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm94eUNsYXNzPiBwcm94eSkgewogICAvLyB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgdHJhbnNhY3Rpb24gaGFuZGxlcgogICBhdXRvIGMgPSBzdGQ6Om1ha2Vfc2hhcmVkPENhc2U+KCJJTlRFUkZBQ0VfVFJBTlNBQ1RJT04iKTsKICAgYy0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kQ2FsbD4oCiAgICAgICBzdHViLT50cmFuc2FjdF9yZXBseSwgIndyaXRlU3RyaW5nIiwKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxFeHByZXNzaW9uPj57c3R1Yi0+Z2V0X3RyYW5zYWN0X2Rlc2NyaXB0b3IobnVsbHB0cil9KSk7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RXhwcmVzc2lvbj4+e3N0dWItPkdldFRyYW5zYWN0RGVzY3JpcHRvcihudWxscHRyKX0pKTsKICAgYy0+c3RhdGVtZW50cy0+QWRkKHN0ZDo6bWFrZV9zaGFyZWQ8UmV0dXJuU3RhdGVtZW50PihUUlVFX1ZBTFVFKSk7CiAgIHN0dWItPnRyYW5zYWN0X3N3aXRjaF9tZXRhLT5jYXNlcy5wdXNoX2JhY2soYyk7CiAKQEAgLTk3Myw5ICsxMTE3LDggQEAKIC8vIG51bWJlciBvZiBtZXRob2RzIG5vdCBvdXRsaW5lZCAoYXJlIGtlcHQgaW4gdGhlIG9uVHJhbnNhY3QoKSBtZXRob2QpLgogLy8KIC8vIFJlcXVpcmVtZW50czogbm9uX291dGxpbmVfY291bnQgPD0gb3V0bGluZV90aHJlc2hvbGQuCi1zdGF0aWMgdm9pZCBjb21wdXRlX291dGxpbmVfbWV0aG9kcyhjb25zdCBBaWRsSW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTdHViQ2xhc3M+IHN0dWIsIHNpemVfdCBvdXRsaW5lX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub25fb3V0bGluZV9jb3VudCkgeworc3RhdGljIHZvaWQgQ29tcHV0ZU91dGxpbmVNZXRob2RzKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3R1YkNsYXNzPiBzdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRsaW5lX3RocmVzaG9sZCwgc2l6ZV90IG5vbl9vdXRsaW5lX2NvdW50KSB7CiAgIEFJRExfRkFUQUxfSUYobm9uX291dGxpbmVfY291bnQgPiBvdXRsaW5lX3RocmVzaG9sZCwgaWZhY2UpOwogICAvLyBXZSdsbCBvdXRsaW5lIChjcmVhdGUgc3ViIG1ldGhvZHMpIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gbWluX21ldGhvZHMKICAgLy8gY2FzZXMuCkBAIC0xMDAwLDMxICsxMTQzLDI5IEBACiAgIH0KIH0KIAotc3RhdGljIHNoYXJlZF9wdHI8Q2xhc3NFbGVtZW50PiBnZW5lcmF0ZV9kZWZhdWx0X2ltcGxfbWV0aG9kKGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3N0YXRpYyBzaGFyZWRfcHRyPENsYXNzRWxlbWVudD4gR2VuZXJhdGVEZWZhdWx0SW1wbE1ldGhvZChjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QpIHsKICAgYXV0byBkZWZhdWx0X21ldGhvZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kPigpOwogICBkZWZhdWx0X21ldGhvZC0+Y29tbWVudCA9IEdlbmVyYXRlQ29tbWVudHMobWV0aG9kKTsKICAgZGVmYXVsdF9tZXRob2QtPm1vZGlmaWVycyA9IFBVQkxJQyB8IE9WRVJSSURFOwotICBkZWZhdWx0X21ldGhvZC0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICBkZWZhdWx0X21ldGhvZC0+cmV0dXJuVHlwZSA9IEphdmFTaWduYXR1cmVPZihtZXRob2QuR2V0VHlwZSgpKTsKICAgZGVmYXVsdF9tZXRob2QtPm5hbWUgPSBtZXRob2QuR2V0TmFtZSgpOwogICBkZWZhdWx0X21ldGhvZC0+c3RhdGVtZW50cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhdGVtZW50QmxvY2s+KCk7CiAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CiAgICAgZGVmYXVsdF9tZXRob2QtPnBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCksIHR5cGVuYW1lcyksIGFyZy0+R2V0TmFtZSgpKSk7CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VmFyaWFibGU+KEphdmFTaWduYXR1cmVPZihhcmctPkdldFR5cGUoKSksIGFyZy0+R2V0TmFtZSgpKSk7CiAgIH0KICAgZGVmYXVsdF9tZXRob2QtPmV4Y2VwdGlvbnMucHVzaF9iYWNrKCJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiIpOwogCiAgIGlmIChtZXRob2QuR2V0VHlwZSgpLkdldE5hbWUoKSAhPSAidm9pZCIpIHsKLSAgICBjb25zdCBzdHJpbmcmIGRlZmF1bHRWYWx1ZSA9IERlZmF1bHRKYXZhVmFsdWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMpOworICAgIGNvbnN0IHN0cmluZyYgZGVmYXVsdFZhbHVlID0gRGVmYXVsdEphdmFWYWx1ZU9mKG1ldGhvZC5HZXRUeXBlKCkpOwogICAgIGRlZmF1bHRfbWV0aG9kLT5zdGF0ZW1lbnRzLT5BZGQoCiAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbFN0YXRlbWVudD4oU3RyaW5nUHJpbnRmKCJyZXR1cm4gJXM7XG4iLCBkZWZhdWx0VmFsdWUuY19zdHIoKSkpKTsKICAgfQogICByZXR1cm4gZGVmYXVsdF9tZXRob2Q7CiB9CiAKLXN0YXRpYyBzaGFyZWRfcHRyPENsYXNzPiBnZW5lcmF0ZV9kZWZhdWx0X2ltcGxfY2xhc3MoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworc3RhdGljIHNoYXJlZF9wdHI8Q2xhc3M+IEdlbmVyYXRlRGVmYXVsdEltcGxDbGFzcyhjb25zdCBBaWRsSW50ZXJmYWNlJiBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBhdXRvIGRlZmF1bHRfY2xhc3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPENsYXNzPigpOwogICBkZWZhdWx0X2NsYXNzLT5jb21tZW50ID0gIi8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciAiICsgaWZhY2UuR2V0TmFtZSgpICsgIi4gKi8iOwogICBkZWZhdWx0X2NsYXNzLT5tb2RpZmllcnMgPSBQVUJMSUMgfCBTVEFUSUM7CkBAIC0xMDM0LDcgKzExNzUsNyBAQAogCiAgIGZvciAoY29uc3QgYXV0byYgbSA6IGlmYWNlLkdldE1ldGhvZHMoKSkgewogICAgIGlmIChtLT5Jc1VzZXJEZWZpbmVkKCkpIHsKLSAgICAgIGRlZmF1bHRfY2xhc3MtPmVsZW1lbnRzLmVtcGxhY2VfYmFjayhnZW5lcmF0ZV9kZWZhdWx0X2ltcGxfbWV0aG9kKCptLCB0eXBlbmFtZXMpKTsKKyAgICAgIGRlZmF1bHRfY2xhc3MtPmVsZW1lbnRzLmVtcGxhY2VfYmFjayhHZW5lcmF0ZURlZmF1bHRJbXBsTWV0aG9kKCptKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIFRoZXNlIGFyZSBjYWxsZWQgb25seSB3aGVuIHRoZSByZW1vdGUgc2lkZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlc2UKICAgICAgIC8vIG1ldGhvZHMsIHdoaWNoIGlzIG5vcm1hbGx5IGltcG9zc2libGUsIGJlY2F1c2UgdGhlc2UgbWV0aG9kcyBhcmUKQEAgLTEwNzAsOSArMTIxMSw5OSBAQAogICByZXR1cm4gZGVmYXVsdF9jbGFzczsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPENsYXNzPiBnZW5lcmF0ZV9iaW5kZXJfaW50ZXJmYWNlX2NsYXNzKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CitzdGF0aWMgc2hhcmVkX3B0cjxDbGFzc0VsZW1lbnQ+IEdlbmVyYXRlRGVsZWdhdG9yTWV0aG9kKGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCkgeworICBhdXRvIGRlbGVnYXRvcl9tZXRob2QgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZD4oKTsKKyAgZGVsZWdhdG9yX21ldGhvZC0+Y29tbWVudCA9IEdlbmVyYXRlQ29tbWVudHMobWV0aG9kKTsKKyAgZGVsZWdhdG9yX21ldGhvZC0+bW9kaWZpZXJzID0gUFVCTElDIHwgT1ZFUlJJREU7CisgIGRlbGVnYXRvcl9tZXRob2QtPnJldHVyblR5cGUgPSBKYXZhU2lnbmF0dXJlT2YobWV0aG9kLkdldFR5cGUoKSk7CisgIGRlbGVnYXRvcl9tZXRob2QtPm5hbWUgPSBtZXRob2QuR2V0TmFtZSgpOworICBkZWxlZ2F0b3JfbWV0aG9kLT5zdGF0ZW1lbnRzID0gc3RkOjptYWtlX3NoYXJlZDxTdGF0ZW1lbnRCbG9jaz4oKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ05hbWVzOworICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgeworICAgIGRlbGVnYXRvcl9tZXRob2QtPnBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFZhcmlhYmxlPihKYXZhU2lnbmF0dXJlT2YoYXJnLT5HZXRUeXBlKCkpLCBhcmctPkdldE5hbWUoKSkpOworICAgIGFyZ05hbWVzLnB1c2hfYmFjayhhcmctPkdldE5hbWUoKSk7CisgIH0KKyAgZGVsZWdhdG9yX21ldGhvZC0+ZXhjZXB0aW9ucy5wdXNoX2JhY2soImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIik7CisKKyAgc3RkOjpzdHJpbmcgcmV0dXJuX3N0cjsKKyAgaWYgKG1ldGhvZC5HZXRUeXBlKCkuR2V0TmFtZSgpICE9ICJ2b2lkIikgeworICAgIHJldHVybl9zdHIgPSAicmV0dXJuICI7CisgIH0KKyAgZGVsZWdhdG9yX21ldGhvZC0+c3RhdGVtZW50cy0+QWRkKAorICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsU3RhdGVtZW50PihyZXR1cm5fc3RyICsgIm1JbXBsLiIgKyBtZXRob2QuR2V0TmFtZSgpICsgIigiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6Sm9pbihhcmdOYW1lcywgIiwiKSArICIpO1xuIikpOworICByZXR1cm4gZGVsZWdhdG9yX21ldGhvZDsKK30KKworc3RhdGljIHNoYXJlZF9wdHI8Q2xhc3M+IEdlbmVyYXRlRGVsZWdhdG9yQ2xhc3MoY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGF1dG8gZGVsZWdhdG9yX2NsYXNzID0gc3RkOjptYWtlX3NoYXJlZDxDbGFzcz4oKTsKKyAgZGVsZWdhdG9yX2NsYXNzLT5jb21tZW50ID0gIi8qKiBEZWxlZ2F0b3IgaW1wbGVtZW50YXRpb24gZm9yICIgKyBpZmFjZS5HZXROYW1lKCkgKyAiLiAqLyI7CisgIGRlbGVnYXRvcl9jbGFzcy0+bW9kaWZpZXJzID0gUFVCTElDIHwgU1RBVElDOworICBkZWxlZ2F0b3JfY2xhc3MtPndoYXQgPSBDbGFzczo6Q0xBU1M7CisgIGRlbGVnYXRvcl9jbGFzcy0+dHlwZSA9IGlmYWNlLkdldENhbm9uaWNhbE5hbWUoKSArICIuRGVsZWdhdG9yIjsKKyAgZGVsZWdhdG9yX2NsYXNzLT5leHRlbmRzID0gaWZhY2UuR2V0Q2Fub25pY2FsTmFtZSgpICsgIi5TdHViIjsKKworICAvLyBjb25zdHJ1Y3RvcgorICBkZWxlZ2F0b3JfY2xhc3MtPmVsZW1lbnRzLmVtcGxhY2VfYmFjaygKKyAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oInB1YmxpYyBEZWxlZ2F0b3IoIiArIGlmYWNlLkdldENhbm9uaWNhbE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW1wbCkge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB0aGlzLm1JbXBsID0gaW1wbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpKTsKKyAgLy8gbWV0YSBtZXRob2RzCisgIGlmICghb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgIGRlbGVnYXRvcl9jbGFzcy0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KCJAT3ZlcnJpZGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIFN0cmluZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrR2V0SW50ZXJmYWNlSGFzaCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIG1JbXBsLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHZXRJbnRlcmZhY2VIYXNoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpKTsKKyAgfQorICBpZiAob3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CisgICAgZGVsZWdhdG9yX2NsYXNzLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oIkBPdmVycmlkZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWMgaW50ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHZXRJbnRlcmZhY2VWZXJzaW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgaW1wbFZlciA9IG1JbXBsLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHZXRJbnRlcmZhY2VWZXJzaW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIFZFUlNJT04gPCBpbXBsVmVyID8gVkVSU0lPTiA6IGltcGxWZXI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIpKTsKKyAgfQorCisgIC8vIHVzZXIgZGVmaW5lZCBtZXRob2RzCisgIGZvciAoY29uc3QgYXV0byYgbSA6IGlmYWNlLkdldE1ldGhvZHMoKSkgeworICAgIGlmIChtLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIGRlbGVnYXRvcl9jbGFzcy0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKEdlbmVyYXRlRGVsZWdhdG9yTWV0aG9kKCptKSk7CisgICAgfQorICB9CisKKyAgZGVsZWdhdG9yX2NsYXNzLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soCisgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KGlmYWNlLkdldENhbm9uaWNhbE5hbWUoKSArICIgbUltcGw7XG4iKSk7CisKKyAgcmV0dXJuIGRlbGVnYXRvcl9jbGFzczsKK30KKworc3RhdGljIHNoYXJlZF9wdHI8Q2xhc3NFbGVtZW50PiBHZW5lcmF0ZU1heFRyYW5zYWN0aW9uSWQoaW50IG1heF90cmFuc2FjdGlvbl9pZCkgeworICBhdXRvIGdldE1heFRyYW5zYWN0aW9uSWQgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZD4oKTsKKyAgZ2V0TWF4VHJhbnNhY3Rpb25JZC0+Y29tbWVudCA9ICIvKiogQGhpZGUgKi8iOworICBnZXRNYXhUcmFuc2FjdGlvbklkLT5tb2RpZmllcnMgPSBQVUJMSUM7CisgIGdldE1heFRyYW5zYWN0aW9uSWQtPnJldHVyblR5cGUgPSAiaW50IjsKKyAgZ2V0TWF4VHJhbnNhY3Rpb25JZC0+bmFtZSA9ICJnZXRNYXhUcmFuc2FjdGlvbklkIjsKKyAgZ2V0TWF4VHJhbnNhY3Rpb25JZC0+c3RhdGVtZW50cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhdGVtZW50QmxvY2s+KCk7CisgIGdldE1heFRyYW5zYWN0aW9uSWQtPnN0YXRlbWVudHMtPkFkZChzdGQ6Om1ha2Vfc2hhcmVkPFJldHVyblN0YXRlbWVudD4oCisgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxFeHByZXNzaW9uPihzdGQ6OnRvX3N0cmluZyhtYXhfdHJhbnNhY3Rpb25faWQpKSkpOworICByZXR1cm4gZ2V0TWF4VHJhbnNhY3Rpb25JZDsKK30KKworc3RkOjp1bmlxdWVfcHRyPENsYXNzPiBHZW5lcmF0ZUludGVyZmFjZUNsYXNzKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIC8vIHRoZSBpbnRlcmZhY2UgY2xhc3MKICAgYXV0byBpbnRlcmZhY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPENsYXNzPigpOwogICBpbnRlcmZhY2UtPmNvbW1lbnQgPSBHZW5lcmF0ZUNvbW1lbnRzKCppZmFjZSk7CkBAIC0xMTAwLDcxICsxMzMxLDk4IEBACiAgIH0KIAogICAvLyB0aGUgZGVmYXVsdCBpbXBsIGNsYXNzCi0gIGF1dG8gZGVmYXVsdF9pbXBsID0gZ2VuZXJhdGVfZGVmYXVsdF9pbXBsX2NsYXNzKCppZmFjZSwgdHlwZW5hbWVzLCBvcHRpb25zKTsKKyAgYXV0byBkZWZhdWx0X2ltcGwgPSBHZW5lcmF0ZURlZmF1bHRJbXBsQ2xhc3MoKmlmYWNlLCBvcHRpb25zKTsKICAgaW50ZXJmYWNlLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soZGVmYXVsdF9pbXBsKTsKIAorICAvLyB0aGUgZGVsZWdhdG9yIGNsYXNzCisgIGlmIChpZmFjZS0+SXNKYXZhRGVsZWdhdG9yKCkpIHsKKyAgICBhdXRvIGRlbGVnYXRvciA9IEdlbmVyYXRlRGVsZWdhdG9yQ2xhc3MoKmlmYWNlLCBvcHRpb25zKTsKKyAgICBpbnRlcmZhY2UtPmVsZW1lbnRzLmVtcGxhY2VfYmFjayhkZWxlZ2F0b3IpOworICB9CisKICAgLy8gdGhlIHN0dWIgaW5uZXIgY2xhc3MKICAgYXV0byBzdHViID0gc3RkOjptYWtlX3NoYXJlZDxTdHViQ2xhc3M+KGlmYWNlLCBvcHRpb25zKTsKICAgaW50ZXJmYWNlLT5lbGVtZW50cy5wdXNoX2JhY2soc3R1Yik7CiAKLSAgY29tcHV0ZV9vdXRsaW5lX21ldGhvZHMoaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdF9vdXRsaW5lX3RocmVzaG9sZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdF9ub25fb3V0bGluZV9jb3VudF8pOworICBDb21wdXRlT3V0bGluZU1ldGhvZHMoaWZhY2UsIHN0dWIsIG9wdGlvbnMub25UcmFuc2FjdF9vdXRsaW5lX3RocmVzaG9sZF8sCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rfbm9uX291dGxpbmVfY291bnRfKTsKIAogICAvLyB0aGUgcHJveHkgaW5uZXIgY2xhc3MKICAgYXV0byBwcm94eSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UHJveHlDbGFzcz4oaWZhY2UsIG9wdGlvbnMpOwogICBzdHViLT5lbGVtZW50cy5wdXNoX2JhY2socHJveHkpOwogCiAgIC8vIHN0dWIgYW5kIHByb3h5IHN1cHBvcnQgZm9yIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotICBnZW5lcmF0ZV9pbnRlcmZhY2VfZGVzY3JpcHRvcnMob3B0aW9ucywgaWZhY2UsIGludGVyZmFjZS5nZXQoKSwgc3R1YiwgcHJveHkpOworICBHZW5lcmF0ZUludGVyZmFjZURlc2NyaXB0b3JzKG9wdGlvbnMsIGlmYWNlLCBpbnRlcmZhY2UuZ2V0KCksIHN0dWIsIHByb3h5KTsKIAogICAvLyBhbGwgdGhlIGRlY2xhcmVkIGNvbnN0YW50cyBvZiB0aGUgaW50ZXJmYWNlCiAgIHN0cmluZyBjb25zdGFudHM7Ci0gIGdlbmVyYXRlX2NvbnN0YW50X2RlY2xhcmF0aW9ucygqQ29kZVdyaXRlcjo6Rm9yU3RyaW5nKCZjb25zdGFudHMpLCAqaWZhY2UpOworICBHZW5lcmF0ZUNvbnN0YW50RGVjbGFyYXRpb25zKCpDb2RlV3JpdGVyOjpGb3JTdHJpbmcoJmNvbnN0YW50cyksICppZmFjZSk7CiAgIGludGVyZmFjZS0+ZWxlbWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oY29uc3RhbnRzKSk7CiAKICAgLy8gYWxsIHRoZSBkZWNsYXJlZCBtZXRob2RzIG9mIHRoZSBpbnRlcmZhY2UKLQorICBib29sIHBlcm1pc3Npb25XcmFwcGVyR2VuZXJhdGVkID0gZmFsc2U7CisgIGludCBtYXhfdHJhbnNhY3Rpb25faWQgPSAwOwogICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBpZmFjZS0+R2V0TWV0aG9kcygpKSB7Ci0gICAgZ2VuZXJhdGVfbWV0aG9kcygqaWZhY2UsICppdGVtLCBpbnRlcmZhY2UuZ2V0KCksIHN0dWIsIHByb3h5LCBpdGVtLT5HZXRJZCgpLCB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKKyAgICBpZiAoKGlmYWNlLT5FbmZvcmNlRXhwcmVzc2lvbigpIHx8IGl0ZW0tPkdldFR5cGUoKS5FbmZvcmNlRXhwcmVzc2lvbigpKSAmJgorICAgICAgICAhcGVybWlzc2lvbldyYXBwZXJHZW5lcmF0ZWQpIHsKKyAgICAgIEdlbmVyYXRlUGVybWlzc2lvbldyYXBwZXIoc3R1Yi5nZXQoKSk7CisgICAgICBwZXJtaXNzaW9uV3JhcHBlckdlbmVyYXRlZCA9IHRydWU7CisgICAgfQorICAgIEdlbmVyYXRlTWV0aG9kcygqaWZhY2UsICppdGVtLCBpbnRlcmZhY2UuZ2V0KCksIHN0dWIsIHByb3h5LCBpdGVtLT5HZXRJZCgpLCB0eXBlbmFtZXMsIG9wdGlvbnMpOworICAgIG1heF90cmFuc2FjdGlvbl9pZCA9IHN0ZDo6bWF4KG1heF90cmFuc2FjdGlvbl9pZCwgaXRlbS0+R2V0SWQoKSk7CiAgIH0KIAotICAvLyBhZGRpdGlvbmFsIHN0YXRpYyBtZXRob2RzIGZvciB0aGUgZGVmYXVsdCBpbXBsIHNldC9nZXQgdG8gdGhlCi0gIC8vIHN0dWIgY2xhc3MuIENhbid0IGFkZCB0aGVtIHRvIHRoZSBpbnRlcmZhY2UgYXMgdGhlIGdlbmVyYXRlZCBqYXZhIGZpbGVzCi0gIC8vIG1heSBiZSBjb21waWxlZCB3aXRoIEphdmEgPCAxLjcgd2hlcmUgc3RhdGljIGludGVyZmFjZSBtZXRob2QgaXNuJ3QKLSAgLy8gc3VwcG9ydGVkLgotICAvLyBUT0RPKGIvMTExNDE3MTQ1KSBtYWtlIHRoaXMgY29uZGl0aW9uYWwgZGVwZW5kaW5nIG9uIHRoZSBKYXZhIGxhbmd1YWdlCi0gIC8vIHZlcnNpb24gcmVxdWVzdGVkCi0gIGNvbnN0IHN0cmluZyBpX25hbWUgPSBpZmFjZS0+R2V0Q2Fub25pY2FsTmFtZSgpOwotICBzdHViLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PigKLSAgICAgIFN0cmluZ1ByaW50ZigicHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRJbXBsKCVzIGltcGwpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAiICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvblxuIgotICAgICAgICAgICAgICAgICAgICIgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudFxuIgotICAgICAgICAgICAgICAgICAgICIgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uXG4iCi0gICAgICAgICAgICAgICAgICAgIiAgaWYgKFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsICE9IG51bGwpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAiICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXREZWZhdWx0SW1wbCgpIGNhbGxlZCB0d2ljZVwiKTtcbiIKLSAgICAgICAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgaWYgKGltcGwgIT0gbnVsbCkge1xuIgotICAgICAgICAgICAgICAgICAgICIgICAgU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgPSBpbXBsO1xuIgotICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRydWU7XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgfVxuIgotICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICAgICAgICBpX25hbWUuY19zdHIoKSkpKTsKLSAgc3R1Yi0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKAotICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PihTdHJpbmdQcmludGYoInB1YmxpYyBzdGF0aWMgJXMgZ2V0RGVmYXVsdEltcGwoKSB7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGw7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfbmFtZS5jX3N0cigpKSkpOworICAvLyBnZXRNYXhUcmFuc2FjdGlvbklkCisgIGlmIChvcHRpb25zLkdlblRyYW5zYWN0aW9uTmFtZXMoKSkgeworICAgIHN0dWItPmVsZW1lbnRzLnB1c2hfYmFjayhHZW5lcmF0ZU1heFRyYW5zYWN0aW9uSWQobWF4X3RyYW5zYWN0aW9uX2lkKSk7CisgIH0KIAotICAvLyB0aGUgc3RhdGljIGZpZWxkIGlzIGRlZmluZWQgaW4gdGhlIHByb3h5IGNsYXNzLCBub3QgaW4gdGhlIGludGVyZmFjZSBjbGFzcwotICAvLyBiZWNhdXNlIGFsbCBmaWVsZHMgaW4gYW4gaW50ZXJmYWNlIGNsYXNzIGFyZSBieSBkZWZhdWx0IGZpbmFsLgotICBwcm94eS0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8TGl0ZXJhbENsYXNzRWxlbWVudD4oCi0gICAgICBTdHJpbmdQcmludGYoInB1YmxpYyBzdGF0aWMgJXMgc0RlZmF1bHRJbXBsO1xuIiwgaV9uYW1lLmNfc3RyKCkpKSk7CisgIC8vIGFsbCB0aGUgbmVzdGVkIHR5cGVzCisgIHN0cmluZyBjb2RlOworICBhdXRvIHdyaXRlciA9IENvZGVXcml0ZXI6OkZvclN0cmluZygmY29kZSk7CisgIGZvciAoY29uc3QgYXV0byYgbmVzdGVkIDogaWZhY2UtPkdldE5lc3RlZFR5cGVzKCkpIHsKKyAgICBHZW5lcmF0ZUNsYXNzKCp3cml0ZXIsICpuZXN0ZWQsIHR5cGVuYW1lcywgb3B0aW9ucyk7CisgIH0KKyAgR2VuZXJhdGVQYXJjZWxIZWxwZXJzKCp3cml0ZXIsICppZmFjZSwgb3B0aW9ucyk7CisgIHdyaXRlci0+Q2xvc2UoKTsKKyAgaW50ZXJmYWNlLT5lbGVtZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50Pihjb2RlKSk7CiAKLSAgc3R1Yi0+ZmluaXNoKCk7CisgIGlmIChpZmFjZS0+SXNKYXZhRGVmYXVsdCgpKSB7CisgICAgLy8gYWRkaXRpb25hbCBzdGF0aWMgbWV0aG9kcyBmb3IgdGhlIGRlZmF1bHQgaW1wbCBzZXQvZ2V0IHRvIHRoZQorICAgIC8vIHN0dWIgY2xhc3MuIENhbid0IGFkZCB0aGVtIHRvIHRoZSBpbnRlcmZhY2UgYXMgdGhlIGdlbmVyYXRlZCBqYXZhIGZpbGVzCisgICAgLy8gbWF5IGJlIGNvbXBpbGVkIHdpdGggSmF2YSA8IDEuNyB3aGVyZSBzdGF0aWMgaW50ZXJmYWNlIG1ldGhvZCBpc24ndAorICAgIC8vIHN1cHBvcnRlZC4KKyAgICAvLyBUT0RPKGIvMTExNDE3MTQ1KSBtYWtlIHRoaXMgY29uZGl0aW9uYWwgZGVwZW5kaW5nIG9uIHRoZSBKYXZhIGxhbmd1YWdlCisgICAgLy8gdmVyc2lvbiByZXF1ZXN0ZWQKKyAgICBjb25zdCBzdHJpbmcgaV9uYW1lID0gaWZhY2UtPkdldENhbm9uaWNhbE5hbWUoKTsKKyAgICBzdHViLT5lbGVtZW50cy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3NoYXJlZDxMaXRlcmFsQ2xhc3NFbGVtZW50PigKKyAgICAgICAgU3RyaW5nUHJpbnRmKCJwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdEltcGwoJXMgaW1wbCkge1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb25cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIGlmIChTdHViLlByb3h5LnNEZWZhdWx0SW1wbCAhPSBudWxsKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXREZWZhdWx0SW1wbCgpIGNhbGxlZCB0d2ljZVwiKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIGlmIChpbXBsICE9IG51bGwpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICAgU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgPSBpbXBsO1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICAgICAgaV9uYW1lLmNfc3RyKCkpKSk7CisgICAgc3R1Yi0+ZWxlbWVudHMuZW1wbGFjZV9iYWNrKAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KFN0cmluZ1ByaW50ZigicHVibGljIHN0YXRpYyAlcyBnZXREZWZhdWx0SW1wbCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV9uYW1lLmNfc3RyKCkpKSk7CisKKyAgICAvLyB0aGUgc3RhdGljIGZpZWxkIGlzIGRlZmluZWQgaW4gdGhlIHByb3h5IGNsYXNzLCBub3QgaW4gdGhlIGludGVyZmFjZSBjbGFzcworICAgIC8vIGJlY2F1c2UgYWxsIGZpZWxkcyBpbiBhbiBpbnRlcmZhY2UgY2xhc3MgYXJlIGJ5IGRlZmF1bHQgZmluYWwuCisgICAgcHJveHktPmVsZW1lbnRzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPExpdGVyYWxDbGFzc0VsZW1lbnQ+KAorICAgICAgICBTdHJpbmdQcmludGYoInB1YmxpYyBzdGF0aWMgJXMgc0RlZmF1bHRJbXBsO1xuIiwgaV9uYW1lLmNfc3RyKCkpKSk7CisgIH0KKworICBzdHViLT5GaW5pc2goKTsKIAogICByZXR1cm4gaW50ZXJmYWNlOwogfQpkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfbmRrLmNwcCBiL2dlbmVyYXRlX25kay5jcHAKaW5kZXggY2E4ZDY2Yy4uZDdiNjY2MyAxMDA2NDQKLS0tIGEvZ2VuZXJhdGVfbmRrLmNwcAorKysgYi9nZW5lcmF0ZV9uZGsuY3BwCkBAIC0yOCw3ICsyOCw2IEBACiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgbmRrIHsKIAotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xhenogPSAiX2dfYWlkbF9jbGF6eiI7CiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtEZXNjcmlwdG9yID0gImRlc2NyaXB0b3IiOwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrVmVyc2lvbiA9ICJ2ZXJzaW9uIjsKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0hhc2ggPSAiaGFzaCI7CkBAIC0zNiwxNDQgKzM1LDg3IEBACiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtDYWNoZWRIYXNoID0gIl9haWRsX2NhY2hlZF9oYXNoIjsKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0NhY2hlZEhhc2hNdXRleCA9ICJfYWlkbF9jYWNoZWRfaGFzaF9tdXRleCI7CiAKLXVzaW5nIG5hbWVzcGFjZSBpbnRlcm5hbHM7CiBuYW1lc3BhY2UgaW50ZXJuYWxzIHsKLXZvaWQgR2VuZXJhdGVQYXJjZWxIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworLy8gNCBvdXRwdXRzIGZvciBOREsgZm9yIGVhY2ggdHlwZTogSGVhZGVyLCBCcEhlYWRlciwgQm5IZWFkZXIsIFNvdXJjZQordm9pZCBHZW5lcmF0ZUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlQ2xpZW50SGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIEhlYWRlciBjb250YWlucyBDbGFzc0RlY2wgb2YgYSByb290IHR5cGUKK3ZvaWQgR2VuZXJhdGVJbnRlcmZhY2VDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbGFibGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBCcEhlYWRlci9CbkhlYWRlciBmb3IgaW50ZXJmYWNlCit2b2lkIEdlbmVyYXRlQ2xpZW50SGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlU2VydmVySGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIFNvdXJjZSBmb3IgaW50ZXJmYWNlCit2b2lkIEdlbmVyYXRlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgR2VuZXJhdGVDbGFzc1NvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlQ2xpZW50U291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlU2VydmVyU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Cit2b2lkIEdlbmVyYXRlSW50ZXJmYWNlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIFNvdXJjZSBmb3Igc3RydWN0dXJlZCBwYXJjZWxhYmxlCiB2b2lkIEdlbmVyYXRlUGFyY2VsU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLXZvaWQgR2VuZXJhdGVQYXJjZWxIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gU291cmNlIGZvciB1bmlvbgogdm9pZCBHZW5lcmF0ZVBhcmNlbFNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisvLyBDb21wYXJlIGhlYWRlcnMgc28gdGhhdCA8YW5kcm9pZC8uLj4gYW5kIDxhaWRsLy4uPiBjb21lcyBhZnRlciBvdGhlciAocHJvYmFibHkpIHN0ZCBoZWFkZXJzLgorc3RydWN0IEhlYWRlckNvbXAgeworICBzdGF0aWMgaW50IHJhbmsoY29uc3Qgc3RyaW5nJiBhKSB7CisgICAgcmV0dXJuIGJhc2U6OlN0YXJ0c1dpdGgoYSwgImFpZGwvIikgPyAyIDogYmFzZTo6U3RhcnRzV2l0aChhLCAiYW5kcm9pZC8iKSA/IDEgOiAwOworICB9CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIGEsIGNvbnN0IHN0cmluZyYgYikgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUocmFuayhhKSwgYSkgPCBzdGQ6Om1ha2VfdHVwbGUocmFuayhiKSwgYik7CisgIH0KK307CiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWxzCiAKK3VzaW5nIG5hbWVzcGFjZSBpbnRlcm5hbHM7CiB1c2luZyBjcHA6OkNsYXNzTmFtZXM7Ci0KLXZvaWQgR2VuZXJhdGVOZGtJbnRlcmZhY2UoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgY29uc3Qgc3RyaW5nIGlfaGVhZGVyID0gb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGlfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoaV9oZWFkZXIpKTsKLSAgR2VuZXJhdGVJbnRlcmZhY2VIZWFkZXIoKmlfd3JpdGVyLCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKLSAgQUlETF9GQVRBTF9JRighaV93cml0ZXItPkNsb3NlKCksIGlfaGVhZGVyKTsKLQotICBjb25zdCBzdHJpbmcgYnBfaGVhZGVyID0KLSAgICAgIG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBicF93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihicF9oZWFkZXIpKTsKLSAgR2VuZXJhdGVDbGllbnRIZWFkZXIoKmJwX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0gIEFJRExfRkFUQUxfSUYoIWJwX3dyaXRlci0+Q2xvc2UoKSwgYnBfaGVhZGVyKTsKLQotICBjb25zdCBzdHJpbmcgYm5faGVhZGVyID0KLSAgICAgIG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBibl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihibl9oZWFkZXIpKTsKLSAgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIoKmJuX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0gIEFJRExfRkFUQUxfSUYoIWJuX3dyaXRlci0+Q2xvc2UoKSwgYm5faGVhZGVyKTsKLQotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHNvdXJjZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKG91dHB1dF9maWxlKTsKLSAgR2VuZXJhdGVTb3VyY2UoKnNvdXJjZV93cml0ZXIsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOwotICBBSURMX0ZBVEFMX0lGKCFzb3VyY2Vfd3JpdGVyLT5DbG9zZSgpLCBvdXRwdXRfZmlsZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQYXJjZWxhYmxlVHlwZT4KLXZvaWQgR2VuZXJhdGVOZGtQYXJjZWwoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IFBhcmNlbGFibGVUeXBlJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIGNvbnN0IHN0cmluZyBoZWFkZXJfcGF0aCA9Ci0gICAgICBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVyk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gaGVhZGVyX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGhlYWRlcl9wYXRoKSk7Ci0gIEdlbmVyYXRlUGFyY2VsSGVhZGVyKCpoZWFkZXJfd3JpdGVyLCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKLQotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHNvdXJjZV93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihvdXRwdXRfZmlsZSkpOwotICBpZiAoZGVmaW5lZF90eXBlLklzR2VuZXJpYygpKSB7Ci0gICAgLy8gTmVlZCB0byB3cml0ZSBzb3VyY2UgdG8gaGVhZGVyIGlmIHRoaXMgaXMgYSB0ZW1wbGF0ZQotICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKCpoZWFkZXJfd3JpdGVyLCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKLSAgfSBlbHNlIHsKLSAgICBHZW5lcmF0ZVBhcmNlbFNvdXJjZSgqc291cmNlX3dyaXRlciwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7Ci0gIH0KLSAgKHNvdXJjZV93cml0ZXItPkNsb3NlKCkpOwotICBBSURMX0ZBVEFMX0lGKCFoZWFkZXJfd3JpdGVyLT5DbG9zZSgpLCBoZWFkZXJfcGF0aCk7Ci0KLSAgY29uc3Qgc3RyaW5nIGJwX2hlYWRlciA9Ci0gICAgICBvcHRpb25zLk91dHB1dEhlYWRlckRpcigpICsgTmRrSGVhZGVyRmlsZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCk7Ci0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gYnBfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoYnBfaGVhZGVyKSk7Ci0gICpicF93cml0ZXIgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXNcbiI7Ci0gIEFJRExfRkFUQUxfSUYoIWJwX3dyaXRlci0+Q2xvc2UoKSwgYnBfaGVhZGVyKTsKLQotICBjb25zdCBzdHJpbmcgYm5faGVhZGVyID0KLSAgICAgIG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBibl93cml0ZXIoaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihibl9oZWFkZXIpKTsKLSAgKmJuX3dyaXRlciA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGRlZmluZWRfdHlwZXMgZG8gbm90IGhhdmUgYm4gY2xhc3Nlc1xuIjsKLSAgQUlETF9GQVRBTF9JRighYm5fd3JpdGVyLT5DbG9zZSgpLCBibl9oZWFkZXIpOwotfQotCi12b2lkIEdlbmVyYXRlTmRrUGFyY2VsRGVjbGFyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7Ci0gICpjb2RlX3dyaXRlcgotICAgICAgPDwgIi8vIFRoaXMgZmlsZSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgYXMgcGxhY2Vob2xkZXIgZm9yIHBhcmNlbCBkZWNsYXJhdGlvbi5cbiI7Ci0gIEFJRExfRkFUQUxfSUYoIWNvZGVfd3JpdGVyLT5DbG9zZSgpLCBmaWxlbmFtZSk7Ci19Ci0KLXZvaWQgR2VuZXJhdGVOZGtFbnVtRGVjbGFyYXRpb24oY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgY29uc3Qgc3RyaW5nIGhlYWRlcl9wYXRoID0KLSAgICAgIG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXKTsKLSAgdW5pcXVlX3B0cjxDb2RlV3JpdGVyPiBoZWFkZXJfd3JpdGVyKGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoaGVhZGVyX3BhdGgpKTsKLSAgR2VuZXJhdGVFbnVtSGVhZGVyKCpoZWFkZXJfd3JpdGVyLCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKLSAgQUlETF9GQVRBTF9JRighaGVhZGVyX3dyaXRlci0+Q2xvc2UoKSwgaGVhZGVyX3BhdGgpOwotCi0gIGNvbnN0IHN0cmluZyBicF9oZWFkZXIgPQotICAgICAgb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJwX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJwX2hlYWRlcikpOwotICAqYnBfd3JpdGVyIDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYnAgY2xhc3Nlc1xuIjsKLSAgQUlETF9GQVRBTF9JRighYnBfd3JpdGVyLT5DbG9zZSgpLCBicF9oZWFkZXIpOwotCi0gIGNvbnN0IHN0cmluZyBibl9oZWFkZXIgPQotICAgICAgb3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpOwotICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IGJuX3dyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGJuX2hlYWRlcikpOwotICAqYm5fd3JpdGVyIDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZW51bXMgZG8gbm90IGhhdmUgYm4gY2xhc3Nlc1xuIjsKLSAgQUlETF9GQVRBTF9JRighYm5fd3JpdGVyLT5DbG9zZSgpLCBibl9oZWFkZXIpOwotCi0gIHVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gc291cmNlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIob3V0cHV0X2ZpbGUpOwotICAqc291cmNlX3dyaXRlcgotICAgICAgPDwgIi8vIFRoaXMgZmlsZSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgYXMgcGxhY2Vob2xkZXIgZm9yIGVudW0gZGVjbGFyYXRpb24uXG4iOwotICBBSURMX0ZBVEFMX0lGKCFzb3VyY2Vfd3JpdGVyLT5DbG9zZSgpLCBvdXRwdXRfZmlsZSk7Ci19Cit1c2luZyBjcHA6OkdldFF1YWxpZmllZE5hbWU7CiAKIHZvaWQgR2VuZXJhdGVOZGsoY29uc3Qgc3RyaW5nJiBvdXRwdXRfZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgewotICBpZiAoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlID0gZGVmaW5lZF90eXBlLkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKLSAgICAgIHBhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgIEdlbmVyYXRlTmRrUGFyY2VsPEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4ob3V0cHV0X2ZpbGUsIG9wdGlvbnMsIHR5cGVzLCAqcGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX2RlbGVnYXRlKTsKLSAgICByZXR1cm47Ci0gIH0KKyAgdXNpbmcgR2VuRm4gPSB2b2lkICgqKShDb2RlV3JpdGVyICYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisgIC8vIFdyYXAgR2VuZXJhdGUqIGZ1bmN0aW9uIHRvIGhhbmRsZSBDb2RlV3JpdGVyIGZvciBhIGZpbGUuCisgIGF1dG8gZ2VuID0gWyZdKGF1dG8gZmlsZSwgR2VuRm4gZm4pIHsKKyAgICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHdyaXRlcihpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGUpKTsKKyAgICBmbigqd3JpdGVyLCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKKyAgICBBSURMX0ZBVEFMX0lGKCF3cml0ZXItPkNsb3NlKCksIGRlZmluZWRfdHlwZSkgPDwgIkkvTyBFcnJvciEiOworICB9OwogCi0gIGlmIChjb25zdCBBaWRsVW5pb25EZWNsKiB1bmlvbl9kZWNsID0gZGVmaW5lZF90eXBlLkFzVW5pb25EZWNsYXJhdGlvbigpOyB1bmlvbl9kZWNsICE9IG51bGxwdHIpIHsKLSAgICBHZW5lcmF0ZU5ka1BhcmNlbDxBaWRsVW5pb25EZWNsPihvdXRwdXRfZmlsZSwgb3B0aW9ucywgdHlwZXMsICp1bmlvbl9kZWNsLCBpb19kZWxlZ2F0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGNvbnN0IEFpZGxQYXJjZWxhYmxlKiBwYXJjZWxhYmxlX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNQYXJjZWxhYmxlKCk7Ci0gICAgICBwYXJjZWxhYmxlX2RlY2wgIT0gbnVsbHB0cikgewotICAgIEdlbmVyYXRlTmRrUGFyY2VsRGVjbGFyYXRpb24ob3V0cHV0X2ZpbGUsIGlvX2RlbGVnYXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLkFzRW51bURlY2xhcmF0aW9uKCk7Ci0gICAgICBlbnVtX2RlY2wgIT0gbnVsbHB0cikgewotICAgIEdlbmVyYXRlTmRrRW51bURlY2xhcmF0aW9uKG91dHB1dF9maWxlLCBvcHRpb25zLCB0eXBlcywgKmVudW1fZGVjbCwgaW9fZGVsZWdhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjb25zdCBBaWRsSW50ZXJmYWNlKiBpbnRlcmZhY2UgPSBkZWZpbmVkX3R5cGUuQXNJbnRlcmZhY2UoKTsgaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBHZW5lcmF0ZU5ka0ludGVyZmFjZShvdXRwdXRfZmlsZSwgb3B0aW9ucywgdHlwZXMsICppbnRlcmZhY2UsIGlvX2RlbGVnYXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIE5ESyBjcHAgZ2VuZXJhdGlvbi4iOworICBnZW4ob3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcpLCAmR2VuZXJhdGVIZWFkZXIpOworICBnZW4ob3B0aW9ucy5PdXRwdXRIZWFkZXJEaXIoKSArIE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpLAorICAgICAgJkdlbmVyYXRlQ2xpZW50SGVhZGVyKTsKKyAgZ2VuKG9wdGlvbnMuT3V0cHV0SGVhZGVyRGlyKCkgKyBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKSwKKyAgICAgICZHZW5lcmF0ZVNlcnZlckhlYWRlcik7CisgIGdlbihvdXRwdXRfZmlsZSwgJkdlbmVyYXRlU291cmNlKTsKIH0KKwogbmFtZXNwYWNlIGludGVybmFscyB7CiAKIHZvaWQgRW50ZXJOZGtOYW1lc3BhY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSkgewpAQCAtMTk1LDEyMSArMTM3LDI4NiBAQAogICBvdXQgPDwgImlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7XG5cbiI7CiB9CiAKLXN0YXRpYyB2b2lkIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUpIHsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8Y3N0ZGludD5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPG1lbW9yeT5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPG9wdGlvbmFsPlxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8c3RyaW5nPlxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8dmVjdG9yPlxuIjsKLSAgb3V0IDw8ICIjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUXG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD5cbiI7Ci0gIG91dCA8PCAiI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlRcbiI7Cit2b2lkIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAKLSAgaWYgKGRlZmluZWRfdHlwZS5Jc1NlbnNpdGl2ZURhdGEoKSkgewotICAgIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF9wbGF0Zm9ybS5oPlxuIjsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyX3BsYXRmb3JtLmg+XG4iOwotICB9Cit2b2lkIEdlbmVyYXRlQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKIAotICBhdXRvIGhlYWRlckZpbGVQYXRoID0gWyZ0eXBlc10oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGVzcGVjKSAtPiBzdGQ6OnN0cmluZyB7Ci0gICAgY29uc3QgQWlkbERlZmluZWRUeXBlKiB0eXBlID0gdHlwZXMuVHJ5R2V0RGVmaW5lZFR5cGUodHlwZXNwZWMuR2V0TmFtZSgpKTsKLSAgICBpZiAodHlwZSA9PSBudWxscHRyKSB7Ci0gICAgICAvLyBjb3VsZCBiZSBhIHByaW1pdGl2ZSB0eXBlLgotICAgICAgcmV0dXJuICIiOwordm9pZCBHZW5lcmF0ZU5lc3RlZFR5cGVEZWNscyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBhdXRvIHZpc2l0ID0gWyZdKGNvbnN0IGF1dG8mIG5lc3RlZCkgeyBHZW5lcmF0ZUNsYXNzRGVjbChvdXQsIHR5cGVzLCBuZXN0ZWQsIG9wdGlvbnMpOyB9OworICBBSURMX0ZBVEFMX0lGKCFUb3BvbG9naWNhbFZpc2l0KGRlZmluZWRfdHlwZS5HZXROZXN0ZWRUeXBlcygpLCB2aXNpdCksIGRlZmluZWRfdHlwZSkKKyAgICAgIDw8ICJDeWNsZSBkZXRlY3RlZC4iOworfQorCit2b2lkIEdlbmVyYXRlSGVhZGVyRGVmaW5pdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBDb2RlV3JpdGVyJiBvdXQ7CisgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXM7CisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9uczsKKyAgICBWaXNpdG9yKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgICAgIDogb3V0KG91dCksIHR5cGVzKHR5cGVzKSwgb3B0aW9ucyhvcHRpb25zKSB7fQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IGF1dG8gYmFja2luZ190eXBlID0gTmRrTmFtZU9mKHR5cGVzLCBlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgU3RvcmFnZU1vZGU6OlNUQUNLKTsKKyAgICAgIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZW51bV9kZWNsKTsKKyAgICAgIG91dCA8PCBjcHA6OkdlbmVyYXRlRW51bVRvU3RyaW5nKGVudW1fZGVjbCwgYmFja2luZ190eXBlKTsKKyAgICAgIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZW51bV9kZWNsKTsKKworICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgbmRrIHtcbiI7CisgICAgICBvdXQgPDwgIm5hbWVzcGFjZSBpbnRlcm5hbCB7XG4iOworICAgICAgb3V0IDw8IGNwcDo6R2VuZXJhdGVFbnVtVmFsdWVzKGVudW1fZGVjbCwgeyJhaWRsIn0pOworICAgICAgb3V0IDw8ICJ9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWxcbiI7CisgICAgICBvdXQgPDwgIn0gIC8vIG5hbWVzcGFjZSBuZGtcbiI7CiAgICAgfQogCi0gICAgaWYgKHR5cGUtPkFzSW50ZXJmYWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuIE5ka0hlYWRlckZpbGUoKnR5cGUsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pOwotICAgIH0gZWxzZSBpZiAodHlwZS0+QXNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBOZGtIZWFkZXJGaWxlKCp0eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPkFzVW5pb25EZWNsYXJhdGlvbigpICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBOZGtIZWFkZXJGaWxlKCp0eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPkFzUGFyY2VsYWJsZSgpICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiB0eXBlLT5Bc1BhcmNlbGFibGUoKS0+R2V0Q3BwSGVhZGVyKCk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBOZGtIZWFkZXJGaWxlKCp0eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKTsKLSAgICB9IGVsc2UgewotICAgICAgQUlETF9GQVRBTCgqdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlLiI7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9OwotCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBpbmNsdWRlczsKLQotICAvLyB2aXNpdCBhIHR5cGUgYW5kIGNvbGxlY3QgYWxsIHJlZmVyZW5jZSB0eXBlcycgaGVhZGVycwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUpPiB2aXNpdCA9IFsmXShjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSkgewotICAgIGluY2x1ZGVzLmluc2VydChoZWFkZXJGaWxlUGF0aCh0eXBlKSk7Ci0gICAgaWYgKHR5cGUuSXNHZW5lcmljKCkpIHsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgcGFyYW0gOiB0eXBlLkdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgdmlzaXQoKnBhcmFtKTsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsYWJsZSkgb3ZlcnJpZGUgeworICAgICAgaWYgKHBhcmNlbGFibGUuSXNHZW5lcmljKCkpIHsKKyAgICAgICAgR2VuZXJhdGVQYXJjZWxTb3VyY2Uob3V0LCB0eXBlcywgcGFyY2VsYWJsZSwgb3B0aW9ucyk7CiAgICAgICB9CiAgICAgfQotICB9OwogCi0gIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS5Bc0ludGVyZmFjZSgpOwotICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGludGVyZmFjZS0+R2V0TWV0aG9kcygpKSB7Ci0gICAgICB2aXNpdChtZXRob2QtPkdldFR5cGUoKSk7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZ3VtZW50IDogbWV0aG9kLT5HZXRBcmd1bWVudHMoKSkgewotICAgICAgICB2aXNpdChhcmd1bWVudC0+R2V0VHlwZSgpKTsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxVbmlvbkRlY2wmIHVuaW9uX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIGlmICh1bmlvbl9kZWNsLklzR2VuZXJpYygpKSB7CisgICAgICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKG91dCwgdHlwZXMsIHVuaW9uX2RlY2wsIG9wdGlvbnMpOwogICAgICAgfQogICAgIH0KLSAgfQogCi0gIGF1dG8gdmlzaXRfcGFyY2VsYWJsZSA9IFsmXShjb25zdCBhdXRvJiBwYXJjZWxhYmxlKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IHBhcmNlbGFibGUuR2V0RmllbGRzKCkpIHsKLSAgICAgIHZpc2l0KGZpZWxkLT5HZXRUeXBlKCkpOwotICAgICAgLy8gQ2hlY2sgdGhlIGZpZWxkcyBmb3IgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cwotICAgICAgaWYgKGZpZWxkLT5HZXRUeXBlKCkuSXNHZW5lcmljKCkpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0eXBlX2FyZ3VtZW50IDogZmllbGQtPkdldFR5cGUoKS5HZXRUeXBlUGFyYW1ldGVycygpKSB7Ci0gICAgICAgICAgdmlzaXQoKnR5cGVfYXJndW1lbnQpOworICB9IHYob3V0LCB0eXBlcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworfQorCit2b2lkIEdlbmVyYXRlSGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7CisgIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKKyAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOworICBHZW5lcmF0ZUNsYXNzRGVjbChvdXQsIHR5cGVzLCBkZWZpbmVkX3R5cGUsIG9wdGlvbnMpOworICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CisgIEdlbmVyYXRlSGVhZGVyRGVmaW5pdGlvbnMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKK30KKwordm9pZCBHZW5lcmF0ZUNsaWVudEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBpZmFjZSA9IEFpZGxDYXN0PEFpZGxJbnRlcmZhY2U+KGRlZmluZWRfdHlwZSk7IGlmYWNlKSB7CisgICAgR2VuZXJhdGVDbGllbnRIZWFkZXIob3V0LCB0eXBlcywgKmlmYWNlLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIHBhcmNlbGFibGUgPSBBaWRsQ2FzdDxBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXNcbiI7CisgIH0gZWxzZSBpZiAoYXV0byB1bmlvbl9kZWNsID0gQWlkbENhc3Q8QWlkbFVuaW9uRGVjbD4oZGVmaW5lZF90eXBlKTsgdW5pb25fZGVjbCkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGRlZmluZWRfdHlwZXMgZG8gbm90IGhhdmUgYnAgY2xhc3Nlc1xuIjsKKyAgfSBlbHNlIGlmIChhdXRvIGVudW1fZGVjbCA9IEFpZGxDYXN0PEFpZGxFbnVtRGVjbGFyYXRpb24+KGRlZmluZWRfdHlwZSk7IGVudW1fZGVjbCkgeworICAgIG91dCA8PCAiI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXNcbiI7CisgIH0gZWxzZSB7CisgICAgQUlETF9GQVRBTChkZWZpbmVkX3R5cGUpIDw8ICJVbnJlY29nbml6ZWQgdHlwZSBzZW50IGZvciBOREsgZ2VuZXJhdGlvbi4iOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGF1dG8gaWZhY2UgPSBBaWRsQ2FzdDxBaWRsSW50ZXJmYWNlPihkZWZpbmVkX3R5cGUpOyBpZmFjZSkgeworICAgIEdlbmVyYXRlU2VydmVySGVhZGVyKG91dCwgdHlwZXMsICppZmFjZSwgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byBwYXJjZWxhYmxlID0gQWlkbENhc3Q8QWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlPihkZWZpbmVkX3R5cGUpOyBwYXJjZWxhYmxlKSB7CisgICAgb3V0IDw8ICIjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzXG4iOworICB9IGVsc2UgaWYgKGF1dG8gdW5pb25fZGVjbCA9IEFpZGxDYXN0PEFpZGxVbmlvbkRlY2w+KGRlZmluZWRfdHlwZSk7IHVuaW9uX2RlY2wpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXNcbiI7CisgIH0gZWxzZSBpZiAoYXV0byBlbnVtX2RlY2wgPSBBaWRsQ2FzdDxBaWRsRW51bURlY2xhcmF0aW9uPihkZWZpbmVkX3R5cGUpOyBlbnVtX2RlY2wpIHsKKyAgICBvdXQgPDwgIiNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBlbnVtcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzXG4iOworICB9IGVsc2UgeworICAgIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgQ1BQIGdlbmVyYXRpb24uIjsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIENvZGVXcml0ZXImIG91dDsKKyAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlczsKKyAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zOworICAgIFZpc2l0b3IoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICAgICAgOiBvdXQob3V0KSwgdHlwZXModHlwZXMpLCBvcHRpb25zKG9wdGlvbnMpIHt9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSkgb3ZlcnJpZGUgeworICAgICAgR2VuZXJhdGVTb3VyY2Uob3V0LCB0eXBlcywgaW50ZXJmYWNlLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcGFyY2VsYWJsZSkgb3ZlcnJpZGUgeworICAgICAgaWYgKCFwYXJjZWxhYmxlLklzR2VuZXJpYygpKSB7CisgICAgICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKG91dCwgdHlwZXMsIHBhcmNlbGFibGUsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdW5pb25fZGVjbCkgb3ZlcnJpZGUgeworICAgICAgaWYgKCF1bmlvbl9kZWNsLklzR2VuZXJpYygpKSB7CisgICAgICAgIEdlbmVyYXRlUGFyY2VsU291cmNlKG91dCwgdHlwZXMsIHVuaW9uX2RlY2wsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsKSBvdmVycmlkZSB7CisgICAgICBpZiAoIWVudW1fZGVjbC5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICAgICAgb3V0IDw8ICIvLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBlbnVtIGRlY2xhcmF0aW9uLlxuIjsKKyAgICAgIH0KKyAgICB9CisgIH0gdihvdXQsIHR5cGVzLCBvcHRpb25zKTsKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVIZWFkZXJJbmNsdWRlcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIC8vIENvbGxlY3QgaW1wbGVtZW50YXRpb24gcmVsYXRlZCBoZWFkZXJzIGFuZCByZWZlcmVuY2VkIGRlZmluZWQgdHlwZXMgYnkgcmVjdXJzaXZseSB2aXNpdGluZworICAvLyBuZXN0ZWQgdHlwZXMKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXM7CisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9uczsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZywgSGVhZGVyQ29tcD4gaW5jbHVkZXM7CisgICAgVmlzaXRvcihjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgOiB0eXBlcyh0eXBlcyksIG9wdGlvbnMob3B0aW9ucykge30KKworICAgIC8vIENvbGxlY3QgaW5jbHVkZXMgZm9yIGVhY2ggdHlwZSByZWZlcmVuY2UKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxUeXBlU3BlY2lmaWVyJiB0eXBlKSBvdmVycmlkZSB7CisgICAgICBhdXRvIGRlZmluZWQgPSB0eXBlLkdldERlZmluZWRUeXBlKCk7CisgICAgICBpZiAoIWRlZmluZWQpIHJldHVybjsKKyAgICAgIGluY2x1ZGVzLmluc2VydChOZGtIZWFkZXJGaWxlKCpkZWZpbmVkLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKSk7CisgICAgfQorCisgICAgLy8gQ29sbGVjdCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBpbmNsdWRlcyBmb3IgZWFjaCB0eXBlIGRlZmluaXRpb24KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmIGludGVyZmFjZSkgb3ZlcnJpZGUgeworICAgICAgQWRkQ29tbW9uSGVhZGVycyhpbnRlcmZhY2UpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaCIpOworICAgICAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKKyAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJmdW5jdGlvbmFsIik7CisgICAgICAgIGluY2x1ZGVzLmluc2VydCgiY2hyb25vIik7CisgICAgICAgIGluY2x1ZGVzLmluc2VydCgic3N0cmVhbSIpOworICAgICAgfQorICAgICAgLy8gRm9yIG5lc3RlZCBpbnRlcmZhY2VlcyBjbGllbnQvc2VydmVyIGNsYXNzZXMgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgaGVhZGVyLgorICAgICAgLy8gU28gd2UgbmVlZCBpbmNsdWRlcyBmb3IgY2xpZW50L3NlcnZlciBjbGFzcyBhcyB3ZWxsLgorICAgICAgaWYgKGludGVyZmFjZS5HZXRQYXJlbnRUeXBlKCkpIHsKKyAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmgiKTsKKyAgICAgICAgaWYgKG9wdGlvbnMuR2VuVHJhY2VzKCkpIHsKKyAgICAgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvdHJhY2UuaCIpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICB9OwogCi0gIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7Ci0gIGlmIChwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICB2aXNpdF9wYXJjZWxhYmxlKCpwYXJjZWxhYmxlKTsKLSAgfQotCi0gIGNvbnN0IEFpZGxVbmlvbkRlY2wqIHVuaW9uX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNVbmlvbkRlY2xhcmF0aW9uKCk7Ci0gIGlmICh1bmlvbl9kZWNsICE9IG51bGxwdHIpIHsKLSAgICB2aXNpdF9wYXJjZWxhYmxlKCp1bmlvbl9kZWNsKTsKLSAgfQotCi0gIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCA9IGRlZmluZWRfdHlwZS5Bc0VudW1EZWNsYXJhdGlvbigpOwotICBpZiAoZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICB2aXNpdChlbnVtX2RlY2wtPkdldEJhY2tpbmdUeXBlKCkpOwotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogaW5jbHVkZXMpIHsKLSAgICBpZiAocGF0aCA9PSAiIikgewotICAgICAgY29udGludWU7CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHBhcmNlbGFibGUpIG92ZXJyaWRlIHsKKyAgICAgIEFkZENvbW1vbkhlYWRlcnMocGFyY2VsYWJsZSk7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oIik7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoImFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaCIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOyAgLy8gdXNlZCBieSB0b1N0cmluZygpCiAgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB1bmlvbl9kZWNsKSBvdmVycmlkZSB7CisgICAgICBBZGRDb21tb25IZWFkZXJzKHVuaW9uX2RlY2wpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaCIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmgiKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmgiKTsgIC8vIHVzZWQgYnkgdG9TdHJpbmcoKQorICAgICAgYXV0byB1bmlvbl9oZWFkZXJzID0gY3BwOjpVbmlvbldyaXRlcjo6R2V0SGVhZGVycyh1bmlvbl9kZWNsKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydChzdGQ6OmJlZ2luKHVuaW9uX2hlYWRlcnMpLCBzdGQ6OmVuZCh1bmlvbl9oZWFkZXJzKSk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wpIG92ZXJyaWRlIHsKKyAgICAgIEFkZENvbW1vbkhlYWRlcnMoZW51bV9kZWNsKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYXJyYXkiKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfZW51bXMuaCIpOworICAgIH0KKworICAgIHZvaWQgQWRkQ29tbW9uSGVhZGVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSkgeworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJjc3RkaW50Iik7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoIm1lbW9yeSIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJvcHRpb25hbCIpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJzdHJpbmciKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydCgidmVjdG9yIik7CisgICAgICBpZiAoZGVmaW5lZF90eXBlLklzU2Vuc2l0aXZlRGF0YSgpKSB7CisgICAgICAgIGluY2x1ZGVzLmluc2VydCgiYW5kcm9pZC9iaW5kZXJfcGFyY2VsX3BsYXRmb3JtLmgiKTsKKyAgICAgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9pYmluZGVyX3BsYXRmb3JtLmgiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gdih0eXBlcywgb3B0aW9ucyk7CisgIFZpc2l0VG9wRG93bih2LCBkZWZpbmVkX3R5cGUpOworCisgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IHYuaW5jbHVkZXMpIHsKICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IHBhdGggPDwgIj5cbiI7CiAgIH0KKyAgb3V0IDw8ICIjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUXG4iOworICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD5cbiI7CisgIG91dCA8PCAiI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlRcbiI7CisgIG91dCA8PCAiXG4iOworCisgIGlmICh2LmluY2x1ZGVzLmNvdW50KCJjYXNzZXJ0IikpIHsKKyAgICAvLyBUT0RPKGIvMzE1NTkwOTUpIGJpb25pYyBvbiBob3N0IHNob3VsZCBkZWZpbmUgX19hc3NlcnQyCisgICAgb3V0IDw8ICIjaWZuZGVmIF9fQklPTklDX19cbiNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKVxuI2VuZGlmXG5cbiI7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBpZiAoYXV0byBpZmFjZSA9IEFpZGxDYXN0PEFpZGxJbnRlcmZhY2U+KGRlZmluZWRfdHlwZSk7IGlmYWNlKSB7CisgICAgR2VuZXJhdGVJbnRlcmZhY2VDbGFzc0RlY2wob3V0LCB0eXBlcywgKmlmYWNlLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIHBhcmNlbGFibGUgPSBBaWRsQ2FzdDxBaWRsU3RydWN0dXJlZFBhcmNlbGFibGU+KGRlZmluZWRfdHlwZSk7IHBhcmNlbGFibGUpIHsKKyAgICBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChvdXQsIHR5cGVzLCAqcGFyY2VsYWJsZSwgb3B0aW9ucyk7CisgIH0gZWxzZSBpZiAoYXV0byB1bmlvbl9kZWNsID0gQWlkbENhc3Q8QWlkbFVuaW9uRGVjbD4oZGVmaW5lZF90eXBlKTsgdW5pb25fZGVjbCkgeworICAgIEdlbmVyYXRlUGFyY2VsQ2xhc3NEZWNsKG91dCwgdHlwZXMsICp1bmlvbl9kZWNsLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChhdXRvIGVudW1fZGVjbCA9IEFpZGxDYXN0PEFpZGxFbnVtRGVjbGFyYXRpb24+KGRlZmluZWRfdHlwZSk7IGVudW1fZGVjbCkgeworICAgIEdlbmVyYXRlRW51bUNsYXNzRGVjbChvdXQsIHR5cGVzLCAqZW51bV9kZWNsLCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBBSURMX0ZBVEFMKGRlZmluZWRfdHlwZSkgPDwgIlVucmVjb2duaXplZCB0eXBlIHNlbnQgZm9yIE5ESyBnZW5lcmF0aW9uLiI7CisgIH0KIH0KIAogc3RhdGljIHZvaWQgR2VuZXJhdGVTb3VyY2VJbmNsdWRlcyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIC8qZGVmaW5lZF90eXBlKi8pIHsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICAvLyBPbmNlIGluIGEgLmNwcCBmaWxlCisgIGlmIChkZWZpbmVkX3R5cGUuR2V0UGFyZW50VHlwZSgpICE9IG51bGxwdHIpIHsKKyAgICByZXR1cm47CisgIH0KIAorICBjb25zdCBzdHJpbmcgc2VsZl9oZWFkZXIgPSBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLyk7CisgIG91dCA8PCAiI2luY2x1ZGUgXCIiIDw8IHNlbGZfaGVhZGVyIDw8ICJcIlxuIjsKKyAgb3V0IDw8ICJcbiI7CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmcsIEhlYWRlckNvbXA+IGluY2x1ZGVzID0ge3NlbGZfaGVhZGVyfTsKKyAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaCIpOwogICB0eXBlcy5JdGVyYXRlVHlwZXMoWyZdKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgYV9kZWZpbmVkX3R5cGUpIHsKICAgICBpZiAoYV9kZWZpbmVkX3R5cGUuQXNJbnRlcmZhY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCwgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICAgICAgPDwgIj5cbiI7Ci0gICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiwgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICAgICAgPDwgIj5cbiI7Ci0gICAgICBvdXQgPDwgIiNpbmNsdWRlIDwiIDw8IE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVywgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pCi0gICAgICAgICAgPDwgIj5cbiI7CisgICAgICBpbmNsdWRlcy5pbnNlcnQoTmRrSGVhZGVyRmlsZShhX2RlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5ULCBmYWxzZSAvKnVzZV9vc19zZXAqLykpOworICAgICAgaW5jbHVkZXMuaW5zZXJ0KE5ka0hlYWRlckZpbGUoYV9kZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUiwgZmFsc2UgLyp1c2Vfb3Nfc2VwKi8pKTsKKyAgICAgIGluY2x1ZGVzLmluc2VydChOZGtIZWFkZXJGaWxlKGFfZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKSk7CiAgICAgfQogICB9KTsKKworICBzdHJ1Y3QgVmlzaXRvciA6IEFpZGxWaXNpdG9yIHsKKyAgICBib29sIGhhc19pbnRlcmZhY2UgPSBmYWxzZTsKKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxJbnRlcmZhY2UmKSBvdmVycmlkZSB7IGhhc19pbnRlcmZhY2UgPSB0cnVlOyB9CisgIH0gdjsKKyAgVmlzaXRUb3BEb3duKHYsIGRlZmluZWRfdHlwZSk7CisKKyAgaWYgKHYuaGFzX2ludGVyZmFjZSAmJiBvcHRpb25zLkdlbkxvZygpKSB7CisgICAgaW5jbHVkZXMuaW5zZXJ0KCJhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaCIpOworICB9CisKKyAgLy8gRW1pdCBpbmNsdWRlcyBleGNlcHQgc2VsZl9oZWFkZXIKKyAgaW5jbHVkZXMuZXJhc2UoaW5jbHVkZXMuZmluZChzZWxmX2hlYWRlcikpOworICBmb3IgKGNvbnN0IGF1dG8mIGluYyA6IGluY2x1ZGVzKSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBpbmMgPDwgIj5cbiI7CisgIH0KKyAgb3V0IDw8ICJcbiI7CisKKyAgLy8gRW1pdCBhZGRpdGlvbmFsIGRlZmluaXRpb24gZm9yIGdlbl90cmFjZXMKKyAgaWYgKHYuaGFzX2ludGVyZmFjZSAmJiBvcHRpb25zLkdlblRyYWNlcygpKSB7CisgICAgb3V0IDw8ICJuYW1lc3BhY2Uge1xuIjsKKyAgICBvdXQgPDwgInN0cnVjdCBTY29wZWRUcmFjZSB7XG4iOworICAgIG91dC5JbmRlbnQoKTsKKyAgICBvdXQgPDwgImlubGluZSBleHBsaWNpdCBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBuYW1lKSB7IEFUcmFjZV9iZWdpblNlY3Rpb24obmFtZSk7IH1cbiI7CisgICAgb3V0IDw8ICJpbmxpbmUgflNjb3BlZFRyYWNlKCkgeyBBVHJhY2VfZW5kU2VjdGlvbigpOyB9XG4iOworICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn07XG4iOworICAgIG91dCA8PCAifSAgLy8gbmFtZXNwYWNlXG4iOworICAgIG91dCA8PCAiXG4iOworICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlV2l0aENvbnN0YW50cz4KIHN0YXRpYyB2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZVdpdGhDb25zdGFudHMmIHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CiAgIGZvciAoY29uc3QgYXV0byYgY29uc3RhbnQgOiB0eXBlLkdldENvbnN0YW50RGVjbGFyYXRpb25zKCkpIHsKICAgICBjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSA9IGNvbnN0YW50LT5HZXRUeXBlKCk7CiAKQEAgLTMyNiw4ICs0MzMsNyBAQAogICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlV2l0aENvbnN0YW50cz4KLXN0YXRpYyB2b2lkIEdlbmVyYXRlQ29uc3RhbnREZWZpbml0aW9ucyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFR5cGVXaXRoQ29uc3RhbnRzJiBpbnRlcmZhY2UsCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUNvbnN0YW50RGVmaW5pdGlvbnMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2xhenosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcGxfZGVjbCA9ICIiKSB7CiAgIGZvciAoY29uc3QgYXV0byYgY29uc3RhbnQgOiBpbnRlcmZhY2UuR2V0Q29uc3RhbnREZWNsYXJhdGlvbnMoKSkgewpAQCAtMzQ1LDEyICs0NTEsNyBAQAogCiB2b2lkIEdlbmVyYXRlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBHZW5lcmF0ZVNvdXJjZUluY2x1ZGVzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSk7Ci0gIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+XG4iOwotICB9Ci0gIG91dCA8PCAiXG4iOwotCisgIEdlbmVyYXRlU291cmNlSW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKICAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBHZW5lcmF0ZUNsYXNzU291cmNlKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIEdlbmVyYXRlQ2xpZW50U291cmNlKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CkBAIC0zNjUsMTEgKzQ2NiwxMSBAQAogCiBzdGF0aWMgdm9pZCBHZW5lcmF0ZUNsaWVudE1ldGhvZERlZmluaXRpb24oQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OkNMSUVOVCk7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKIAotICBvdXQgPDwgTmRrTWV0aG9kRGVjbCh0eXBlcywgbWV0aG9kLCBjbGF6eikgPDwgIiB7XG4iOworICBvdXQgPDwgTmRrTWV0aG9kRGVjbCh0eXBlcywgbWV0aG9kLCBxX25hbWUpIDw8ICIge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LO1xuIjsKICAgb3V0IDw8ICI6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7XG4iOwpAQCAtMzk3LDggKzQ5OCw3IEBACiAgIG91dCA8PCAiXG4iOwogCiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8IGNwcDo6R2VuTG9nQmVmb3JlRXhlY3V0ZShDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1NlcnZlciAqLywgdHJ1ZSAvKiBpc05kayAqLyk7CisgICAgb3V0IDw8IGNwcDo6R2VuTG9nQmVmb3JlRXhlY3V0ZShxX25hbWUsIG1ldGhvZCwgZmFsc2UgLyogaXNTZXJ2ZXIgKi8sIHRydWUgLyogaXNOZGsgKi8pOwogICB9CiAgIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7CiAgICAgb3V0IDw8ICJTY29wZWRUcmFjZSBfYWlkbF90cmFjZShcIkFJREw6OiIgPDwgdG9fc3RyaW5nKG9wdGlvbnMuVGFyZ2V0TGFuZ3VhZ2UoKSkKQEAgLTQyMSw3ICs1MjEsNyBAQAogICAgICAgV3JpdGVUb1BhcmNlbEZvcih7b3V0LCB0eXBlcywgYXJnLT5HZXRUeXBlKCksICJfYWlkbF9pbi5nZXQoKSIsIHByZWZpeCArIHZhcl9uYW1lfSk7CiAgICAgICBvdXQgPDwgIjtcbiI7CiAgICAgICBTdGF0dXNDaGVja0dvdG8ob3V0KTsKLSAgICB9IGVsc2UgaWYgKGFyZy0+SXNPdXQoKSAmJiBhcmctPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICB9IGVsc2UgaWYgKGFyZy0+SXNPdXQoKSAmJiBhcmctPkdldFR5cGUoKS5Jc0R5bmFtaWNBcnJheSgpKSB7CiAgICAgICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICoiIDw8IHZhcl9uYW1lCiAgICAgICAgICAgPDwgIik7XG4iOwogICAgICAgU3RhdHVzQ2hlY2tHb3RvKG91dCk7CkBAIC00ODgsOSArNTg4LDggQEAKICAgb3V0IDw8ICJfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7XG4iOwogICBvdXQgPDwgIl9haWRsX3N0YXR1c19yZXR1cm46XG4iOwogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIG91dCA8PCBjcHA6OkdlbkxvZ0FmdGVyRXhlY3V0ZShDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpLCBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgIl9haWRsX3N0YXR1cyIsICJfYWlkbF9yZXR1cm4iLCBmYWxzZSAvKiBpc1NlcnZlciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc05kayAqLyk7CisgICAgb3V0IDw8IGNwcDo6R2VuTG9nQWZ0ZXJFeGVjdXRlKHFfbmFtZSwgZGVmaW5lZF90eXBlLCBtZXRob2QsICJfYWlkbF9zdGF0dXMiLCAiX2FpZGxfcmV0dXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNTZXJ2ZXIgKi8sIHRydWUgLyogaXNOZGsgKi8pOwogICB9CiAKICAgb3V0IDw8ICJyZXR1cm4gX2FpZGxfc3RhdHVzO1xuIjsKQEAgLTUwMSw2ICs2MDAsOCBAQAogc3RhdGljIHZvaWQgR2VuZXJhdGVTZXJ2ZXJDYXNlRGVmaW5pdGlvbihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUik7CisKICAgb3V0IDw8ICJjYXNlICIgPDwgTWV0aG9kSWQobWV0aG9kKSA8PCAiOiB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CkBAIC01MjUsMjIgKzYyNiwyMCBAQAogICAgICAgUmVhZEZyb21QYXJjZWxGb3Ioe291dCwgdHlwZXMsIGFyZy0+R2V0VHlwZSgpLCAiX2FpZGxfaW4iLCAiJiIgKyB2YXJfbmFtZX0pOwogICAgICAgb3V0IDw8ICI7XG4iOwogICAgICAgU3RhdHVzQ2hlY2tCcmVhayhvdXQpOwotICAgIH0gZWxzZSBpZiAoYXJnLT5Jc091dCgpICYmIGFyZy0+R2V0VHlwZSgpLklzQXJyYXkoKSkgeworICAgIH0gZWxzZSBpZiAoYXJnLT5Jc091dCgpICYmIGFyZy0+R2V0VHlwZSgpLklzRHluYW1pY0FycmF5KCkpIHsKICAgICAgIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJiIgPDwgdmFyX25hbWUgPDwgIik7XG4iOwogICAgICAgU3RhdHVzQ2hlY2tCcmVhayhvdXQpOwogICAgIH0KICAgfQogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIG91dCA8PCBjcHA6OkdlbkxvZ0JlZm9yZUV4ZWN1dGUoQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc1NlcnZlciAqLywgdHJ1ZSAvKiBpc05kayAqLyk7CisgICAgb3V0IDw8IGNwcDo6R2VuTG9nQmVmb3JlRXhlY3V0ZShxX25hbWUsIG1ldGhvZCwgdHJ1ZSAvKiBpc1NlcnZlciAqLywgdHJ1ZSAvKiBpc05kayAqLyk7CiAgIH0KICAgb3V0IDw8ICI6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT4iIDw8IG1ldGhvZC5HZXROYW1lKCkgPDwgIigiCiAgICAgICA8PCBOZGtBcmdMaXN0KHR5cGVzLCBtZXRob2QsIEZvcm1hdEFyZ0ZvckNhbGwpIDw8ICIpO1xuIjsKIAogICBpZiAob3B0aW9ucy5HZW5Mb2coKSkgewotICAgIG91dCA8PCBjcHA6OkdlbkxvZ0FmdGVyRXhlY3V0ZShDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpTRVJWRVIpLCBkZWZpbmVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgIl9haWRsX3N0YXR1cyIsICJfYWlkbF9yZXR1cm4iLCB0cnVlIC8qIGlzU2VydmVyICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzTmRrICovKTsKKyAgICBvdXQgPDwgY3BwOjpHZW5Mb2dBZnRlckV4ZWN1dGUocV9uYW1lLCBkZWZpbmVkX3R5cGUsIG1ldGhvZCwgIl9haWRsX3N0YXR1cyIsICJfYWlkbF9yZXR1cm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzU2VydmVyICovLCB0cnVlIC8qIGlzTmRrICovKTsKICAgfQogICBpZiAobWV0aG9kLklzT25ld2F5KCkpIHsKICAgICAvLyBGb3IgYSBvbmV3YXkgdHJhbnNhY3Rpb24sIHRoZSBrZXJuZWwgd2lsbCBoYXZlIGFscmVhZHkgcmV0dXJuZWQgYSByZXN1bHQuIFRoaXMgaXMgZm9yIHRoZQpAQCAtNTcwLDIzICs2NjksMjQgQEAKICAgb3V0IDw8ICJ9XG4iOwogfQogCitzdGF0aWMgc3RyaW5nIE9uVHJhbnNhY3RGdW5jTmFtZShjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UpIHsKKyAgc3RyaW5nIG5hbWUgPSBpbnRlcmZhY2UuR2V0Q2Fub25pY2FsTmFtZSgpOworICBzdGQ6OnJlcGxhY2UobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCAnLicsICdfJyk7CisgIHJldHVybiAiX2FpZGxfIiArIG5hbWUgKyAiX29uVHJhbnNhY3QiOworfQorCitzdGF0aWMgc3RyaW5nIEdsb2JhbENsYXNzVmFyTmFtZShjb25zdCBBaWRsSW50ZXJmYWNlJiBpbnRlcmZhY2UpIHsKKyAgc3RyaW5nIG5hbWUgPSBpbnRlcmZhY2UuR2V0Q2Fub25pY2FsTmFtZSgpOworICBzdGQ6OnJlcGxhY2UobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCAnLicsICdfJyk7CisgIHJldHVybiAiX2dfYWlkbF8iICsgbmFtZSArICJfY2xhenoiOworfQorCiB2b2lkIEdlbmVyYXRlQ2xhc3NTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwotICBjb25zdCBzdGQ6OnN0cmluZyBibl9jbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUik7Ci0gIGlmIChvcHRpb25zLkdlblRyYWNlcygpKSB7Ci0gICAgb3V0IDw8ICJjbGFzcyBTY29wZWRUcmFjZSB7XG4iOwotICAgIG91dC5JbmRlbnQoKTsKLSAgICBvdXQgPDwgInB1YmxpYzpcbiIKLSAgICAgICAgPDwgImlubGluZSBleHBsaWNpdCBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBuYW1lKSB7XG4iCi0gICAgICAgIDw8ICJBVHJhY2VfYmVnaW5TZWN0aW9uKG5hbWUpO1xuIgotICAgICAgICA8PCAifVxuIgotICAgICAgICA8PCAiaW5saW5lIH5TY29wZWRUcmFjZSgpIHtcbiIKLSAgICAgICAgPDwgIkFUcmFjZV9lbmRTZWN0aW9uKCk7XG4iCi0gICAgICAgIDw8ICJ9XG4iOwotICAgIG91dC5EZWRlbnQoKTsKLSAgICBvdXQgPDwgIn07XG4iOwotICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGlfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOworICBjb25zdCBzdGQ6OnN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKKworICBjb25zdCBzdHJpbmcgb25fdHJhbnNhY3QgPSBPblRyYW5zYWN0RnVuY05hbWUoZGVmaW5lZF90eXBlKTsKICAgYm9vbCBkZXByZWNhdGVkID0gZGVmaW5lZF90eXBlLklzRGVwcmVjYXRlZCgpIHx8CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YW55X29mKGRlZmluZWRfdHlwZS5HZXRNZXRob2RzKCkuYmVnaW4oKSwgZGVmaW5lZF90eXBlLkdldE1ldGhvZHMoKS5lbmQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0byYgbSkgeyByZXR1cm4gbS0+SXNEZXByZWNhdGVkKCk7IH0pOwpAQCAtNTk0LDggKzY5NCw3IEBACiAgICAgb3V0IDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaFxuIjsKICAgICBvdXQgPDwgIiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkXCJcbiI7CiAgIH0KLSAgb3V0IDw8ICJzdGF0aWMgYmluZGVyX3N0YXR1c190ICIKLSAgICAgIDw8ICJfYWlkbF9vblRyYW5zYWN0IgorICBvdXQgPDwgInN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgIiA8PCBvbl90cmFuc2FjdAogICAgICAgPDwgIihBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sICIKICAgICAgICAgICJBUGFyY2VsKiBfYWlkbF9vdXQpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKQEAgLTYwNSw3ICs3MDQsNyBAQAogICBpZiAoIWRlZmluZWRfdHlwZS5HZXRNZXRob2RzKCkuZW1wdHkoKSkgewogICAgIC8vIHdlIGtub3cgdGhpcyBjYXN0IGlzIHZhbGlkIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgYnkgdGhlIElDSW50ZXJmYWNlCiAgICAgLy8gQUlCaW5kZXJfQ2xhc3Mgb2JqZWN0IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzLgotICAgIG91dCA8PCAic3RkOjpzaGFyZWRfcHRyPCIgPDwgYm5fY2xhenogPDwgIj4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDwiIDw8IGJuX2NsYXp6CisgICAgb3V0IDw8ICJzdGQ6OnNoYXJlZF9wdHI8IiA8PCBxX25hbWUgPDwgIj4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDwiIDw8IHFfbmFtZQogICAgICAgICA8PCAiPig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpO1xuIjsKICAgICBvdXQgPDwgInN3aXRjaCAoX2FpZGxfY29kZSkge1xuIjsKICAgICBvdXQuSW5kZW50KCk7CkBAIC02MjIsOCArNzIxLDkgQEAKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cblxuIjsKIAotICBvdXQgPDwgInN0YXRpYyBBSUJpbmRlcl9DbGFzcyogIiA8PCBrQ2xhenogPDwgIiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoIiA8PCBjbGF6egotICAgICAgPDwgIjo6IiA8PCBrRGVzY3JpcHRvciA8PCAiLCBfYWlkbF9vblRyYW5zYWN0KTtcblxuIjsKKyAgb3V0IDw8ICJzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqICIgPDwgR2xvYmFsQ2xhc3NWYXJOYW1lKGRlZmluZWRfdHlwZSkKKyAgICAgIDw8ICIgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKCIgPDwgaV9uYW1lIDw8ICI6OiIgPDwga0Rlc2NyaXB0b3IgPDwgIiwgIgorICAgICAgPDwgb25fdHJhbnNhY3QgPDwgIik7XG5cbiI7CiAgIGlmIChkZXByZWNhdGVkKSB7CiAgICAgb3V0IDw8ICIjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wXG4iOwogICB9CkBAIC02MzEsMzIgKzczMSwzOCBAQAogCiB2b2lkIEdlbmVyYXRlQ2xpZW50U291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdGQ6OnN0cmluZyBxX25hbWUgPSBHZXRRdWFsaWZpZWROYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpOwogCi0gIG91dCA8PCBjbGF6eiA8PCAiOjoiIDw8IGNsYXp6IDw8ICIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fVxuIjsKLSAgb3V0IDw8IGNsYXp6IDw8ICI6On4iIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKKyAgb3V0IDw8IHFfbmFtZSA8PCAiOjoiIDw8IGNsYXp6IDw8ICIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fVxuIjsKKyAgb3V0IDw8IHFfbmFtZSA8PCAiOjp+IiA8PCBjbGF6eiA8PCAiKCkge31cbiI7CiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8ICJzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgIiArIGNsYXp6ICsgIjo6VHJhbnNhY3Rpb25Mb2cmKT4gIiA8PCBjbGF6eiA8PCAiOjpsb2dGdW5jO1xuIjsKKyAgICBvdXQgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiIDw8IHFfbmFtZSA8PCAiOjpUcmFuc2FjdGlvbkxvZyYpPiAiIDw8IHFfbmFtZQorICAgICAgICA8PCAiOjpsb2dGdW5jO1xuIjsKICAgfQogICBvdXQgPDwgIlxuIjsKICAgZm9yIChjb25zdCBhdXRvJiBtZXRob2QgOiBkZWZpbmVkX3R5cGUuR2V0TWV0aG9kcygpKSB7CiAgICAgR2VuZXJhdGVDbGllbnRNZXRob2REZWZpbml0aW9uKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgKm1ldGhvZCwgb3B0aW9ucyk7CiAgIH0KIH0KKwogdm9pZCBHZW5lcmF0ZVNlcnZlclNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcV9uYW1lID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUik7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogCiAgIG91dCA8PCAiLy8gU291cmNlIGZvciAiIDw8IGNsYXp6IDw8ICJcbiI7Ci0gIG91dCA8PCBjbGF6eiA8PCAiOjoiIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKLSAgb3V0IDw8IGNsYXp6IDw8ICI6On4iIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKKyAgb3V0IDw8IHFfbmFtZSA8PCAiOjoiIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKKyAgb3V0IDw8IHFfbmFtZSA8PCAiOjp+IiA8PCBjbGF6eiA8PCAiKCkge31cbiI7CiAgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8ICJzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgIiArIGNsYXp6ICsgIjo6VHJhbnNhY3Rpb25Mb2cmKT4gIiA8PCBjbGF6eiA8PCAiOjpsb2dGdW5jO1xuIjsKKyAgICBvdXQgPDwgInN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCAiIDw8IHFfbmFtZSA8PCAiOjpUcmFuc2FjdGlvbkxvZyYpPiAiIDw8IHFfbmFtZQorICAgICAgICA8PCAiOjpsb2dGdW5jO1xuIjsKICAgfQotICBvdXQgPDwgIjo6bmRrOjpTcEFJQmluZGVyICIgPDwgY2xhenogPDwgIjo6Y3JlYXRlQmluZGVyKCkge1xuIjsKKyAgb3V0IDw8ICI6Om5kazo6U3BBSUJpbmRlciAiIDw8IHFfbmFtZSA8PCAiOjpjcmVhdGVCaW5kZXIoKSB7XG4iOwogICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCAiQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldygiIDw8IGtDbGF6eiA8PCAiLCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpO1xuIjsKKyAgb3V0IDw8ICJBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KCIgPDwgR2xvYmFsQ2xhc3NWYXJOYW1lKGRlZmluZWRfdHlwZSkKKyAgICAgIDw8ICIsIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7XG4iOwogCiAgIG91dCA8PCAiI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVFxuIjsKICAgaWYgKGRlZmluZWRfdHlwZS5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKQEAgLTY3Niw3ICs3ODIsNyBAQAogICAgICAgY29udGludWU7CiAgICAgfQogICAgIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlVmVyc2lvbiAmJiBvcHRpb25zLlZlcnNpb24oKSA+IDApIHsKLSAgICAgIG91dCA8PCBOZGtNZXRob2REZWNsKHR5cGVzLCAqbWV0aG9kLCBjbGF6eikgPDwgIiB7XG4iOworICAgICAgb3V0IDw8IE5ka01ldGhvZERlY2wodHlwZXMsICptZXRob2QsIHFfbmFtZSkgPDwgIiB7XG4iOwogICAgICAgb3V0LkluZGVudCgpOwogICAgICAgb3V0IDw8ICIqX2FpZGxfcmV0dXJuID0gIiA8PCBpZmFjZSA8PCAiOjoiIDw8IGtWZXJzaW9uIDw8ICI7XG4iOwogICAgICAgb3V0IDw8ICJyZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXMoQVN0YXR1c19uZXdPaygpKTtcbiI7CkBAIC02ODQsNyArNzkwLDcgQEAKICAgICAgIG91dCA8PCAifVxuIjsKICAgICB9CiAgICAgaWYgKG1ldGhvZC0+R2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwgTmRrTWV0aG9kRGVjbCh0eXBlcywgKm1ldGhvZCwgY2xhenopIDw8ICIge1xuIjsKKyAgICAgIG91dCA8PCBOZGtNZXRob2REZWNsKHR5cGVzLCAqbWV0aG9kLCBxX25hbWUpIDw8ICIge1xuIjsKICAgICAgIG91dC5JbmRlbnQoKTsKICAgICAgIG91dCA8PCAiKl9haWRsX3JldHVybiA9ICIgPDwgaWZhY2UgPDwgIjo6IiA8PCBrSGFzaCA8PCAiO1xuIjsKICAgICAgIG91dCA8PCAicmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzKEFTdGF0dXNfbmV3T2soKSk7XG4iOwpAQCAtNjk1LDIyICs4MDEsMjQgQEAKIH0KIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHFfbmFtZSA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OklOVEVSRkFDRSk7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGJwX2NsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKIAogICBvdXQgPDwgIi8vIFNvdXJjZSBmb3IgIiA8PCBjbGF6eiA8PCAiXG4iOwotICBvdXQgPDwgImNvbnN0IGNoYXIqICIgPDwgY2xhenogPDwgIjo6IiA8PCBrRGVzY3JpcHRvciA8PCAiID0gXCIiIDw8IGRlZmluZWRfdHlwZS5HZXREZXNjcmlwdG9yKCkKKyAgb3V0IDw8ICJjb25zdCBjaGFyKiAiIDw8IHFfbmFtZSA8PCAiOjoiIDw8IGtEZXNjcmlwdG9yIDw8ICIgPSBcIiIgPDwgZGVmaW5lZF90eXBlLkdldERlc2NyaXB0b3IoKQogICAgICAgPDwgIlwiO1xuIjsKLSAgb3V0IDw8IGNsYXp6IDw8ICI6OiIgPDwgY2xhenogPDwgIigpIHt9XG4iOwotICBvdXQgPDwgY2xhenogPDwgIjo6fiIgPDwgY2xhenogPDwgIigpIHt9XG4iOworICBvdXQgPDwgcV9uYW1lIDw8ICI6OiIgPDwgY2xhenogPDwgIigpIHt9XG4iOworICBvdXQgPDwgcV9uYW1lIDw8ICI6On4iIDw8IGNsYXp6IDw8ICIoKSB7fVxuIjsKICAgb3V0IDw8ICJcbiI7Ci0gIEdlbmVyYXRlQ29uc3RhbnREZWZpbml0aW9ucyhvdXQsIGRlZmluZWRfdHlwZSwgY2xhenopOworICBHZW5lcmF0ZUNvbnN0YW50RGVmaW5pdGlvbnMob3V0LCBkZWZpbmVkX3R5cGUsIHFfbmFtZSk7CiAgIG91dCA8PCAiXG4iOwogCi0gIG91dCA8PCAic3RkOjpzaGFyZWRfcHRyPCIgPDwgY2xhenogPDwgIj4gIiA8PCBjbGF6egorICBvdXQgPDwgInN0ZDo6c2hhcmVkX3B0cjwiIDw8IHFfbmFtZSA8PCAiPiAiIDw8IHFfbmFtZQogICAgICAgPDwgIjo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7XG4iOwogICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCAiaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksICIgPDwga0NsYXp6IDw8ICIpKSB7IHJldHVybiBudWxscHRyOyB9XG4iOworICBvdXQgPDwgImlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCAiIDw8IEdsb2JhbENsYXNzVmFyTmFtZShkZWZpbmVkX3R5cGUpCisgICAgICA8PCAiKSkgeyByZXR1cm4gbnVsbHB0cjsgfVxuIjsKICAgb3V0IDw8ICJzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSAiCiAgICAgICAgICAiOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpO1xuIjsKICAgb3V0IDw8ICJpZiAoaW50ZXJmYWNlKSB7XG4iOwpAQCAtNzE4LDExICs4MjYsMTIgQEAKICAgb3V0IDw8ICJyZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PCIgPDwgY2xhenogPDwgIj4oaW50ZXJmYWNlKTtcbiI7CiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwotICBvdXQgPDwgInJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTwiIDw8IGJwX2NsYXp6IDw8ICI+KGJpbmRlcik7XG4iOworICBvdXQgPDwgInJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTwiIDw8IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpDTElFTlQpCisgICAgICA8PCAiPihiaW5kZXIpO1xuIjsKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cblxuIjsKIAotICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IGNsYXp6IDw8ICI6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IgorICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IHFfbmFtZSA8PCAiOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPCIKICAgICAgIDw8IGNsYXp6IDw8ICI+JiBpbnN0YW5jZSkge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgInJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6ICIKQEAgLTczMCw3ICs4MzksNyBAQAogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuIjsKIAotICBvdXQgPDwgImJpbmRlcl9zdGF0dXNfdCAiIDw8IGNsYXp6IDw8ICI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPCIKKyAgb3V0IDw8ICJiaW5kZXJfc3RhdHVzX3QgIiA8PCBxX25hbWUgPDwgIjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8IgogICAgICAgPDwgY2xhenogPDwgIj4qIGluc3RhbmNlKSB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIG91dCA8PCAiOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyO1xuIjsKQEAgLTc0Miw3ICs4NTEsNyBAQAogICBvdXQgPDwgIn1cbiI7CiAKICAgLy8gZGVmaW50aW9uIGZvciBzdGF0aWMgbWVtYmVyIHNldERlZmF1bHRJbXBsCi0gIG91dCA8PCAiYm9vbCAiIDw8IGNsYXp6IDw8ICI6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwiIDw8IGNsYXp6IDw8ICI+JiBpbXBsKSB7XG4iOworICBvdXQgPDwgImJvb2wgIiA8PCBxX25hbWUgPDwgIjo6c2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPCIgPDwgY2xhenogPDwgIj4mIGltcGwpIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgb3V0IDw8ICIvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvblxuIjsKICAgb3V0IDw8ICIvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnRcbiI7CkBAIC03NTksMTcgKzg2OCwxNyBAQAogICBvdXQgPDwgIn1cbiI7CiAKICAgLy8gZGVmaW5pdGlvbiBmb3Igc3RhdGljIG1lbWJlciBnZXREZWZhdWx0SW1wbAotICBvdXQgPDwgImNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwiIDw8IGNsYXp6IDw8ICI+JiAiIDw8IGNsYXp6IDw8ICI6OmdldERlZmF1bHRJbXBsKCkge1xuIjsKKyAgb3V0IDw8ICJjb25zdCBzdGQ6OnNoYXJlZF9wdHI8IiA8PCBxX25hbWUgPDwgIj4mICIgPDwgcV9uYW1lIDw8ICI6OmdldERlZmF1bHRJbXBsKCkge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBvdXQgPDwgInJldHVybiAiIDw8IGNsYXp6IDw8ICI6OmRlZmF1bHRfaW1wbDtcbiI7CiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwogCiAgIC8vIGRlZmluaXRpb24gZm9yIHRoZSBzdGF0aWMgZmllbGQgZGVmYXVsdF9pbXBsCi0gIG91dCA8PCAic3RkOjpzaGFyZWRfcHRyPCIgPDwgY2xhenogPDwgIj4gIiA8PCBjbGF6eiA8PCAiOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyO1xuIjsKKyAgb3V0IDw8ICJzdGQ6OnNoYXJlZF9wdHI8IiA8PCBxX25hbWUgPDwgIj4gIiA8PCBxX25hbWUgPDwgIjo6ZGVmYXVsdF9pbXBsID0gbnVsbHB0cjtcbiI7CiAKICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIDxOYW1lPkRlZmF1bHQgY2xhc3MgbWVtYmVycwotICBjb25zdCBzdGQ6OnN0cmluZyBkZWZhdWx0Q2xhenogPSBjbGF6eiArICJEZWZhdWx0IjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZGVmYXVsdENsYXp6ID0gcV9uYW1lICsgIkRlZmF1bHQiOwogICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGRlZmluZWRfdHlwZS5HZXRNZXRob2RzKCkpIHsKICAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKICAgICAgIG91dCA8PCAiOjpuZGs6OlNjb3BlZEFTdGF0dXMgIiA8PCBkZWZhdWx0Q2xhenogPDwgIjo6IiA8PCBtZXRob2QtPkdldE5hbWUoKSA8PCAiKCIKQEAgLTgxNSwyNSArOTI0LDEwIEBACiAgIG91dCA8PCAifVxuIjsKIH0KIAotdm9pZCBHZW5lcmF0ZUNsaWVudEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKK3ZvaWQgR2VuZXJhdGVDbGllbnRDbGFzc0RlY2woQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6Q0xJRU5UKTsKIAotICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuXG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIFwiIiA8PCBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLykKLSAgICAgIDw8ICJcIlxuIjsKLSAgb3V0IDw8ICJcbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD5cbiI7Ci0gIGlmIChvcHRpb25zLkdlbkxvZygpKSB7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD5cbiI7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8Y2hyb25vPlxuIjsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxzc3RyZWFtPlxuIjsKLSAgfQotICBpZiAob3B0aW9ucy5HZW5UcmFjZXMoKSkgewotICAgIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvdHJhY2UuaD5cbiI7Ci0gIH0KLSAgb3V0IDw8ICJcbiI7Ci0gIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICJjbGFzcyI7CiAgIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICIgIiA8PCBjbGF6eiA8PCAiIDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8IgpAQCAtODYzLDIwICs5NTcsMzQgQEAKICAgfQogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifTtcbiI7Ci0gIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKIH0KLXZvaWQgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNsYXp6ID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6U0VSVkVSKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgaWZhY2UgPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogCit2b2lkIEdlbmVyYXRlQ2xpZW50SGVhZGVyKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuXG4iOwogICBvdXQgPDwgIiNpbmNsdWRlIFwiIiA8PCBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLykKICAgICAgIDw8ICJcIlxuIjsKICAgb3V0IDw8ICJcbiI7CiAgIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD5cbiI7CisgIGlmIChvcHRpb25zLkdlbkxvZygpKSB7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD5cbiI7CisgICAgb3V0IDw8ICIjaW5jbHVkZSA8Y2hyb25vPlxuIjsKKyAgICBvdXQgPDwgIiNpbmNsdWRlIDxzc3RyZWFtPlxuIjsKKyAgfQorICBpZiAob3B0aW9ucy5HZW5UcmFjZXMoKSkgeworICAgIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvdHJhY2UuaD5cbiI7CisgIH0KICAgb3V0IDw8ICJcbiI7CiAgIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKKyAgR2VuZXJhdGVDbGllbnRDbGFzc0RlY2wob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKKyAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOworfQorCit2b2lkIEdlbmVyYXRlU2VydmVyQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlNFUlZFUik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGlmYWNlID0gQ2xhc3NOYW1lKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6SU5URVJGQUNFKTsKKwogICBvdXQgPDwgImNsYXNzIjsKICAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgIiAiIDw8IGNsYXp6IDw8ICIgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTwiIDw8IGlmYWNlIDw8ICI+IHtcbiI7CkBAIC05MTEsMjUgKzEwMTksMjUgQEAKICAgb3V0LkluZGVudCgpOwogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifTtcbiI7Cit9CisKK3ZvaWQgR2VuZXJhdGVTZXJ2ZXJIZWFkZXIoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEludGVyZmFjZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7CisgIG91dCA8PCAiI2luY2x1ZGUgXCIiIDw8IE5ka0hlYWRlckZpbGUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpSQVcsIGZhbHNlIC8qdXNlX29zX3NlcCovKQorICAgICAgPDwgIlwiXG4iOworICBvdXQgPDwgIlxuIjsKKyAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPlxuIjsKKyAgb3V0IDw8ICJcbiI7CisgIEVudGVyTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKKyAgR2VuZXJhdGVTZXJ2ZXJDbGFzc0RlY2wob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKICAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogfQotdm9pZCBHZW5lcmF0ZUludGVyZmFjZUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKwordm9pZCBHZW5lcmF0ZUludGVyZmFjZUNsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgY2xhenogPSBDbGFzc05hbWUoZGVmaW5lZF90eXBlLCBDbGFzc05hbWVzOjpJTlRFUkZBQ0UpOwogCi0gIG91dCA8PCAiI3ByYWdtYSBvbmNlXG5cbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPlxuIjsKLSAgaWYgKG9wdGlvbnMuR2VuTG9nKCkpIHsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPlxuIjsKLSAgICBvdXQgPDwgIiNpbmNsdWRlIDxjaHJvbm8+XG4iOwotICAgIG91dCA8PCAiI2luY2x1ZGUgPHNzdHJlYW0+XG4iOwotICB9Ci0gIG91dCA8PCAiXG4iOwotCi0gIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlKTsKLSAgb3V0IDw8ICJcbiI7Ci0KLSAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgImNsYXNzIjsKICAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgIiAiIDw8IGNsYXp6IDw8ICIgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHtcbiI7CkBAIC05MzksNiArMTA0Nyw3IEBACiAgIG91dCA8PCBjbGF6eiA8PCAiKCk7XG4iOwogICBvdXQgPDwgInZpcnR1YWwgfiIgPDwgY2xhenogPDwgIigpO1xuIjsKICAgb3V0IDw8ICJcbiI7CisgIEdlbmVyYXRlTmVzdGVkVHlwZURlY2xzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlKTsKICAgaWYgKG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewogICAgIG91dCA8PCAic3RhdGljIGNvbnN0IGludDMyX3QgIiA8PCBrVmVyc2lvbiA8PCAiID0gIiA8PCBzdGQ6OnRvX3N0cmluZyhvcHRpb25zLlZlcnNpb24oKSkKQEAgLTEwMDAsMjMgKzExMDksMTggQEAKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn07XG4iOwogCi0gIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKKyAgLy8gV2hlbiBhbiBpbnRlcmZhY2UgaXMgbmVzdGVkLCBldmVyeSBjbGFzcyBzaG91bGQgYmUgZGVmaW5lZCB0b2dldGhlciBoZXJlCisgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBzZXBhcmF0ZSBoZWFkZXJzIGZvciB0aGVtLgorICAvLyAoZS5nLiBJRm9vLCBJRm9vRGVmYXVsdCwgQnBGb28sIEJuRm9vLCBJRm9vRGVsZWdhdG9yKQorICBpZiAoZGVmaW5lZF90eXBlLkdldFBhcmVudFR5cGUoKSkgeworICAgIEdlbmVyYXRlQ2xpZW50Q2xhc3NEZWNsKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CisgICAgR2VuZXJhdGVTZXJ2ZXJDbGFzc0RlY2wob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKKyAgfQogfQotdm9pZCBHZW5lcmF0ZVBhcmNlbEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgLypvcHRpb25zKi8pIHsKKwordm9pZCBHZW5lcmF0ZVBhcmNlbENsYXNzRGVjbChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVyk7Ci0KLSAgb3V0IDw8ICIjcHJhZ21hIG9uY2VcbiI7Ci0gIG91dCA8PCAiI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPlxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPlxuIjsKLQotICAvLyB1c2VkIGJ5IHRvU3RyaW5nKCkKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+XG4iOwotCi0gIEdlbmVyYXRlSGVhZGVySW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlKTsKLQotICBFbnRlck5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CiAgIG91dCA8PCBjcHA6OlRlbXBsYXRlRGVjbChkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgImNsYXNzIjsKICAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBkZWZpbmVkX3R5cGUpOwpAQCAtMTAzMCwyOCArMTEzNCwzNiBAQAogICB9CiAgIG91dCA8PCAic3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7XG4iOwogICBvdXQgPDwgIlxuIjsKKyAgR2VuZXJhdGVOZXN0ZWRUeXBlRGVjbHMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IGRlZmluZWRfdHlwZS5HZXRGaWVsZHMoKSkgewotICAgIG91dCA8PCBOZGtOYW1lT2YodHlwZXMsIHZhcmlhYmxlLT5HZXRUeXBlKCksIFN0b3JhZ2VNb2RlOjpTVEFDSyk7CisgICAgY29uc3QgYXV0byYgdHlwZSA9IHZhcmlhYmxlLT5HZXRUeXBlKCk7CisgICAgc3RkOjpzdHJpbmcgY3BwX3R5cGUgPSBOZGtOYW1lT2YodHlwZXMsIHR5cGUsIFN0b3JhZ2VNb2RlOjpTVEFDSyk7CisgICAgb3V0IDw8IGNwcF90eXBlOwogICAgIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKG91dCwgKnZhcmlhYmxlKTsKICAgICBvdXQgPDwgIiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCk7Ci0gICAgaWYgKHZhcmlhYmxlLT5HZXRUeXBlKCkuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIikgewotICAgICAgb3V0IDw8ICJ7OjpuZGs6OiIgPDwgKGRlZmluZWRfdHlwZS5Jc1ZpbnRmU3RhYmlsaXR5KCkgPyAiU1RBQklMSVRZX1ZJTlRGIiA6ICJTVEFCSUxJVFlfTE9DQUwiKQotICAgICAgICAgIDw8ICJ9IjsKLSAgICB9CiAgICAgaWYgKGRlZmluZWRfdHlwZS5Jc0ZpeGVkU2l6ZSgpKSB7Ci0gICAgICBpbnQgYWxpZ25tZW50ID0gTmRrQWxpZ25tZW50T2YodHlwZXMsIHZhcmlhYmxlLT5HZXRUeXBlKCkpOworICAgICAgaW50IGFsaWdubWVudCA9IGNwcDo6QWxpZ25tZW50T2YodHlwZSwgdHlwZXMpOwogICAgICAgaWYgKGFsaWdubWVudCA+IDApIHsKICAgICAgICAgb3V0IDw8ICIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoIiA8PCBzdGQ6OnRvX3N0cmluZyhhbGlnbm1lbnQpIDw8ICIpKSkiOwogICAgICAgfQogICAgIH0KICAgICBpZiAodmFyaWFibGUtPkdldERlZmF1bHRWYWx1ZSgpKSB7CiAgICAgICBvdXQgPDwgIiA9ICIgPDwgdmFyaWFibGUtPlZhbHVlU3RyaW5nKENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOwotICAgIH0gZWxzZSBpZiAoYXV0byB0eXBlID0gdmFyaWFibGUtPkdldFR5cGUoKS5HZXREZWZpbmVkVHlwZSgpOyB0eXBlKSB7Ci0gICAgICBpZiAoYXV0byBlbnVtX3R5cGUgPSB0eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOyBlbnVtX3R5cGUpIHsKLSAgICAgICAgaWYgKCF2YXJpYWJsZS0+R2V0VHlwZSgpLklzQXJyYXkoKSkgewotICAgICAgICAgIC8vIGlmIGFuIGVudW0gZG9lc24ndCBoYXZlIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUsIGRvIHplcm8taW5pdGlhbGl6YXRpb24KLSAgICAgICAgICBvdXQgPDwgIiA9ICIgPDwgTmRrTmFtZU9mKHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpLCBTdG9yYWdlTW9kZTo6U1RBQ0spIDw8ICIoMCkiOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTb21lIHR5cGVzIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZXZlbiB3aGVuIG5vIGRlZmF1bHQgdmFsdWUgaXMgc2V0LgorICAgICAgLy8gLSBQYXJjZWxhYmxlSG9sZGVyIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHN0YWJpbGl0eS4KKyAgICAgIC8vIC0gZW51bSBzaG91bGQgYmUgemVybyBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGluZGV0ZXJtaW5hdGUKKyAgICAgIC8vIC0gZml4ZWQtc2l6ZSBhcnJheXMgc2hvdWxkIGJlIGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHZhbHVlIHdpbGwgYmUgaW5kZXRlcm1pbmF0ZQorICAgICAgaWYgKHR5cGUuR2V0TmFtZSgpID09ICJQYXJjZWxhYmxlSG9sZGVyIikgeworICAgICAgICBpZiAoZGVmaW5lZF90eXBlLklzVmludGZTdGFiaWxpdHkoKSkgeworICAgICAgICAgIG91dCA8PCAiezo6bmRrOjpTVEFCSUxJVFlfVklOVEZ9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIns6Om5kazo6U1RBQklMSVRZX0xPQ0FMfSI7CiAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZXMuR2V0RW51bURlY2xhcmF0aW9uKHR5cGUpICYmICF0eXBlLklzQXJyYXkoKSkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgY3BwX3R5cGUgPDwgIigwKSI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUuSXNGaXhlZFNpemVBcnJheSgpICYmICF0eXBlLklzTnVsbGFibGUoKSkgeworICAgICAgICBvdXQgPDwgIiA9IHt7fX0iOwogICAgICAgfQogICAgIH0KICAgICBvdXQgPDwgIjtcbiI7CkBAIC0xMDcxLDEyICsxMTgzLDEwIEBACiAKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn07XG4iOwotICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CiB9CiB2b2lkIEdlbmVyYXRlUGFyY2VsU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgZGVmaW5lZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiAvKm9wdGlvbnMqLykgewotICBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIGNsYXp6ID0gR2V0UXVhbGlmaWVkTmFtZShkZWZpbmVkX3R5cGUpOwogICBpZiAoZGVmaW5lZF90eXBlLklzR2VuZXJpYygpKSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRlbXBsYXRlX3BhcmFtczsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcmFtZXRlciA6IGRlZmluZWRfdHlwZS5HZXRUeXBlUGFyYW1ldGVycygpKSB7CkBAIC0xMDg1LDExICsxMTk1LDcgQEAKICAgICBjbGF6eiArPSBiYXNlOjpTdHJpbmdQcmludGYoIjwlcz4iLCBiYXNlOjpKb2luKHRlbXBsYXRlX3BhcmFtcywgIiwgIikuY19zdHIoKSk7CiAgIH0KIAotICBvdXQgPDwgIiNpbmNsdWRlIFwiIiA8PCBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLykKLSAgICAgIDw8ICJcIlxuIjsKLSAgb3V0IDw8ICJcbiI7Ci0gIEdlbmVyYXRlU291cmNlSW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlKTsKLSAgb3V0IDw8ICJcbiI7CisgIEdlbmVyYXRlU291cmNlSW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKICAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgY3BwOjpUZW1wbGF0ZURlY2woZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICJjb25zdCBjaGFyKiAiIDw8IGNsYXp6IDw8ICI6OiIgPDwga0Rlc2NyaXB0b3IgPDwgIiA9IFwiIgpAQCAtMTA5OSw0OSArMTIwNSw1MCBAQAogICBHZW5lcmF0ZUNvbnN0YW50RGVmaW5pdGlvbnMob3V0LCBkZWZpbmVkX3R5cGUsIGNsYXp6LCBjcHA6OlRlbXBsYXRlRGVjbChkZWZpbmVkX3R5cGUpKTsKIAogICBvdXQgPDwgY3BwOjpUZW1wbGF0ZURlY2woZGVmaW5lZF90eXBlKTsKLSAgb3V0IDw8ICJiaW5kZXJfc3RhdHVzX3QgIiA8PCBjbGF6eiA8PCAiOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHtcbiI7CisgIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgY2xhenogPDwgIjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7XG4iOwogICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCAiaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7XG4iOwotICBvdXQgPDwgImludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTtcbiI7Ci0gIG91dCA8PCAiYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIjsKLSAgb3V0IDw8ICJpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTtcbiI7Ci0gIG91dCA8PCAiaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFO1xuIjsKKyAgb3V0IDw8ICJiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSztcbiI7CisgIG91dCA8PCAiaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpO1xuIjsKKyAgb3V0IDw8ICJpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7XG4iOworICBvdXQgPDwgIl9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIjsKICAgU3RhdHVzQ2hlY2tSZXR1cm4ob3V0KTsKLQorICBvdXQgPDwgImlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTtcbiI7CisgIG91dCA8PCAiaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7XG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogZGVmaW5lZF90eXBlLkdldEZpZWxkcygpKSB7Ci0gICAgb3V0IDw8ICJpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHtcbiIKLSAgICAgICAgPDwgIiAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIgorICAgIG91dCA8PCAiaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSAiCisgICAgICAgICAgICJ7XG4iCisgICAgICAgIDw8ICIgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTtcbiIKICAgICAgICAgPDwgIiAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7XG4iCiAgICAgICAgIDw8ICJ9XG4iOwogICAgIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9ICI7Ci0gICAgUmVhZEZyb21QYXJjZWxGb3Ioe291dCwgdHlwZXMsIHZhcmlhYmxlLT5HZXRUeXBlKCksICJwYXJjZWwiLCAiJiIgKyB2YXJpYWJsZS0+R2V0TmFtZSgpfSk7CisgICAgUmVhZEZyb21QYXJjZWxGb3Ioe291dCwgdHlwZXMsIHZhcmlhYmxlLT5HZXRUeXBlKCksICJfYWlkbF9wYXJjZWwiLCAiJiIgKyB2YXJpYWJsZS0+R2V0TmFtZSgpfSk7CiAgICAgb3V0IDw8ICI7XG4iOwogICAgIFN0YXR1c0NoZWNrUmV0dXJuKG91dCk7CiAgIH0KLSAgb3V0IDw8ICJBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7XG4iCisgIG91dCA8PCAiQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpO1xuIgogICAgICAgPDwgInJldHVybiBfYWlkbF9yZXRfc3RhdHVzO1xuIjsKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cbiI7CiAKICAgb3V0IDw8IGNwcDo6VGVtcGxhdGVEZWNsKGRlZmluZWRfdHlwZSk7Ci0gIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgY2xhenogPDwgIjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHtcbiI7CisgIG91dCA8PCAiYmluZGVyX3N0YXR1c190ICIgPDwgY2xhenogPDwgIjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgb3V0IDw8ICJiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cztcbiI7CiAKLSAgb3V0IDw8ICJzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTtcbiI7Ci0gIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApO1xuIjsKKyAgb3V0IDw8ICJzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTtcbiI7CisgIG91dCA8PCAiX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApO1xuIjsKICAgU3RhdHVzQ2hlY2tSZXR1cm4ob3V0KTsKIAogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogZGVmaW5lZF90eXBlLkdldEZpZWxkcygpKSB7CiAgICAgb3V0IDw8ICJfYWlkbF9yZXRfc3RhdHVzID0gIjsKLSAgICBXcml0ZVRvUGFyY2VsRm9yKHtvdXQsIHR5cGVzLCB2YXJpYWJsZS0+R2V0VHlwZSgpLCAicGFyY2VsIiwgdmFyaWFibGUtPkdldE5hbWUoKX0pOworICAgIFdyaXRlVG9QYXJjZWxGb3Ioe291dCwgdHlwZXMsIHZhcmlhYmxlLT5HZXRUeXBlKCksICJfYWlkbF9wYXJjZWwiLCB2YXJpYWJsZS0+R2V0TmFtZSgpfSk7CiAgICAgb3V0IDw8ICI7XG4iOwogICAgIFN0YXR1c0NoZWNrUmV0dXJuKG91dCk7CiAgIH0KLSAgb3V0IDw8ICJzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7XG4iOwotICBvdXQgPDwgIkFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTtcbiI7Ci0gIG91dCA8PCAiQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7XG4iOwotICBvdXQgPDwgIkFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7XG4iOworICBvdXQgPDwgInNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTtcbiI7CisgIG91dCA8PCAiQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpO1xuIjsKKyAgb3V0IDw8ICJBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTtcbiI7CisgIG91dCA8PCAiQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTtcbiI7CiAKICAgb3V0IDw8ICJyZXR1cm4gX2FpZGxfcmV0X3N0YXR1cztcbiI7CiAgIG91dC5EZWRlbnQoKTsKQEAgLTExNTAsOCArMTI1Nyw4IEBACiAgIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKIH0KIAotdm9pZCBHZW5lcmF0ZVBhcmNlbEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVW5pb25EZWNsJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIC8qb3B0aW9ucyovKSB7Cit2b2lkIEdlbmVyYXRlUGFyY2VsQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBjb25zdCBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVyk7CiAgIGNwcDo6VW5pb25Xcml0ZXIgdXd7ZGVmaW5lZF90eXBlLCB0eXBlcywKICAgICAgICAgICAgICAgICAgICAgICBbJl0oY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzKSB7CkBAIC0xMTU5LDI4ICsxMjY2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICZDb25zdGFudFZhbHVlRGVjb3JhdG9yfTsKIAotICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuIjsKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+XG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+XG4iOwotCi0gIC8vIHVzZWQgYnkgdG9TdHJpbmcoKQotICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD5cbiI7Ci0KLSAgb3V0IDw8ICJcbiI7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBoZWFkZXIgOiBjcHA6OlVuaW9uV3JpdGVyOjpoZWFkZXJzKSB7Ci0gICAgb3V0IDw8ICIjaW5jbHVkZSA8IiA8PCBoZWFkZXIgPDwgIj5cbiI7Ci0gIH0KLSAgR2VuZXJhdGVIZWFkZXJJbmNsdWRlcyhvdXQsIHR5cGVzLCBkZWZpbmVkX3R5cGUpOwotCi0gIC8vIFRPRE8oYi8zMTU1OTA5NSkgYmlvbmljIG9uIGhvc3Qgc2hvdWxkIGRlZmluZSB0aGlzCi0gIG91dCA8PCAiXG4iOwotICBvdXQgPDwgIiNpZm5kZWYgX19CSU9OSUNfX1xuIjsKLSAgb3V0IDw8ICIjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMClcbiI7Ci0gIG91dCA8PCAiI2VuZGlmXG4iOwotICBvdXQgPDwgIlxuIjsKLQotICBFbnRlck5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CiAgIG91dCA8PCBjcHA6OlRlbXBsYXRlRGVjbChkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgImNsYXNzIjsKICAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQob3V0LCBkZWZpbmVkX3R5cGUpOwpAQCAtMTE5NCw2ICsxMjc5LDcgQEAKICAgfQogICBvdXQgPDwgInN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yO1xuIjsKICAgb3V0IDw8ICJcbiI7CisgIEdlbmVyYXRlTmVzdGVkVHlwZURlY2xzKG91dCwgdHlwZXMsIGRlZmluZWRfdHlwZSwgb3B0aW9ucyk7CiAgIHV3LlB1YmxpY0ZpZWxkcyhvdXQpOwogCiAgIG91dCA8PCAiYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpO1xuIjsKQEAgLTEyMTIsMTEgKzEyOTgsMTAgQEAKICAgdXcuUHJpdmF0ZUZpZWxkcyhvdXQpOwogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifTtcbiI7Ci0gIExlYXZlTmRrTmFtZXNwYWNlKG91dCwgZGVmaW5lZF90eXBlKTsKIH0KIHZvaWQgR2VuZXJhdGVQYXJjZWxTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFVuaW9uRGVjbCYgZGVmaW5lZF90eXBlLCBjb25zdCBPcHRpb25zJiAvKm9wdGlvbnMqLykgewotICBzdGQ6OnN0cmluZyBjbGF6eiA9IENsYXNzTmFtZShkZWZpbmVkX3R5cGUsIENsYXNzTmFtZXM6OlJBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxVbmlvbkRlY2wmIGRlZmluZWRfdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBzdGQ6OnN0cmluZyBjbGF6eiA9IEdldFF1YWxpZmllZE5hbWUoZGVmaW5lZF90eXBlKTsKICAgaWYgKGRlZmluZWRfdHlwZS5Jc0dlbmVyaWMoKSkgewogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZW1wbGF0ZV9wYXJhbXM7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJhbWV0ZXIgOiBkZWZpbmVkX3R5cGUuR2V0VHlwZVBhcmFtZXRlcnMoKSkgewpAQCAtMTI0NCwxMSArMTMyOSw3IEBACiAgICAgICAgICAgfSwKICAgfTsKIAotICBvdXQgPDwgIiNpbmNsdWRlIFwiIiA8PCBOZGtIZWFkZXJGaWxlKGRlZmluZWRfdHlwZSwgQ2xhc3NOYW1lczo6UkFXLCBmYWxzZSAvKnVzZV9vc19zZXAqLykKLSAgICAgIDw8ICJcIlxuIjsKLSAgb3V0IDw8ICJcbiI7Ci0gIEdlbmVyYXRlU291cmNlSW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlKTsKLSAgb3V0IDw8ICJcbiI7CisgIEdlbmVyYXRlU291cmNlSW5jbHVkZXMob3V0LCB0eXBlcywgZGVmaW5lZF90eXBlLCBvcHRpb25zKTsKICAgRW50ZXJOZGtOYW1lc3BhY2Uob3V0LCBkZWZpbmVkX3R5cGUpOwogICBvdXQgPDwgY3BwOjpUZW1wbGF0ZURlY2woZGVmaW5lZF90eXBlKTsKICAgb3V0IDw8ICJjb25zdCBjaGFyKiAiIDw8IGNsYXp6IDw8ICI6OiIgPDwga0Rlc2NyaXB0b3IgPDwgIiA9IFwiIgpAQCAtMTI3NCw3MCArMTM1NSwxMiBAQAogICBMZWF2ZU5ka05hbWVzcGFjZShvdXQsIGRlZmluZWRfdHlwZSk7CiB9CiAKLXN0ZDo6c3RyaW5nIEdlbmVyYXRlRW51bVRvU3RyaW5nKGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIGVudW1fZGVjbCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29kZTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgc2lnbmF0dXJlID0KLSAgICAgICJbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIiArIGVudW1fZGVjbC5HZXROYW1lKCkgKyAiIHZhbCkiOwotICBpZiAoZW51bV9kZWNsLklzRGVwcmVjYXRlZCgpKSB7Ci0gICAgY29kZSA8PCBzaWduYXR1cmU7Ci0gICAgY3BwOjpHZW5lcmF0ZURlcHJlY2F0ZWQoY29kZSwgZW51bV9kZWNsKTsKLSAgICBjb2RlIDw8ICI7XG4iOwotICB9Ci0gIGNvZGUgPDwgc2lnbmF0dXJlIDw8ICIge1xuIjsKLSAgY29kZSA8PCAiICBzd2l0Y2godmFsKSB7XG4iOwotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdW5pcXVlX2Nhc2VzOwotICBmb3IgKGNvbnN0IGF1dG8mIGVudW1lcmF0b3IgOiBlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKSkgewotICAgIHN0ZDo6c3RyaW5nIGMgPSBlbnVtZXJhdG9yLT5WYWx1ZVN0cmluZyhlbnVtX2RlY2wuR2V0QmFja2luZ1R5cGUoKSwgQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7Ci0gICAgLy8gT25seSBhZGQgYSBjYXNlIGlmIGl0cyB2YWx1ZSBoYXMgbm90IHlldCBiZWVuIHVzZWQgaW4gdGhlIHN3aXRjaAotICAgIC8vIHN0YXRlbWVudC4gQysrIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIGNhc2VzIHdpdGggdGhlIHNhbWUgdmFsdWUsIGJ1dAotICAgIC8vIGVudW1zIGRvZXMgYWxsb3cgdGhpcy4gSW4gdGhpcyBzY2VuYXJpbywgdGhlIGZpcnN0IGRlY2xhcmVkCi0gICAgLy8gZW51bWVyYXRvciB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBpcyBwcmludGVkLgotICAgIGlmICh1bmlxdWVfY2FzZXMuY291bnQoYykgPT0gMCkgewotICAgICAgdW5pcXVlX2Nhc2VzLmluc2VydChjKTsKLSAgICAgIGNvZGUgPDwgIiAgY2FzZSAiIDw8IGVudW1fZGVjbC5HZXROYW1lKCkgPDwgIjo6IiA8PCBlbnVtZXJhdG9yLT5HZXROYW1lKCkgPDwgIjpcbiI7Ci0gICAgICBjb2RlIDw8ICIgICAgcmV0dXJuIFwiIiA8PCBlbnVtZXJhdG9yLT5HZXROYW1lKCkgPDwgIlwiO1xuIjsKLSAgICB9Ci0gIH0KLSAgY29kZSA8PCAiICBkZWZhdWx0OlxuIjsKLSAgY29kZSA8PCAiICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDwiCi0gICAgICAgPDwgTmRrTmFtZU9mKHR5cGVuYW1lcywgZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIFN0b3JhZ2VNb2RlOjpTVEFDSykgPDwgIj4odmFsKSk7XG4iOwotICBjb2RlIDw8ICIgIH1cbiI7Ci0gIGNvZGUgPDwgIn1cbiI7Ci0gIHJldHVybiBjb2RlLnN0cigpOwotfQotCi12b2lkIEdlbmVyYXRlRW51bUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLCBjb25zdCBPcHRpb25zJiAvKm9wdGlvbnMqLykgewotICBvdXQgPDwgIiNwcmFnbWEgb25jZVxuIjsKK3ZvaWQgR2VuZXJhdGVFbnVtQ2xhc3NEZWNsKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uJiBlbnVtX2RlY2wsIGNvbnN0IE9wdGlvbnMmKSB7CisgIGNwcDo6R2VuZXJhdGVFbnVtQ2xhc3NEZWNsKG91dCwgZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGtOYW1lT2YodHlwZXMsIGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBTdG9yYWdlTW9kZTo6U1RBQ0spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKICAgb3V0IDw8ICJcbiI7Ci0KLSAgR2VuZXJhdGVIZWFkZXJJbmNsdWRlcyhvdXQsIHR5cGVzLCBlbnVtX2RlY2wpOwotICAvLyBlbnVtIHNwZWNpZmljIGhlYWRlcnMKLSAgb3V0IDw8ICIjaW5jbHVkZSA8YXJyYXk+XG4iOwotICBvdXQgPDwgIiNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPlxuIjsKLQotICBFbnRlck5ka05hbWVzcGFjZShvdXQsIGVudW1fZGVjbCk7Ci0gIG91dCA8PCAiZW51bSBjbGFzcyI7Ci0gIGNwcDo6R2VuZXJhdGVEZXByZWNhdGVkKG91dCwgZW51bV9kZWNsKTsKLSAgb3V0IDw8ICIgIiA8PCBlbnVtX2RlY2wuR2V0TmFtZSgpIDw8ICIgOiAiCi0gICAgICA8PCBOZGtOYW1lT2YodHlwZXMsIGVudW1fZGVjbC5HZXRCYWNraW5nVHlwZSgpLCBTdG9yYWdlTW9kZTo6U1RBQ0spIDw8ICIge1xuIjsKLSAgb3V0LkluZGVudCgpOwotICBmb3IgKGNvbnN0IGF1dG8mIGVudW1lcmF0b3IgOiBlbnVtX2RlY2wuR2V0RW51bWVyYXRvcnMoKSkgewotICAgIG91dCA8PCBlbnVtZXJhdG9yLT5HZXROYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgPDwgZW51bWVyYXRvci0+VmFsdWVTdHJpbmcoZW51bV9kZWNsLkdldEJhY2tpbmdUeXBlKCksIENvbnN0YW50VmFsdWVEZWNvcmF0b3IpIDw8ICIsXG4iOwotICB9Ci0gIG91dC5EZWRlbnQoKTsKLSAgb3V0IDw8ICJ9O1xuIjsKLSAgb3V0IDw8ICJcbiI7Ci0gIG91dCA8PCBHZW5lcmF0ZUVudW1Ub1N0cmluZyh0eXBlcywgZW51bV9kZWNsKTsKLSAgTGVhdmVOZGtOYW1lc3BhY2Uob3V0LCBlbnVtX2RlY2wpOwotCi0gIG91dCA8PCAibmFtZXNwYWNlIG5kayB7XG4iOwotICBvdXQgPDwgIm5hbWVzcGFjZSBpbnRlcm5hbCB7XG4iOwotICBvdXQgPDwgY3BwOjpHZW5lcmF0ZUVudW1WYWx1ZXMoZW51bV9kZWNsLCB7ImFpZGwifSk7Ci0gIG91dCA8PCAifSAgLy8gbmFtZXNwYWNlIGludGVybmFsXG4iOwotICBvdXQgPDwgIn0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkXG4iOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWxzCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9uZGsuaCBiL2dlbmVyYXRlX25kay5oCmluZGV4IDZiODkzYTMuLmQ5YmM5MTAgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX25kay5oCisrKyBiL2dlbmVyYXRlX25kay5oCkBAIC0yOSwyOCArMjksNiBAQAogdm9pZCBHZW5lcmF0ZU5kayhjb25zdCBzdHJpbmcmIG91dHB1dF9maWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKTsKIAotbmFtZXNwYWNlIGludGVybmFscyB7Ci12b2lkIEdlbmVyYXRlU291cmNlKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci12b2lkIEdlbmVyYXRlQ2xhc3NTb3VyY2UoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZUNsaWVudFNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZVNlcnZlclNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZUludGVyZmFjZVNvdXJjZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZUNsaWVudEhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZVNlcnZlckhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotdm9pZCBHZW5lcmF0ZUludGVyZmFjZUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsSW50ZXJmYWNlJiBkZWZpbmVkX3R5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotCi12b2lkIEdlbmVyYXRlRW51bUhlYWRlcihDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgZW51bV9kZWNsLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFscwogfSAgLy8gbmFtZXNwYWNlIG5kawogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9nZW5lcmF0ZV9ydXN0LmNwcCBiL2dlbmVyYXRlX3J1c3QuY3BwCmluZGV4IDM4MTdmNjQuLjA3OWE2YzcgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX3J1c3QuY3BwCisrKyBiL2dlbmVyYXRlX3J1c3QuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAibG9nZ2luZy5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpKb2luOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiB1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07CiB1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OnN0cmluZzsKQEAgLTQ3LDczICs0OCwxMjggQEAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciBrR2V0SW50ZXJmYWNlVmVyc2lvbltdID0gImdldEludGVyZmFjZVZlcnNpb24iOwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyIGtHZXRJbnRlcmZhY2VIYXNoW10gPSAiZ2V0SW50ZXJmYWNlSGFzaCI7CiAKLXZvaWQgR2VuZXJhdGVNYW5nbGVkQWxpYXMoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHR5cGUpIHsKLSAgb3N0cmluZ3N0cmVhbSBhbGlhczsKLSAgZm9yIChjb25zdCBhdXRvJiBjb21wb25lbnQgOiB0eXBlLT5HZXRTcGxpdFBhY2thZ2UoKSkgewotICAgIGFsaWFzIDw8ICJfIiA8PCBjb21wb25lbnQuc2l6ZSgpIDw8ICJfIiA8PCBjb21wb25lbnQ7Ci0gIH0KLSAgYWxpYXMgPDwgIl8iIDw8IHR5cGUtPkdldE5hbWUoKS5zaXplKCkgPDwgIl8iIDw8IHR5cGUtPkdldE5hbWUoKTsKLSAgb3V0IDw8ICJwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6IiA8PCB0eXBlLT5HZXROYW1lKCkgPDwgIiBhcyAiIDw8IGFsaWFzLnN0cigpCi0gICAgICA8PCAiOyB9XG4iOwordm9pZCBHZW5lcmF0ZU1hbmdsZWRBbGlhc2VzKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSB7CisgIHN0cnVjdCBWaXNpdG9yIDogQWlkbFZpc2l0b3IgeworICAgIENvZGVXcml0ZXImIG91dDsKKyAgICBWaXNpdG9yKENvZGVXcml0ZXImIG91dCkgOiBvdXQob3V0KSB7fQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiB0eXBlKSBvdmVycmlkZSB7IFZpc2l0VHlwZSh0eXBlKTsgfQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgdHlwZSkgb3ZlcnJpZGUgeyBWaXNpdFR5cGUodHlwZSk7IH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24mIHR5cGUpIG92ZXJyaWRlIHsgVmlzaXRUeXBlKHR5cGUpOyB9CisgICAgdm9pZCBWaXNpdChjb25zdCBBaWRsVW5pb25EZWNsJiB0eXBlKSBvdmVycmlkZSB7IFZpc2l0VHlwZSh0eXBlKTsgfQorICAgIHZvaWQgVmlzaXRUeXBlKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgeworICAgICAgb3V0IDw8ICIgcHViIHVzZSAiIDw8IFFuYW1lKHR5cGUpIDw8ICIgYXMgIiA8PCBNYW5nbGVkKHR5cGUpIDw8ICI7XG4iOworICAgIH0KKyAgICAvLyBSZXR1cm4gYSBtYW5nbGVkIG5hbWUgZm9yIGEgdHlwZSAoaW5jbHVkaW5nIEFJREwgcGFja2FnZSkKKyAgICBzdHJpbmcgTWFuZ2xlZChjb25zdCBBaWRsRGVmaW5lZFR5cGUmIHR5cGUpIGNvbnN0IHsKKyAgICAgIG9zdHJpbmdzdHJlYW0gYWxpYXM7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbXBvbmVudCA6IFNwbGl0KHR5cGUuR2V0Q2Fub25pY2FsTmFtZSgpLCAiLiIpKSB7CisgICAgICAgIGFsaWFzIDw8ICJfIiA8PCBjb21wb25lbnQuc2l6ZSgpIDw8ICJfIiA8PCBjb21wb25lbnQ7CisgICAgICB9CisgICAgICByZXR1cm4gYWxpYXMuc3RyKCk7CisgICAgfQorICAgIC8vIFJldHVybiBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciBhIHR5cGUgaW4gdGhlIGN1cnJlbnQgZmlsZSAoZXhjbHVkaW5nIEFJREwgcGFja2FnZSkKKyAgICBzdHJpbmcgUW5hbWUoY29uc3QgQWlkbERlZmluZWRUeXBlJiB0eXBlKSBjb25zdCB7IHJldHVybiBNb2R1bGUodHlwZSkgKyAiOjoiICsgdHlwZS5HZXROYW1lKCk7IH0KKyAgICAvLyBSZXR1cm4gYSBtb2R1bGUgbmFtZSBmb3IgYSB0eXBlIChyZWxhdGl2ZSB0byB0aGUgZmlsZSkKKyAgICBzdHJpbmcgTW9kdWxlKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgdHlwZSkgY29uc3QgeworICAgICAgaWYgKHR5cGUuR2V0UGFyZW50VHlwZSgpKSB7CisgICAgICAgIHJldHVybiBNb2R1bGUoKnR5cGUuR2V0UGFyZW50VHlwZSgpKSArICI6OiIgKyB0eXBlLkdldE5hbWUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAic3VwZXIiOworICAgICAgfQorICAgIH0KKyAgfSB2KG91dCk7CisgIG91dCA8PCAicHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7XG4iOworICBWaXNpdFRvcERvd24odiwgdHlwZSk7CisgIG91dCA8PCAifVxuIjsKIH0KIAotc3RyaW5nIEJ1aWxkQXJnKGNvbnN0IEFpZGxBcmd1bWVudCYgYXJnLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK3N0cmluZyBCdWlsZEFyZyhjb25zdCBBaWRsQXJndW1lbnQmIGFyZywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBMaWZldGltZSBsaWZldGltZSkgewogICAvLyBXZSBwYXNzIGluIHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHByaW1pdGl2ZXMgYnkgY29uc3QgcmVmZXJlbmNlLgogICAvLyBBcnJheXMgZ2V0IHBhc3NlZCBpbiBhcyBzbGljZXMsIHdoaWNoIGlzIGhhbmRsZWQgaW4gUnVzdE5hbWVPZi4KICAgYXV0byBhcmdfbW9kZSA9IEFyZ3VtZW50U3RvcmFnZU1vZGUoYXJnLCB0eXBlbmFtZXMpOwotICBhdXRvIGFyZ190eXBlID0gUnVzdE5hbWVPZihhcmcuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIGFyZ19tb2RlKTsKKyAgYXV0byBhcmdfdHlwZSA9IFJ1c3ROYW1lT2YoYXJnLkdldFR5cGUoKSwgdHlwZW5hbWVzLCBhcmdfbW9kZSwgbGlmZXRpbWUpOwogICByZXR1cm4ga0FyZ3VtZW50UHJlZml4ICsgYXJnLkdldE5hbWUoKSArICI6ICIgKyBhcmdfdHlwZTsKIH0KIAotc3RyaW5nIEJ1aWxkTWV0aG9kKGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIGF1dG8gbWV0aG9kX3R5cGUgPSBSdXN0TmFtZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFKTsKLSAgYXV0byByZXR1cm5fdHlwZSA9IHN0cmluZ3siYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8In0gKyBtZXRob2RfdHlwZSArICI+IjsKK2VudW0gY2xhc3MgTWV0aG9kS2luZCB7CisgIC8vIFRoaXMgaXMgYSBub3JtYWwgbm9uLWFzeW5jIG1ldGhvZC4KKyAgTk9STUFMLAorICAvLyBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZC4gSWRlbnRpY2FsIHRvIE5PUk1BTCBleGNlcHQgdGhhdCBhc3luYyBpcyBhZGRlZAorICAvLyBpbiBmcm9udCBvZiBgZm5gLgorICBBU1lOQywKKyAgLy8gVGhpcyBpcyBhbiBhc3luYyBmdW5jdGlvbiwgYnV0IHVzaW5nIGEgYm94ZWQgZnV0dXJlIGluc3RlYWQgb2YgdGhlIGFzeW5jCisgIC8vIGtleXdvcmQuCisgIEJPWEVEX0ZVVFVSRSwKKyAgLy8gVGhpcyBjb3VsZCBoYXZlIGJlZW4gYSBub24tYXN5bmMgbWV0aG9kLCBidXQgaXQgcmV0dXJucyBhIEZ1dHVyZSBzbyB0aGF0CisgIC8vIGl0IHdvdWxkIG5vdCBiZSBicmVha2luZyB0byBtYWtlIHRoZSBmdW5jdGlvbiBkbyBhc3luYyBzdHVmZiBpbiB0aGUgZnV0dXJlLgorICBSRUFEWV9GVVRVUkUsCit9OworCitzdHJpbmcgQnVpbGRNZXRob2QoY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kS2luZCBraW5kID0gTWV0aG9kS2luZDo6Tk9STUFMKSB7CisgIC8vIFdlIG5lZWQgdG8gbWFyayB0aGUgYXJndW1lbnRzIHdpdGggYSBsaWZldGltZSBvbmx5IHdoZW4gcmV0dXJuaW5nIGEgZnV0dXJlIHRoYXQKKyAgLy8gYWN0dWFsbHkgY2FwdHVyZXMgdGhlIGFyZ3VtZW50cy4KKyAgTGlmZXRpbWUgbGlmZXRpbWU7CisgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgTWV0aG9kS2luZDo6Tk9STUFMOgorICAgIGNhc2UgTWV0aG9kS2luZDo6QVNZTkM6CisgICAgY2FzZSBNZXRob2RLaW5kOjpSRUFEWV9GVVRVUkU6CisgICAgICBsaWZldGltZSA9IExpZmV0aW1lOjpOT05FOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNZXRob2RLaW5kOjpCT1hFRF9GVVRVUkU6CisgICAgICBsaWZldGltZSA9IExpZmV0aW1lOjpBOworICAgICAgYnJlYWs7CisgIH0KKworICBhdXRvIG1ldGhvZF90eXBlID0gUnVzdE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSwgbGlmZXRpbWUpOworICBhdXRvIHJldHVybl90eXBlID0gc3RyaW5neyJiaW5kZXI6OlJlc3VsdDwifSArIG1ldGhvZF90eXBlICsgIj4iOworICBhdXRvIGZuX3ByZWZpeCA9IHN0cmluZ3siIn07CisKKyAgc3dpdGNoIChraW5kKSB7CisgICAgY2FzZSBNZXRob2RLaW5kOjpOT1JNQUw6CisgICAgICAvLyBEb24ndCB3cmFwIHRoZSByZXR1cm4gdHlwZSBpbiBhbnl0aGluZy4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWV0aG9kS2luZDo6QVNZTkM6CisgICAgICBmbl9wcmVmaXggPSAiYXN5bmMgIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWV0aG9kS2luZDo6Qk9YRURfRlVUVVJFOgorICAgICAgcmV0dXJuX3R5cGUgPSAiYmluZGVyOjpCb3hGdXR1cmU8J2EsICIgKyByZXR1cm5fdHlwZSArICI+IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWV0aG9kS2luZDo6UkVBRFlfRlVUVVJFOgorICAgICAgcmV0dXJuX3R5cGUgPSAic3RkOjpmdXR1cmU6OlJlYWR5PCIgKyByZXR1cm5fdHlwZSArICI+IjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3RyaW5nIHBhcmFtZXRlcnMgPSAiJiIgKyBSdXN0TGlmZXRpbWVOYW1lKGxpZmV0aW1lKSArICJzZWxmIjsKKyAgc3RyaW5nIGxpZmV0aW1lX3N0ciA9IFJ1c3RMaWZldGltZUdlbmVyaWMobGlmZXRpbWUpOworCisgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFpZGxBcmd1bWVudD4mIGFyZyA6IG1ldGhvZC5HZXRBcmd1bWVudHMoKSkgeworICAgIHBhcmFtZXRlcnMgKz0gIiwgIjsKKyAgICBwYXJhbWV0ZXJzICs9IEJ1aWxkQXJnKCphcmcsIHR5cGVuYW1lcywgbGlmZXRpbWUpOworICB9CisKKyAgcmV0dXJuIGZuX3ByZWZpeCArICJmbiAiICsgbWV0aG9kLkdldE5hbWUoKSArIGxpZmV0aW1lX3N0ciArICIoIiArIHBhcmFtZXRlcnMgKyAiKSAtPiAiICsKKyAgICAgICAgIHJldHVybl90eXBlOworfQorCit2b2lkIEdlbmVyYXRlQ2xpZW50TWV0aG9kSGVscGVycyhDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbE1ldGhvZCYgbWV0aG9kLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF90cmFpdF9uYW1lKSB7CiAgIHN0cmluZyBwYXJhbWV0ZXJzID0gIiZzZWxmIjsKICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYXJnIDogbWV0aG9kLkdldEFyZ3VtZW50cygpKSB7CiAgICAgcGFyYW1ldGVycyArPSAiLCAiOwotICAgIHBhcmFtZXRlcnMgKz0gQnVpbGRBcmcoKmFyZywgdHlwZW5hbWVzKTsKLSAgfQotICByZXR1cm4gImZuICIgKyBtZXRob2QuR2V0TmFtZSgpICsgIigiICsgcGFyYW1ldGVycyArICIpIC0+ICIgKyByZXR1cm5fdHlwZTsKLX0KLQotdm9pZCBHZW5lcmF0ZUNsaWVudE1ldGhvZChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxJbnRlcmZhY2UmIGlmYWNlLCBjb25zdCBBaWRsTWV0aG9kJiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWl0X25hbWUpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIG1ldGhvZAotICBvdXQgPDwgQnVpbGRNZXRob2QobWV0aG9kLCB0eXBlbmFtZXMpIDw8ICIge1xuIjsKLSAgb3V0LkluZGVudCgpOwotCi0gIGlmICghbWV0aG9kLklzVXNlckRlZmluZWQoKSkgewotICAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgewotICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZlcnNpb24gaXMgaW4gdGhlIGNhY2hlCi0gICAgICBvdXQgPDwgImxldCBfYWlkbF92ZXJzaW9uID0gIgotICAgICAgICAgICAgICJzZWxmLmNhY2hlZF92ZXJzaW9uLmxvYWQoc3RkOjpzeW5jOjphdG9taWM6Ok9yZGVyaW5nOjpSZWxheGVkKTtcbiI7Ci0gICAgICBvdXQgPDwgImlmIF9haWRsX3ZlcnNpb24gIT0gLTEgeyByZXR1cm4gT2soX2FpZGxfdmVyc2lvbik7IH1cbiI7Ci0gICAgfQotCi0gICAgaWYgKG1ldGhvZC5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZUhhc2ggJiYgIW9wdGlvbnMuSGFzaCgpLmVtcHR5KCkpIHsKLSAgICAgIG91dCA8PCAie1xuIjsKLSAgICAgIG91dCA8PCAiICBsZXQgX2FpZGxfaGFzaF9sb2NrID0gc2VsZi5jYWNoZWRfaGFzaC5sb2NrKCkudW53cmFwKCk7XG4iOwotICAgICAgb3V0IDw8ICIgIGlmIGxldCBTb21lKHJlZiBfYWlkbF9oYXNoKSA9ICpfYWlkbF9oYXNoX2xvY2sge1xuIjsKLSAgICAgIG91dCA8PCAiICAgIHJldHVybiBPayhfYWlkbF9oYXNoLmNsb25lKCkpO1xuIjsKLSAgICAgIG91dCA8PCAiICB9XG4iOwotICAgICAgb3V0IDw8ICJ9XG4iOwotICAgIH0KKyAgICBwYXJhbWV0ZXJzICs9IEJ1aWxkQXJnKCphcmcsIHR5cGVuYW1lcywgTGlmZXRpbWU6Ok5PTkUpOwogICB9CiAKLSAgLy8gQ2FsbCB0cmFuc2FjdCgpCi0gIHZlY3RvcjxzdHJpbmc+IGZsYWdzOwotICBpZiAobWV0aG9kLklzT25ld2F5KCkpIGZsYWdzLnB1c2hfYmFjaygiYmluZGVyOjpGTEFHX09ORVdBWSIpOwotICBpZiAoaWZhY2UuSXNTZW5zaXRpdmVEYXRhKCkpIGZsYWdzLnB1c2hfYmFjaygiYmluZGVyOjpGTEFHX0NMRUFSX0JVRiIpOwotICBmbGFncy5wdXNoX2JhY2soImJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMIik7Ci0KLSAgc3RyaW5nIHRyYW5zYWN0X2ZsYWdzID0gZmxhZ3MuZW1wdHkoKSA/ICIwIiA6IEpvaW4oZmxhZ3MsICIgfCAiKTsKLSAgb3V0IDw8ICJsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCgiCi0gICAgICA8PCAidHJhbnNhY3Rpb25zOjoiIDw8IG1ldGhvZC5HZXROYW1lKCkgPDwgIiwgIiA8PCB0cmFuc2FjdF9mbGFncyA8PCAiLCB8X2FpZGxfZGF0YXwge1xuIjsKKyAgLy8gR2VuZXJhdGUgYnVpbGRfcGFyY2VsIGhlbHBlci4KKyAgb3V0IDw8ICJmbiBidWlsZF9wYXJjZWxfIiArIG1ldGhvZC5HZXROYW1lKCkgKyAiKCIgKyBwYXJhbWV0ZXJzICsKKyAgICAgICAgICAgICAiKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKIAorICBvdXQgPDwgImxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPztcbiI7CisKICAgaWYgKGlmYWNlLklzU2Vuc2l0aXZlRGF0YSgpKSB7Ci0gICAgb3V0IDw8ICJfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7XG4iOworICAgIG91dCA8PCAiYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7XG4iOwogICB9CiAKICAgLy8gQXJndW1lbnRzCkBAIC0xMjQsMjQgKzE4MCwzMSBAQAogICAgICAgLy8gKHVubGVzcyB3ZSB0dXJuZWQgaXQgaW50byBhbiBPcHRpb248JlQ+KQogICAgICAgYXV0byByZWZfbW9kZSA9IEFyZ3VtZW50UmVmZXJlbmNlTW9kZSgqYXJnLCB0eXBlbmFtZXMpOwogICAgICAgaWYgKElzUmVmZXJlbmNlKHJlZl9tb2RlKSkgewotICAgICAgICBvdXQgPDwgIl9haWRsX2RhdGEud3JpdGUoIiA8PCBhcmdfbmFtZSA8PCAiKT87XG4iOworICAgICAgICBvdXQgPDwgImFpZGxfZGF0YS53cml0ZSgiIDw8IGFyZ19uYW1lIDw8ICIpPztcbiI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIl9haWRsX2RhdGEud3JpdGUoJiIgPDwgYXJnX25hbWUgPDwgIik/O1xuIjsKKyAgICAgICAgb3V0IDw8ICJhaWRsX2RhdGEud3JpdGUoJiIgPDwgYXJnX25hbWUgPDwgIik/O1xuIjsKICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGFyZy0+R2V0VHlwZSgpLklzQXJyYXkoKSkgeworICAgIH0gZWxzZSBpZiAoYXJnLT5HZXRUeXBlKCkuSXNEeW5hbWljQXJyYXkoKSkgewogICAgICAgLy8gRm9yIG91dC1vbmx5IGFycmF5cywgc2VuZCB0aGUgYXJyYXkgc2l6ZQogICAgICAgaWYgKGFyZy0+R2V0VHlwZSgpLklzTnVsbGFibGUoKSkgewotICAgICAgICBvdXQgPDwgIl9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZSgiIDw8IGFyZ19uYW1lIDw8ICIuYXNfZGVyZWYoKSk/O1xuIjsKKyAgICAgICAgb3V0IDw8ICJhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZSgiIDw8IGFyZ19uYW1lIDw8ICIuYXNfZGVyZWYoKSk/O1xuIjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoIiA8PCBhcmdfbmFtZSA8PCAiKSk/O1xuIjsKKyAgICAgICAgb3V0IDw8ICJhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKCIgPDwgYXJnX25hbWUgPDwgIikpPztcbiI7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgLy8gUmV0dXJuIE9rKCgpKSBpZiBhbGwgdGhlIGBfYWlkbF9kYXRhLndyaXRlKC4uLik/O2AgY2FsbHMgcGFzcwotICBvdXQgPDwgIk9rKCgpKVxuIjsKKyAgb3V0IDw8ICJPayhhaWRsX2RhdGEpXG4iOwogICBvdXQuRGVkZW50KCk7Ci0gIG91dCA8PCAifSk7XG4iOworICBvdXQgPDwgIn1cbiI7CisKKyAgLy8gR2VuZXJhdGUgcmVhZF9yZXNwb25zZSBoZWxwZXIuCisgIGF1dG8gcmV0dXJuX3R5cGUgPSBSdXN0TmFtZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFLCBMaWZldGltZTo6Tk9ORSk7CisgIG91dCA8PCAiZm4gcmVhZF9yZXNwb25zZV8iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArIHBhcmFtZXRlcnMgKworICAgICAgICAgICAgICIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgIgorICAgICAgICAgICAgICJiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwiICsKKyAgICAgICAgICAgICByZXR1cm5fdHlwZSArICI+IHtcbiI7CisgIG91dC5JbmRlbnQoKTsKIAogICAvLyBDaGVjayBmb3IgVU5LTk9XTl9UUkFOU0FDVElPTiBhbmQgY2FsbCB0aGUgZGVmYXVsdCBpbXBsCiAgIGlmIChtZXRob2QuSXNVc2VyRGVmaW5lZCgpKSB7CkBAIC0xNTQsNyArMjE3LDcgQEAKICAgICAgIGRlZmF1bHRfYXJncyArPSBhcmctPkdldE5hbWUoKTsKICAgICB9CiAgICAgb3V0IDw8ICJpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7XG4iOwotICAgIG91dCA8PCAiICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgIiA8PCB0cmFpdF9uYW1lCisgICAgb3V0IDw8ICIgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyAiIDw8IGRlZmF1bHRfdHJhaXRfbmFtZQogICAgICAgICA8PCAiPjo6Z2V0RGVmYXVsdEltcGwoKSB7XG4iOwogICAgIG91dCA8PCAiICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuIiA8PCBtZXRob2QuR2V0TmFtZSgpIDw8ICIoIiA8PCBkZWZhdWx0X2FyZ3MgPDwgIik7XG4iOwogICAgIG91dCA8PCAiICB9XG4iOwpAQCAtMTcyLDcgKzIzNSw4IEBACiAKICAgICAvLyBSZXR1cm4gcmVwbHkgdmFsdWUKICAgICBpZiAobWV0aG9kLkdldFR5cGUoKS5HZXROYW1lKCkgIT0gInZvaWQiKSB7Ci0gICAgICBhdXRvIHJldHVybl90eXBlID0gUnVzdE5hbWVPZihtZXRob2QuR2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSk7CisgICAgICBhdXRvIHJldHVybl90eXBlID0KKyAgICAgICAgICBSdXN0TmFtZU9mKG1ldGhvZC5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFLCBMaWZldGltZTo6Tk9ORSk7CiAgICAgICBvdXQgPDwgImxldCBfYWlkbF9yZXR1cm46ICIgPDwgcmV0dXJuX3R5cGUgPDwgIiA9IF9haWRsX3JlcGx5LnJlYWQoKT87XG4iOwogICAgICAgcmV0dXJuX3ZhbCA9ICJfYWlkbF9yZXR1cm4iOwogCkBAIC0xODcsMTIgKzI1MSwxMzggQEAKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IEFpZGxBcmd1bWVudCogYXJnIDogbWV0aG9kLkdldE91dEFyZ3VtZW50cygpKSB7Ci0gICAgICBvdXQgPDwgIioiIDw8IGtBcmd1bWVudFByZWZpeCA8PCBhcmctPkdldE5hbWUoKSA8PCAiID0gX2FpZGxfcmVwbHkucmVhZCgpPztcbiI7CisgICAgICBvdXQgPDwgIl9haWRsX3JlcGx5LnJlYWRfb250bygiIDw8IGtBcmd1bWVudFByZWZpeCA8PCBhcmctPkdldE5hbWUoKSA8PCAiKT87XG4iOwogICAgIH0KICAgfQogCiAgIC8vIFJldHVybiB0aGUgcmVzdWx0CiAgIG91dCA8PCAiT2soIiA8PCByZXR1cm5fdmFsIDw8ICIpXG4iOworCisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9XG4iOworfQorCit2b2lkIEdlbmVyYXRlQ2xpZW50TWV0aG9kKENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbEludGVyZmFjZSYgaWZhY2UsIGNvbnN0IEFpZGxNZXRob2QmIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2RLaW5kIGtpbmQpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIG1ldGhvZAorICBvdXQgPDwgQnVpbGRNZXRob2QobWV0aG9kLCB0eXBlbmFtZXMsIGtpbmQpIDw8ICIge1xuIjsKKyAgb3V0LkluZGVudCgpOworCisgIGlmICghbWV0aG9kLklzVXNlckRlZmluZWQoKSkgeworICAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VWZXJzaW9uICYmIG9wdGlvbnMuVmVyc2lvbigpID4gMCkgeworICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZlcnNpb24gaXMgaW4gdGhlIGNhY2hlCisgICAgICBvdXQgPDwgImxldCBfYWlkbF92ZXJzaW9uID0gIgorICAgICAgICAgICAgICJzZWxmLmNhY2hlZF92ZXJzaW9uLmxvYWQoc3RkOjpzeW5jOjphdG9taWM6Ok9yZGVyaW5nOjpSZWxheGVkKTtcbiI7CisgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBNZXRob2RLaW5kOjpOT1JNQUw6CisgICAgICAgIGNhc2UgTWV0aG9kS2luZDo6QVNZTkM6CisgICAgICAgICAgb3V0IDw8ICJpZiBfYWlkbF92ZXJzaW9uICE9IC0xIHsgcmV0dXJuIE9rKF9haWRsX3ZlcnNpb24pOyB9XG4iOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1ldGhvZEtpbmQ6OkJPWEVEX0ZVVFVSRToKKyAgICAgICAgICBvdXQgPDwgImlmIF9haWRsX3ZlcnNpb24gIT0gLTEgeyByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KE9rKF9haWRsX3ZlcnNpb24pKSk7ICIKKyAgICAgICAgICAgICAgICAgIn1cbiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTWV0aG9kS2luZDo6UkVBRFlfRlVUVVJFOgorICAgICAgICAgIG91dCA8PCAiaWYgX2FpZGxfdmVyc2lvbiAhPSAtMSB7IHJldHVybiBzdGQ6OmZ1dHVyZTo6cmVhZHkoT2soX2FpZGxfdmVyc2lvbikpOyB9XG4iOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRob2QuR2V0TmFtZSgpID09IGtHZXRJbnRlcmZhY2VIYXNoICYmICFvcHRpb25zLkhhc2goKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgIntcbiI7CisgICAgICBvdXQgPDwgIiAgbGV0IF9haWRsX2hhc2hfbG9jayA9IHNlbGYuY2FjaGVkX2hhc2gubG9jaygpLnVud3JhcCgpO1xuIjsKKyAgICAgIG91dCA8PCAiICBpZiBsZXQgU29tZShyZWYgX2FpZGxfaGFzaCkgPSAqX2FpZGxfaGFzaF9sb2NrIHtcbiI7CisgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBNZXRob2RLaW5kOjpOT1JNQUw6CisgICAgICAgIGNhc2UgTWV0aG9kS2luZDo6QVNZTkM6CisgICAgICAgICAgb3V0IDw8ICIgICAgcmV0dXJuIE9rKF9haWRsX2hhc2guY2xvbmUoKSk7XG4iOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1ldGhvZEtpbmQ6OkJPWEVEX0ZVVFVSRToKKyAgICAgICAgICBvdXQgPDwgIiAgICByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KE9rKF9haWRsX2hhc2guY2xvbmUoKSkpKTtcbiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTWV0aG9kS2luZDo6UkVBRFlfRlVUVVJFOgorICAgICAgICAgIG91dCA8PCAiICAgIHJldHVybiBzdGQ6OmZ1dHVyZTo6cmVhZHkoT2soX2FpZGxfaGFzaC5jbG9uZSgpKSk7XG4iOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgb3V0IDw8ICIgIH1cbiI7CisgICAgICBvdXQgPDwgIn1cbiI7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGJ1aWxkX3BhcmNlbF9hcmdzOworICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBaWRsQXJndW1lbnQ+JiBhcmcgOiBtZXRob2QuR2V0QXJndW1lbnRzKCkpIHsKKyAgICBpZiAoIWJ1aWxkX3BhcmNlbF9hcmdzLmVtcHR5KCkpIHsKKyAgICAgIGJ1aWxkX3BhcmNlbF9hcmdzICs9ICIsICI7CisgICAgfQorICAgIGJ1aWxkX3BhcmNlbF9hcmdzICs9IGtBcmd1bWVudFByZWZpeDsKKyAgICBidWlsZF9wYXJjZWxfYXJncyArPSBhcmctPkdldE5hbWUoKTsKKyAgfQorCisgIHN0cmluZyByZWFkX3Jlc3BvbnNlX2FyZ3MgPQorICAgICAgYnVpbGRfcGFyY2VsX2FyZ3MuZW1wdHkoKSA/ICJfYWlkbF9yZXBseSIgOiBidWlsZF9wYXJjZWxfYXJncyArICIsIF9haWRsX3JlcGx5IjsKKworICB2ZWN0b3I8c3RyaW5nPiBmbGFnczsKKyAgaWYgKG1ldGhvZC5Jc09uZXdheSgpKSBmbGFncy5wdXNoX2JhY2soImJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfT05FV0FZIik7CisgIGlmIChpZmFjZS5Jc1NlbnNpdGl2ZURhdGEoKSkgZmxhZ3MucHVzaF9iYWNrKCJiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiIpOworICBmbGFncy5wdXNoX2JhY2soImJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCIpOworCisgIHN0cmluZyB0cmFuc2FjdF9mbGFncyA9IGZsYWdzLmVtcHR5KCkgPyAiMCIgOiBKb2luKGZsYWdzLCAiIHwgIik7CisKKyAgc3dpdGNoIChraW5kKSB7CisgICAgY2FzZSBNZXRob2RLaW5kOjpOT1JNQUw6CisgICAgY2FzZSBNZXRob2RLaW5kOjpBU1lOQzoKKyAgICAgIC8vIFByZXBhcmUgdHJhbnNhY3Rpb24uCisgICAgICBvdXQgPDwgImxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfIiArIG1ldGhvZC5HZXROYW1lKCkgKyAiKCIgKyBidWlsZF9wYXJjZWxfYXJncyArCisgICAgICAgICAgICAgICAgICIpPztcbiI7CisgICAgICAvLyBTdWJtaXQgdHJhbnNhY3Rpb24uCisgICAgICBvdXQgPDwgImxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OiIgPDwgbWV0aG9kLkdldE5hbWUoKQorICAgICAgICAgIDw8ICIsIF9haWRsX2RhdGEsICIgPDwgdHJhbnNhY3RfZmxhZ3MgPDwgIik7XG4iOworICAgICAgLy8gRGVzZXJpYWxpemUgcmVzcG9uc2UuCisgICAgICBvdXQgPDwgInNlbGYucmVhZF9yZXNwb25zZV8iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArIHJlYWRfcmVzcG9uc2VfYXJncyArICIpXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNZXRob2RLaW5kOjpSRUFEWV9GVVRVUkU6CisgICAgICAvLyBQcmVwYXJlIHRyYW5zYWN0aW9uLgorICAgICAgb3V0IDw8ICJsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsXyIgKyBtZXRob2QuR2V0TmFtZSgpICsgIigiICsKKyAgICAgICAgICAgICAgICAgYnVpbGRfcGFyY2VsX2FyZ3MgKyAiKSB7XG4iOworICAgICAgb3V0LkluZGVudCgpOworICAgICAgb3V0IDw8ICJPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLFxuIjsKKyAgICAgIG91dCA8PCAiRXJyKGVycikgPT4gcmV0dXJuIHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSksXG4iOworICAgICAgb3V0LkRlZGVudCgpOworICAgICAgb3V0IDw8ICJ9O1xuIjsKKyAgICAgIC8vIFN1Ym1pdCB0cmFuc2FjdGlvbi4KKyAgICAgIG91dCA8PCAibGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6IiA8PCBtZXRob2QuR2V0TmFtZSgpCisgICAgICAgICAgPDwgIiwgX2FpZGxfZGF0YSwgIiA8PCB0cmFuc2FjdF9mbGFncyA8PCAiKTtcbiI7CisgICAgICAvLyBEZXNlcmlhbGl6ZSByZXNwb25zZS4KKyAgICAgIG91dCA8PCAic3RkOjpmdXR1cmU6OnJlYWR5KHNlbGYucmVhZF9yZXNwb25zZV8iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArCisgICAgICAgICAgICAgICAgIHJlYWRfcmVzcG9uc2VfYXJncyArICIpKVxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWV0aG9kS2luZDo6Qk9YRURfRlVUVVJFOgorICAgICAgLy8gUHJlcGFyZSB0cmFuc2FjdGlvbi4KKyAgICAgIG91dCA8PCAibGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF8iICsgbWV0aG9kLkdldE5hbWUoKSArICIoIiArCisgICAgICAgICAgICAgICAgIGJ1aWxkX3BhcmNlbF9hcmdzICsgIikge1xuIjsKKyAgICAgIG91dC5JbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSxcbiI7CisgICAgICBvdXQgPDwgIkVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSxcbiI7CisgICAgICBvdXQuRGVkZW50KCk7CisgICAgICBvdXQgPDwgIn07XG4iOworICAgICAgLy8gU3VibWl0IHRyYW5zYWN0aW9uLgorICAgICAgb3V0IDw8ICJsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTtcbiI7CisgICAgICBvdXQgPDwgIlA6OnNwYXduKFxuIjsKKyAgICAgIG91dC5JbmRlbnQoKTsKKyAgICAgIG91dCA8PCAibW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6IiA8PCBtZXRob2QuR2V0TmFtZSgpIDw8ICIsIF9haWRsX2RhdGEsICIKKyAgICAgICAgICA8PCB0cmFuc2FjdF9mbGFncyA8PCAiKSxcbiI7CisgICAgICBvdXQgPDwgIm1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHtcbiI7CisgICAgICBvdXQuSW5kZW50KCk7CisgICAgICAvLyBEZXNlcmlhbGl6ZSByZXNwb25zZS4KKyAgICAgIG91dCA8PCAic2VsZi5yZWFkX3Jlc3BvbnNlXyIgKyBtZXRob2QuR2V0TmFtZSgpICsgIigiICsgcmVhZF9yZXNwb25zZV9hcmdzICsgIilcbiI7CisgICAgICBvdXQuRGVkZW50KCk7CisgICAgICBvdXQgPDwgIn1cbiI7CisgICAgICBvdXQuRGVkZW50KCk7CisgICAgICBvdXQgPDwgIilcbiI7CisgICAgICBicmVhazsKKyAgfQorCiAgIG91dC5EZWRlbnQoKTsKICAgb3V0IDw8ICJ9XG4iOwogfQpAQCAtMjEyLDEyICs0MDIsMTIgQEAKICAgICAgIC8vIFdlIG5lZWQgYSB2YWx1ZSB3ZSBjYW4gY2FsbCBEZWZhdWx0OjpkZWZhdWx0KCkgb24KICAgICAgIGFyZ19tb2RlID0gU3RvcmFnZU1vZGU6OkRFRkFVTFRfVkFMVUU7CiAgICAgfQotICAgIGF1dG8gYXJnX3R5cGUgPSBSdXN0TmFtZU9mKGFyZy0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIGFyZ19tb2RlKTsKKyAgICBhdXRvIGFyZ190eXBlID0gUnVzdE5hbWVPZihhcmctPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBhcmdfbW9kZSwgTGlmZXRpbWU6Ok5PTkUpOwogCiAgICAgc3RyaW5nIGFyZ19tdXQgPSBhcmctPklzT3V0KCkgPyAibXV0ICIgOiAiIjsKICAgICBzdHJpbmcgYXJnX2luaXQgPSBhcmctPklzSW4oKSA/ICJfYWlkbF9kYXRhLnJlYWQoKT8iIDogIkRlZmF1bHQ6OmRlZmF1bHQoKSI7CiAgICAgb3V0IDw8ICJsZXQgIiA8PCBhcmdfbXV0IDw8IGFyZ19uYW1lIDw8ICI6ICIgPDwgYXJnX3R5cGUgPDwgIiA9ICIgPDwgYXJnX2luaXQgPDwgIjtcbiI7Ci0gICAgaWYgKCFhcmctPklzSW4oKSAmJiBhcmctPkdldFR5cGUoKS5Jc0FycmF5KCkpIHsKKyAgICBpZiAoIWFyZy0+SXNJbigpICYmIGFyZy0+R2V0VHlwZSgpLklzRHluYW1pY0FycmF5KCkpIHsKICAgICAgIC8vIF9haWRsX2RhdGEucmVzaXplX1tudWxsYWJsZV9db3V0X3ZlYygmbXV0IF9hcmdfZm9vKT87CiAgICAgICBhdXRvIHJlc2l6ZV9uYW1lID0gYXJnLT5HZXRUeXBlKCkuSXNOdWxsYWJsZSgpID8gInJlc2l6ZV9udWxsYWJsZV9vdXRfdmVjIiA6ICJyZXNpemVfb3V0X3ZlYyI7CiAgICAgICBvdXQgPDwgIl9haWRsX2RhdGEuIiA8PCByZXNpemVfbmFtZSA8PCAiKCZtdXQgIiA8PCBhcmdfbmFtZSA8PCAiKT87XG4iOwpAQCAtMjUzLDcgKzQ0Myw3IEBACiAgICAgICAgIC8vIGFueSBOb25lLCByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMICh0aGlzIGlzIHdoYXQgbGliYmluZGVyX25kayBkb2VzKQogICAgICAgICBvdXQgPDwgImlmICIgPDwgYXJnX25hbWUgPDwgIi5pdGVyKCkuYW55KE9wdGlvbjo6aXNfbm9uZSkgeyAiCiAgICAgICAgICAgICA8PCAicmV0dXJuIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCk7IH1cbiI7Ci0gICAgICB9IGVsc2UgaWYgKCFhcmctPklzSW4oKSAmJiAhVHlwZUhhc0RlZmF1bHQoYXJnX3R5cGUsIHR5cGVuYW1lcykpIHsKKyAgICAgIH0gZWxzZSBpZiAoIWFyZy0+SXNJbigpICYmIFR5cGVOZWVkc09wdGlvbihhcmdfdHlwZSwgdHlwZW5hbWVzKSkgewogICAgICAgICAvLyBVbndyYXAgb3V0LW9ubHkgYXJndW1lbnRzIHRoYXQgd2Ugd3JhcHBlZCBpbiBPcHRpb248VD4KICAgICAgICAgb3V0IDw8ICJsZXQgIiA8PCBhcmdfbmFtZSA8PCAiID0gIiA8PCBhcmdfbmFtZQogICAgICAgICAgICAgPDwgIi5va19vcihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCk/O1xuIjsKQEAgLTI3OCw3ICs0NjgsNyBAQAogICBhdXRvIHNlcnZlcl9uYW1lID0gQ2xhc3NOYW1lKCppZmFjZSwgY3BwOjpDbGFzc05hbWVzOjpTRVJWRVIpOwogCiAgIC8vIEZvcndhcmQgYWxsIElGb28gZnVuY3Rpb25zIGZyb20gQmluZGVyIHRvIHRoZSBpbm5lciBvYmplY3QKLSAgb3V0IDw8ICJpbXBsICIgPDwgdHJhaXRfbmFtZSA8PCAiIGZvciBiaW5kZXI6OkJpbmRlcjwiIDw8IHNlcnZlcl9uYW1lIDw8ICI+IHtcbiI7CisgIG91dCA8PCAiaW1wbCAiIDw8IHRyYWl0X25hbWUgPDwgIiBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPCIgPDwgc2VydmVyX25hbWUgPDwgIj4ge1xuIjsKICAgb3V0LkluZGVudCgpOwogICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGlmYWNlLT5HZXRNZXRob2RzKCkpIHsKICAgICBzdHJpbmcgYXJnczsKQEAgLTI5OSw5ICs0ODksMTEgQEAKICAgICAgICAgICJfYWlkbF9zZXJ2aWNlOiAmZHluICIKICAgICAgIDw8IHRyYWl0X25hbWUKICAgICAgIDw8ICIsICIKLSAgICAgICAgICJfYWlkbF9jb2RlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSwgIgotICAgICAgICAgIl9haWRsX2RhdGE6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsLCAiCi0gICAgICAgICAiX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHtcbiI7CisgICAgICAgICAiX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCAiCisgICAgICAgICAiX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgIgorICAgICAgICAgIl9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgIgorICAgICAgICAgImJpbmRlcjo6U3RhdHVzQ29kZT4gIgorICAgICAgICAgIntcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgb3V0IDw8ICJtYXRjaCBfYWlkbF9jb2RlIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKQEAgLTMzNyw3ICs1MjksNyBAQAogICAgICAgY29uc3RfdHlwZSA9ICImc3RyIjsKICAgICB9IGVsc2UgaWYgKHR5cGUuU2lnbmF0dXJlKCkgPT0gImJ5dGUiIHx8IHR5cGUuU2lnbmF0dXJlKCkgPT0gImludCIgfHwKICAgICAgICAgICAgICAgIHR5cGUuU2lnbmF0dXJlKCkgPT0gImxvbmciKSB7Ci0gICAgICBjb25zdF90eXBlID0gUnVzdE5hbWVPZih0eXBlLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSk7CisgICAgICBjb25zdF90eXBlID0gUnVzdE5hbWVPZih0eXBlLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSwgTGlmZXRpbWU6Ok5PTkUpOwogICAgIH0gZWxzZSB7CiAgICAgICBBSURMX0ZBVEFMKHZhbHVlKSA8PCAiVW5yZWNvZ25pemVkIGNvbnN0YW50IHR5cGU6ICIgPDwgdHlwZS5TaWduYXR1cmUoKTsKICAgICB9CkBAIC0zNDgsMTcgKzU0MCwxNiBAQAogICB9CiB9CiAKLWJvb2wgR2VuZXJhdGVSdXN0SW50ZXJmYWNlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IEFpZGxJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotCit2b2lkIEdlbmVyYXRlUnVzdEludGVyZmFjZShDb2RlV3JpdGVyKiBjb2RlX3dyaXRlciwgY29uc3QgQWlkbEludGVyZmFjZSogaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgKmNvZGVfd3JpdGVyIDw8ICIjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV1cbiI7CiAgICpjb2RlX3dyaXRlciA8PCAiIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXVxuIjsKICAgLy8gSW1wb3J0IElCaW5kZXJJbnRlcm5hbCBmb3IgdHJhbnNhY3QoKQotICAqY29kZV93cml0ZXIgPDwgIiNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpJQmluZGVySW50ZXJuYWw7XG4iOworICAqY29kZV93cml0ZXIgPDwgIiNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsO1xuIjsKIAogICBhdXRvIHRyYWl0X25hbWUgPSBDbGFzc05hbWUoKmlmYWNlLCBjcHA6OkNsYXNzTmFtZXM6OklOVEVSRkFDRSk7CisgIGF1dG8gdHJhaXRfbmFtZV9hc3luYyA9IHRyYWl0X25hbWUgKyAiQXN5bmMiOworICBhdXRvIHRyYWl0X25hbWVfYXN5bmNfc2VydmVyID0gdHJhaXRfbmFtZSArICJBc3luY1NlcnZlciI7CiAgIGF1dG8gY2xpZW50X25hbWUgPSBDbGFzc05hbWUoKmlmYWNlLCBjcHA6OkNsYXNzTmFtZXM6OkNMSUVOVCk7CiAgIGF1dG8gc2VydmVyX25hbWUgPSBDbGFzc05hbWUoKmlmYWNlLCBjcHA6OkNsYXNzTmFtZXM6OlNFUlZFUik7CiAgICpjb2RlX3dyaXRlciA8PCAidXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlO1xuIjsKQEAgLTM4MywxNCArNTc0LDE2IEBACiAgIH0KICAgY29kZV93cml0ZXItPkRlZGVudCgpOwogICAqY29kZV93cml0ZXIgPDwgIn0sXG4iOwotICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAiYXN5bmM6ICIgPDwgdHJhaXRfbmFtZV9hc3luYyA8PCAiLFxuIjsKICAgaWYgKGlmYWNlLT5Jc1ZpbnRmU3RhYmlsaXR5KCkpIHsKLSAgICAqY29kZV93cml0ZXIgPDwgInN0YWJpbGl0eTogYmluZGVyOjpTdGFiaWxpdHk6OlZpbnRmLFxuIjsKKyAgICAqY29kZV93cml0ZXIgPDwgInN0YWJpbGl0eTogYmluZGVyOjpiaW5kZXJfaW1wbDo6U3RhYmlsaXR5OjpWaW50ZixcbiI7CiAgIH0KKyAgY29kZV93cml0ZXItPkRlZGVudCgpOwogICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CiAgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKICAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOwogCisgIC8vIEVtaXQgdGhlIHRyYWl0LgogICBHZW5lcmF0ZURlcHJlY2F0ZWQoKmNvZGVfd3JpdGVyLCAqaWZhY2UpOwogICAqY29kZV93cml0ZXIgPDwgInB1YiB0cmFpdCAiIDw8IHRyYWl0X25hbWUgPDwgIjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHtcbiI7CiAgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKQEAgLTQzMCw2ICs2MjMsMTI1IEBACiAgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKICAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOwogCisgIC8vIEVtaXQgdGhlIGFzeW5jIHRyYWl0LgorICBHZW5lcmF0ZURlcHJlY2F0ZWQoKmNvZGVfd3JpdGVyLCAqaWZhY2UpOworICAqY29kZV93cml0ZXIgPDwgInB1YiB0cmFpdCAiIDw8IHRyYWl0X25hbWVfYXN5bmMgPDwgIjxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHtcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7IFwiIgorICAgICAgICAgICAgICAgPDwgaWZhY2UtPkdldERlc2NyaXB0b3IoKSA8PCAiXCIgfVxuIjsKKworICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGlmYWNlLT5HZXRNZXRob2RzKCkpIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgbWV0aG9kCisgICAgR2VuZXJhdGVEZXByZWNhdGVkKCpjb2RlX3dyaXRlciwgKm1ldGhvZCk7CisKKyAgICBNZXRob2RLaW5kIGtpbmQgPSBtZXRob2QtPklzT25ld2F5KCkgPyBNZXRob2RLaW5kOjpSRUFEWV9GVVRVUkUgOiBNZXRob2RLaW5kOjpCT1hFRF9GVVRVUkU7CisKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgICpjb2RlX3dyaXRlciA8PCBCdWlsZE1ldGhvZCgqbWV0aG9kLCB0eXBlbmFtZXMsIGtpbmQpIDw8ICI7XG4iOworICAgIH0gZWxzZSB7CisgICAgICAvLyBHZW5lcmF0ZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgbWV0YSBtZXRob2RzCisgICAgICAqY29kZV93cml0ZXIgPDwgQnVpbGRNZXRob2QoKm1ldGhvZCwgdHlwZW5hbWVzLCBraW5kKSA8PCAiIHtcbiI7CisgICAgICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgICAgICBpZiAobWV0aG9kLT5HZXROYW1lKCkgPT0ga0dldEludGVyZmFjZVZlcnNpb24gJiYgb3B0aW9ucy5WZXJzaW9uKCkgPiAwKSB7CisgICAgICAgICpjb2RlX3dyaXRlciA8PCAiQm94OjpwaW4oYXN5bmMgbW92ZSB7IE9rKFZFUlNJT04pIH0pXG4iOworICAgICAgfSBlbHNlIGlmIChtZXRob2QtPkdldE5hbWUoKSA9PSBrR2V0SW50ZXJmYWNlSGFzaCAmJiAhb3B0aW9ucy5IYXNoKCkuZW1wdHkoKSkgeworICAgICAgICAqY29kZV93cml0ZXIgPDwgIkJveDo6cGluKGFzeW5jIG1vdmUgeyBPayhIQVNILmludG8oKSkgfSlcbiI7CisgICAgICB9CisgICAgICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICAgICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisgICAgfQorICB9CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworCisgIC8vIEVtaXQgdGhlIGFzeW5jIHNlcnZlciB0cmFpdC4KKyAgR2VuZXJhdGVEZXByZWNhdGVkKCpjb2RlX3dyaXRlciwgKmlmYWNlKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICIjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XVxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJwdWIgdHJhaXQgIiA8PCB0cmFpdF9uYW1lX2FzeW5jX3NlcnZlciA8PCAiOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQge1xuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgImZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgXCIiCisgICAgICAgICAgICAgICA8PCBpZmFjZS0+R2V0RGVzY3JpcHRvcigpIDw8ICJcIiB9XG4iOworCisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgeworICAgIC8vIEdlbmVyYXRlIHRoZSBtZXRob2QKKyAgICBpZiAobWV0aG9kLT5Jc1VzZXJEZWZpbmVkKCkpIHsKKyAgICAgIEdlbmVyYXRlRGVwcmVjYXRlZCgqY29kZV93cml0ZXIsICptZXRob2QpOworICAgICAgKmNvZGVfd3JpdGVyIDw8IEJ1aWxkTWV0aG9kKCptZXRob2QsIHR5cGVuYW1lcywgTWV0aG9kS2luZDo6QVNZTkMpIDw8ICI7XG4iOworICAgIH0KKyAgfQorICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKworICAvLyBFbWl0IGEgbmV3X2FzeW5jX2JpbmRlciBtZXRob2QgZm9yIGJpbmRpbmcgYW4gYXN5bmMgc2VydmVyLgorICAqY29kZV93cml0ZXIgPDwgImltcGwgIiA8PCBzZXJ2ZXJfbmFtZSA8PCAiIHtcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICIvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLlxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiAiCisgICAgICAgICAgICAgICAgICAiYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluICIKKyAgICAgICAgICAgICAgIDw8IHRyYWl0X25hbWUgPDwgIj5cbiI7CisgICpjb2RlX3dyaXRlciA8PCAid2hlcmVcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJUOiAiIDw8IHRyYWl0X25hbWVfYXN5bmNfc2VydmVyCisgICAgICAgICAgICAgICA8PCAiICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsXG4iOworICAqY29kZV93cml0ZXIgPDwgIlI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYyxcbiI7CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgIC8vIERlZmluZSBhIHdyYXBwZXIgc3RydWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbm9uLWFzeW5jIHRyYWl0IGJ5IGNhbGxpbmcgYmxvY2tfb24uCisgICpjb2RlX3dyaXRlciA8PCAic3RydWN0IFdyYXBwZXI8VCwgUj4ge1xuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIl9pbm5lcjogVCxcbiI7CisgICpjb2RlX3dyaXRlciA8PCAiX3J0OiBSLFxuIjsKKyAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisgICpjb2RlX3dyaXRlciA8PCAiaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogIgorICAgICAgICAgICAgICAgICAgIlNlbmQgKyBTeW5jIHtcbiI7CisgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfVxuIjsKKyAgKmNvZGVfd3JpdGVyCisgICAgICA8PCAiZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiAiCisgICAgICAgICAic3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9XG4iOworICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJpbXBsPFQsIFI+ICIgPDwgdHJhaXRfbmFtZSA8PCAiIGZvciBXcmFwcGVyPFQsIFI+XG4iOworICAqY29kZV93cml0ZXIgPDwgIndoZXJlXG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAiVDogIiA8PCB0cmFpdF9uYW1lX2FzeW5jX3NlcnZlciA8PCAiICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLFxuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsXG4iOworICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAie1xuIjsKKyAgY29kZV93cml0ZXItPkluZGVudCgpOworICBmb3IgKGNvbnN0IGF1dG8mIG1ldGhvZCA6IGlmYWNlLT5HZXRNZXRob2RzKCkpIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgbWV0aG9kCisgICAgaWYgKG1ldGhvZC0+SXNVc2VyRGVmaW5lZCgpKSB7CisgICAgICBzdHJpbmcgYXJncyA9ICIiOworICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QWlkbEFyZ3VtZW50PiYgYXJnIDogbWV0aG9kLT5HZXRBcmd1bWVudHMoKSkgeworICAgICAgICBpZiAoIWFyZ3MuZW1wdHkoKSkgeworICAgICAgICAgIGFyZ3MgKz0gIiwgIjsKKyAgICAgICAgfQorICAgICAgICBhcmdzICs9IGtBcmd1bWVudFByZWZpeDsKKyAgICAgICAgYXJncyArPSBhcmctPkdldE5hbWUoKTsKKyAgICAgIH0KKworICAgICAgKmNvZGVfd3JpdGVyIDw8IEJ1aWxkTWV0aG9kKCptZXRob2QsIHR5cGVuYW1lcykgPDwgIiB7XG4iOworICAgICAgY29kZV93cml0ZXItPkluZGVudCgpOworICAgICAgKmNvZGVfd3JpdGVyIDw8ICJzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci4iIDw8IG1ldGhvZC0+R2V0TmFtZSgpIDw8ICIoIiA8PCBhcmdzCisgICAgICAgICAgICAgICAgICAgPDwgIikpXG4iOworICAgICAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAgICAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworICAgIH0KKyAgfQorICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKworICAqY29kZV93cml0ZXIgPDwgImxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTtcbiI7CisgICpjb2RlX3dyaXRlciA8PCAiU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcylcbiI7CisKKyAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOworCiAgIC8vIEVtaXQgdGhlIGRlZmF1bHQgdHJhaXQKICAgKmNvZGVfd3JpdGVyIDw8ICJwdWIgdHJhaXQgIiA8PCBkZWZhdWx0X3RyYWl0X25hbWUgPDwgIjogU2VuZCArIFN5bmMge1xuIjsKICAgY29kZV93cml0ZXItPkluZGVudCgpOwpAQCAtNDU1LDggKzc2Nyw4IEBACiAgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgewogICAgIC8vIEdlbmVyYXRlIHRoZSB0cmFuc2FjdGlvbiBjb2RlIGNvbnN0YW50CiAgICAgKmNvZGVfd3JpdGVyIDw8ICJwdWIgY29uc3QgIiA8PCBtZXRob2QtPkdldE5hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9ICIKLSAgICAgICAgICAgICAgICAgICAgImJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArICIgKworICAgICAgICAgICAgICAgICA8PCAiOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSAiCisgICAgICAgICAgICAgICAgICAgICJiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhtZXRob2QtPkdldElkKCkpICsgIjtcbiI7CiAgIH0KICAgY29kZV93cml0ZXItPkRlZGVudCgpOwpAQCAtNDc0LDggKzc4Niw2IEBACiAgIC8vIEVtaXQgdGhlIGludGVyZmFjZSBjb25zdGFudHMKICAgR2VuZXJhdGVDb25zdGFudERlY2xhcmF0aW9ucygqY29kZV93cml0ZXIsICppZmFjZSwgdHlwZW5hbWVzKTsKIAotICBHZW5lcmF0ZU1hbmdsZWRBbGlhcygqY29kZV93cml0ZXIsIGlmYWNlKTsKLQogICAvLyBFbWl0IFZFUlNJT04gYW5kIEhBU0gKICAgLy8gVGhlc2UgbmVlZCB0byBiZSB0b3AtbGV2ZWwgaXRlbSBjb25zdGFudHMgaW5zdGVhZCBvZiBhc3NvY2lhdGVkIGNvbnN0cwogICAvLyBiZWNhdXNlIHRoZSBsYXR0ZXIgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRyYWl0IG9iamVjdHMsIHNlZQpAQCAtNDg3LDE5ICs3OTcsNDAgQEAKICAgICAqY29kZV93cml0ZXIgPDwgInB1YiBjb25zdCBIQVNIOiAmc3RyID0gXCIiIDw8IG9wdGlvbnMuSGFzaCgpIDw8ICJcIjtcbiI7CiAgIH0KIAorICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50LXNpZGUgbWV0aG9kIGhlbHBlcnMKKyAgLy8KKyAgLy8gVGhlIG1ldGhvZHMgaW4gdGhpcyBibG9jayBhcmUgbm90IG1hcmtlZCBwdWIsIHNvIHRoZXkgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gb3V0c2lkZSB0aGUKKyAgLy8gQUlETCBnZW5lcmF0ZWQgY29kZS4KKyAgKmNvZGVfd3JpdGVyIDw8ICJpbXBsICIgPDwgY2xpZW50X25hbWUgPDwgIiB7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgeworICAgIEdlbmVyYXRlQ2xpZW50TWV0aG9kSGVscGVycygqY29kZV93cml0ZXIsICppZmFjZSwgKm1ldGhvZCwgdHlwZW5hbWVzLCBvcHRpb25zLCB0cmFpdF9uYW1lKTsKKyAgfQorICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKKwogICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50LXNpZGUgbWV0aG9kcwogICAqY29kZV93cml0ZXIgPDwgImltcGwgIiA8PCB0cmFpdF9uYW1lIDw8ICIgZm9yICIgPDwgY2xpZW50X25hbWUgPDwgIiB7XG4iOwogICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CiAgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgewotICAgIEdlbmVyYXRlQ2xpZW50TWV0aG9kKCpjb2RlX3dyaXRlciwgKmlmYWNlLCAqbWV0aG9kLCB0eXBlbmFtZXMsIG9wdGlvbnMsIHRyYWl0X25hbWUpOworICAgIEdlbmVyYXRlQ2xpZW50TWV0aG9kKCpjb2RlX3dyaXRlciwgKmlmYWNlLCAqbWV0aG9kLCB0eXBlbmFtZXMsIG9wdGlvbnMsIE1ldGhvZEtpbmQ6Ok5PUk1BTCk7CisgIH0KKyAgY29kZV93cml0ZXItPkRlZGVudCgpOworICAqY29kZV93cml0ZXIgPDwgIn1cbiI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGFzeW5jIGNsaWVudC1zaWRlIG1ldGhvZHMKKyAgKmNvZGVfd3JpdGVyIDw8ICJpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiAiIDw8IHRyYWl0X25hbWVfYXN5bmMgPDwgIjxQPiBmb3IgIgorICAgICAgICAgICAgICAgPDwgY2xpZW50X25hbWUgPDwgIiB7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogaWZhY2UtPkdldE1ldGhvZHMoKSkgeworICAgIE1ldGhvZEtpbmQga2luZCA9IG1ldGhvZC0+SXNPbmV3YXkoKSA/IE1ldGhvZEtpbmQ6OlJFQURZX0ZVVFVSRSA6IE1ldGhvZEtpbmQ6OkJPWEVEX0ZVVFVSRTsKKyAgICBHZW5lcmF0ZUNsaWVudE1ldGhvZCgqY29kZV93cml0ZXIsICppZmFjZSwgKm1ldGhvZCwgdHlwZW5hbWVzLCBvcHRpb25zLCBraW5kKTsKICAgfQogICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CiAgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKIAogICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyLXNpZGUgbWV0aG9kcwogICBHZW5lcmF0ZVNlcnZlckl0ZW1zKCpjb2RlX3dyaXRlciwgaWZhY2UsIHR5cGVuYW1lcyk7Ci0KLSAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgR2VuZXJhdGVQYXJjZWxCb2R5KENvZGVXcml0ZXImIG91dCwgY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwsCkBAIC01MDksNyArODQwLDggQEAKICAgb3V0LkluZGVudCgpOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLT5HZXRGaWVsZHMoKSkgewogICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICp2YXJpYWJsZSk7Ci0gICAgYXV0byBmaWVsZF90eXBlID0gUnVzdE5hbWVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxEKTsKKyAgICBhdXRvIGZpZWxkX3R5cGUgPQorICAgICAgICBSdXN0TmFtZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQsIExpZmV0aW1lOjpOT05FKTsKICAgICBvdXQgPDwgInB1YiAiIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIjogIiA8PCBmaWVsZF90eXBlIDw8ICIsXG4iOwogICB9CiAgIG91dC5EZWRlbnQoKTsKQEAgLTUyNCwxMSArODU2LDI4IEBACiAgIG91dCA8PCAiU2VsZiB7XG4iOwogICBvdXQuSW5kZW50KCk7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7CisgICAgb3V0IDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIjogIjsKICAgICBpZiAodmFyaWFibGUtPkdldERlZmF1bHRWYWx1ZSgpKSB7Ci0gICAgICBvdXQgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiOiAiIDw8IHZhcmlhYmxlLT5WYWx1ZVN0cmluZyhDb25zdGFudFZhbHVlRGVjb3JhdG9yKSA8PCAiLFxuIjsKKyAgICAgIG91dCA8PCB2YXJpYWJsZS0+VmFsdWVTdHJpbmcoQ29uc3RhbnRWYWx1ZURlY29yYXRvcik7CiAgICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICI6IERlZmF1bHQ6OmRlZmF1bHQoKSxcbiI7CisgICAgICAvLyBTb21lIHR5cGVzIGRvbid0IGltcGxlbWVudCAiRGVmYXVsdCIuCisgICAgICAvLyAtIFBhcmNlbGFibGVIb2xkZXIKKyAgICAgIC8vIC0gQXJyYXlzCisgICAgICBpZiAodmFyaWFibGUtPkdldFR5cGUoKS5HZXROYW1lKCkgPT0gIlBhcmNlbGFibGVIb2xkZXIiKSB7CisgICAgICAgIG91dCA8PCAiYmluZGVyOjpQYXJjZWxhYmxlSG9sZGVyOjpuZXcoIjsKKyAgICAgICAgaWYgKHBhcmNlbC0+SXNWaW50ZlN0YWJpbGl0eSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJiaW5kZXI6OmJpbmRlcl9pbXBsOjpTdGFiaWxpdHk6OlZpbnRmIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgImJpbmRlcjo6YmluZGVyX2ltcGw6OlN0YWJpbGl0eTo6TG9jYWwiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSI7CisgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT5HZXRUeXBlKCkuSXNGaXhlZFNpemVBcnJheSgpICYmICF2YXJpYWJsZS0+R2V0VHlwZSgpLklzTnVsbGFibGUoKSkgeworICAgICAgICBvdXQgPDwgQXJyYXlEZWZhdWx0VmFsdWUodmFyaWFibGUtPkdldFR5cGUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIkRlZmF1bHQ6OmRlZmF1bHQoKSI7CisgICAgICB9CiAgICAgfQorICAgIG91dCA8PCAiLFxuIjsKICAgfQogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuIjsKQEAgLTU0MywxMiArODkyLDEyIEBACiAgIG91dCA8PCAicGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgZm9yIChjb25zdCBhdXRvJiB2YXJpYWJsZSA6IHBhcmNlbC0+R2V0RmllbGRzKCkpIHsKLSAgICBpZiAoIVR5cGVIYXNEZWZhdWx0KHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKLSAgICAgIG91dCA8PCAibGV0IF9fZmllbGRfcmVmID0gdGhpcy4iIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkKKyAgICBpZiAoVHlwZU5lZWRzT3B0aW9uKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKKyAgICAgIG91dCA8PCAibGV0IF9fZmllbGRfcmVmID0gc2VsZi4iIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkKICAgICAgICAgICA8PCAiLmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87XG4iOwogICAgICAgb3V0IDw8ICJzdWJwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpPztcbiI7CiAgICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAic3VicGFyY2VsLndyaXRlKCZ0aGlzLiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiKT87XG4iOworICAgICAgb3V0IDw8ICJzdWJwYXJjZWwud3JpdGUoJnNlbGYuIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIpPztcbiI7CiAgICAgfQogICB9CiAgIG91dCA8PCAiT2soKCkpXG4iOwpAQCAtNTU4LDM3ICs5MDcsMjMgQEAKIAogdm9pZCBHZW5lcmF0ZVBhcmNlbERlc2VyaWFsaXplQm9keShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKLSAgb3V0IDw8ICJsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7XG4iOwotICBvdXQgPDwgImxldCBwYXJjZWxhYmxlX3NpemU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/O1xuIjsKLSAgb3V0IDw8ICJpZiBwYXJjZWxhYmxlX3NpemUgPCAwIHsgcmV0dXJuIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSk7IH1cbiI7Ci0gIG91dCA8PCAiaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHtcbiI7Ci0gIG91dCA8PCAiICByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTtcbiI7Ci0gIG91dCA8PCAifVxuIjsKKyAgb3V0IDw8ICJwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7XG4iOworICBvdXQuSW5kZW50KCk7CiAKLSAgLy8gUHJlLWVtaXQgdGhlIGNvbW1vbiBmaWVsZCBwcm9sb2d1ZSBjb2RlLCBzaGFyZWQgYmV0d2VlbiBhbGwgZmllbGRzOgotICBvc3RyaW5nc3RyZWFtIHByb2xvZ3VlOwotICBwcm9sb2d1ZSA8PCAiaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUge1xuIjsKLSAgLy8gV2UgYXNzdW1lIHRoZSBsaHMgY2FuIG5ldmVyIGJlID4gcGFyY2VsYWJsZV9zaXplLCBiZWNhdXNlIHRoZW4gdGhlIHJlYWQKLSAgLy8gaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoaXMgY2hlY2sgd291bGQgaGF2ZSByZXR1cm5lZCBOT1RfRU5PVUdIX0RBVEEKLSAgcHJvbG9ndWUgPDwgIiAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7XG4iOwotICBwcm9sb2d1ZSA8PCAifVxuIjsKLSAgc3RyaW5nIHByb2xvZ3VlX3N0ciA9IHByb2xvZ3VlLnN0cigpOwotCi0gIG91dCA8PCAibGV0IG11dCByZXN1bHQgPSBTZWxmOjpkZWZhdWx0KCk7XG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLT5HZXRGaWVsZHMoKSkgewotICAgIG91dCA8PCBwcm9sb2d1ZV9zdHI7Ci0gICAgaWYgKCFUeXBlSGFzRGVmYXVsdCh2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpKSB7Ci0gICAgICBvdXQgPDwgInJlc3VsdC4iIDw8IHZhcmlhYmxlLT5HZXROYW1lKCkgPDwgIiA9IFNvbWUocGFyY2VsLnJlYWQoKT8pO1xuIjsKKyAgICBvdXQgPDwgImlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgaWYgKFR5cGVOZWVkc09wdGlvbih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMpKSB7CisgICAgICBvdXQgPDwgInNlbGYuIiA8PCB2YXJpYWJsZS0+R2V0TmFtZSgpIDw8ICIgPSBTb21lKHN1YnBhcmNlbC5yZWFkKCk/KTtcbiI7CiAgICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAicmVzdWx0LiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiID0gcGFyY2VsLnJlYWQoKT87XG4iOworICAgICAgb3V0IDw8ICJzZWxmLiIgPDwgdmFyaWFibGUtPkdldE5hbWUoKSA8PCAiID0gc3VicGFyY2VsLnJlYWQoKT87XG4iOwogICAgIH0KKyAgICBvdXQuRGVkZW50KCk7CisgICAgb3V0IDw8ICJ9XG4iOwogICB9Ci0gIC8vIE5vdyB3ZSByZWFkIGFsbCBmaWVsZHMuCi0gIC8vIFNraXAgcmVtYWluaW5nIGRhdGEgaW4gY2FzZSB3ZSdyZSByZWFkaW5nIGZyb20gYSBuZXdlciB2ZXJzaW9uCi0gIG91dCA8PCAidW5zYWZlIHtcbiI7Ci0gIG91dCA8PCAiICBwYXJjZWwuc2V0X2RhdGFfcG9zaXRpb24oc3RhcnRfcG9zICsgcGFyY2VsYWJsZV9zaXplKT87XG4iOwotICBvdXQgPDwgIn1cbiI7Ci0gIG91dCA8PCAiT2soU29tZShyZXN1bHQpKVxuIjsKKyAgb3V0IDw8ICJPaygoKSlcbiI7CisgIG91dC5EZWRlbnQoKTsKKyAgb3V0IDw8ICJ9KVxuIjsKIH0KIAogdm9pZCBHZW5lcmF0ZVBhcmNlbEJvZHkoQ29kZVdyaXRlciYgb3V0LCBjb25zdCBBaWRsVW5pb25EZWNsKiBwYXJjZWwsCkBAIC01OTgsNyArOTMzLDggQEAKICAgb3V0LkluZGVudCgpOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLT5HZXRGaWVsZHMoKSkgewogICAgIEdlbmVyYXRlRGVwcmVjYXRlZChvdXQsICp2YXJpYWJsZSk7Ci0gICAgYXV0byBmaWVsZF90eXBlID0gUnVzdE5hbWVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxEKTsKKyAgICBhdXRvIGZpZWxkX3R5cGUgPQorICAgICAgICBSdXN0TmFtZU9mKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlBBUkNFTEFCTEVfRklFTEQsIExpZmV0aW1lOjpOT05FKTsKICAgICBvdXQgPDwgdmFyaWFibGUtPkdldENhcGl0YWxpemVkTmFtZSgpIDw8ICIoIiA8PCBmaWVsZF90eXBlIDw8ICIpLFxuIjsKICAgfQogICBvdXQuRGVkZW50KCk7CkBAIC02MzEsMTQgKzk2NywxNCBAQAogCiB2b2lkIEdlbmVyYXRlUGFyY2VsU2VyaWFsaXplQm9keShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IEFpZGxVbmlvbkRlY2wqIHBhcmNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcykgewotICBvdXQgPDwgIm1hdGNoIHRoaXMge1xuIjsKKyAgb3V0IDw8ICJtYXRjaCBzZWxmIHtcbiI7CiAgIG91dC5JbmRlbnQoKTsKICAgaW50IHRhZyA9IDA7CiAgIGZvciAoY29uc3QgYXV0byYgdmFyaWFibGUgOiBwYXJjZWwtPkdldEZpZWxkcygpKSB7CiAgICAgb3V0IDw8ICJTZWxmOjoiIDw8IHZhcmlhYmxlLT5HZXRDYXBpdGFsaXplZE5hbWUoKSA8PCAiKHYpID0+IHtcbiI7CiAgICAgb3V0LkluZGVudCgpOwogICAgIG91dCA8PCAicGFyY2VsLndyaXRlKCYiIDw8IHN0ZDo6dG9fc3RyaW5nKHRhZysrKSA8PCAiaTMyKT87XG4iOwotICAgIGlmICghVHlwZUhhc0RlZmF1bHQodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSkgeworICAgIGlmIChUeXBlTmVlZHNPcHRpb24odmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzKSkgewogICAgICAgb3V0IDw8ICJsZXQgX19maWVsZF9yZWYgPSB2LmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87XG4iOwogICAgICAgb3V0IDw8ICJwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpXG4iOwogICAgIH0gZWxzZSB7CkBAIC02NTgsMTcgKzk5NCwxOSBAQAogICBvdXQuSW5kZW50KCk7CiAgIGludCB0YWcgPSAwOwogICBmb3IgKGNvbnN0IGF1dG8mIHZhcmlhYmxlIDogcGFyY2VsLT5HZXRGaWVsZHMoKSkgewotICAgIGF1dG8gZmllbGRfdHlwZSA9IFJ1c3ROYW1lT2YodmFyaWFibGUtPkdldFR5cGUoKSwgdHlwZW5hbWVzLCBTdG9yYWdlTW9kZTo6UEFSQ0VMQUJMRV9GSUVMRCk7CisgICAgYXV0byBmaWVsZF90eXBlID0KKyAgICAgICAgUnVzdE5hbWVPZih2YXJpYWJsZS0+R2V0VHlwZSgpLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpQQVJDRUxBQkxFX0ZJRUxELCBMaWZldGltZTo6Tk9ORSk7CiAKICAgICBvdXQgPDwgc3RkOjp0b19zdHJpbmcodGFnKyspIDw8ICIgPT4ge1xuIjsKICAgICBvdXQuSW5kZW50KCk7CiAgICAgb3V0IDw8ICJsZXQgdmFsdWU6ICIgPDwgZmllbGRfdHlwZSA8PCAiID0gIjsKLSAgICBpZiAoIVR5cGVIYXNEZWZhdWx0KHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKKyAgICBpZiAoVHlwZU5lZWRzT3B0aW9uKHZhcmlhYmxlLT5HZXRUeXBlKCksIHR5cGVuYW1lcykpIHsKICAgICAgIG91dCA8PCAiU29tZShwYXJjZWwucmVhZCgpPyk7XG4iOwogICAgIH0gZWxzZSB7CiAgICAgICBvdXQgPDwgInBhcmNlbC5yZWFkKCk/O1xuIjsKICAgICB9Ci0gICAgb3V0IDw8ICJPayhTb21lKFNlbGY6OiIgPDwgdmFyaWFibGUtPkdldENhcGl0YWxpemVkTmFtZSgpIDw8ICIodmFsdWUpKSlcbiI7CisgICAgb3V0IDw8ICIqc2VsZiA9IFNlbGY6OiIgPDwgdmFyaWFibGUtPkdldENhcGl0YWxpemVkTmFtZSgpIDw8ICIodmFsdWUpO1xuIjsKKyAgICBvdXQgPDwgIk9rKCgpKVxuIjsKICAgICBvdXQuRGVkZW50KCk7CiAgICAgb3V0IDw8ICJ9XG4iOwogICB9CkBAIC02ODAsNzAgKzEwMTgsNTUgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFBhcmNlbGFibGVUeXBlPgotdm9pZCBHZW5lcmF0ZVBhcmNlbFNlcmlhbGl6ZShDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFBhcmNlbGFibGVUeXBlKiBwYXJjZWwsCit2b2lkIEdlbmVyYXRlUGFyY2VsYWJsZVRyYWl0KENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsYWJsZVR5cGUqIHBhcmNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7Ci0gIG91dCA8PCAiaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplIGZvciAiIDw8IHBhcmNlbC0+R2V0TmFtZSgpIDw8ICIge1xuIjsKLSAgb3V0IDw8ICIgIGZuIHNlcmlhbGl6ZSgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7XG4iOwotICBvdXQgPDwgIiAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpXG4iOwotICBvdXQgPDwgIiAgfVxuIjsKLSAgb3V0IDw8ICJ9XG4iOwotCi0gIG91dCA8PCAiaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplQXJyYXkgZm9yICIgPDwgcGFyY2VsLT5HZXROYW1lKCkgPDwgIiB7fVxuIjsKLQotICBvdXQgPDwgImltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHtcbiI7CisgIG91dCA8PCAiaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yICIgPDwgcGFyY2VsLT5HZXROYW1lKCkgPDwgIiB7XG4iOwogICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCAiZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gIgotICAgICAgICAgImJpbmRlcjo6UmVzdWx0PCgpPiB7XG4iOwotICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCAibGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMge1xuIjsKLSAgb3V0IDw8ICIgIHBhcmNlbC53cml0ZSgmMWkzMik/O1xuIjsKLSAgb3V0IDw8ICIgIHRoaXNcbiI7Ci0gIG91dCA8PCAifSBlbHNlIHtcbiI7Ci0gIG91dCA8PCAiICByZXR1cm4gcGFyY2VsLndyaXRlKCYwaTMyKTtcbiI7Ci0gIG91dCA8PCAifTtcbiI7CiAKLSAgR2VuZXJhdGVQYXJjZWxTZXJpYWxpemVCb2R5KG91dCwgcGFyY2VsLCB0eXBlbmFtZXMpOwotCi0gIG91dC5EZWRlbnQoKTsKLSAgb3V0IDw8ICJ9XG4iOwotICBvdXQuRGVkZW50KCk7Ci0gIG91dCA8PCAifVxuIjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFBhcmNlbGFibGVUeXBlPgotdm9pZCBHZW5lcmF0ZVBhcmNlbERlc2VyaWFsaXplKENvZGVXcml0ZXImIG91dCwgY29uc3QgUGFyY2VsYWJsZVR5cGUqIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKLSAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZSBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHtcbiI7Ci0gIG91dCA8PCAiICBmbiBkZXNlcmlhbGl6ZShwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxTZWxmPiB7XG4iOwotICBvdXQgPDwgIiAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKVxuIjsKLSAgb3V0IDw8ICIgICAgICAgLnRyYW5zcG9zZSgpXG4iOwotICBvdXQgPDwgIiAgICAgICAudW53cmFwX29yKEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCkpXG4iOwotICBvdXQgPDwgIiAgfVxuIjsKLSAgb3V0IDw8ICJ9XG4iOwotCi0gIG91dCA8PCAiaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVBcnJheSBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHt9XG4iOwotCi0gIG91dCA8PCAiaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24gZm9yICIgPDwgcGFyY2VsLT5HZXROYW1lKCkgPDwgIiB7XG4iOwotICBvdXQuSW5kZW50KCk7Ci0gIG91dCA8PCAiZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gIgorICBvdXQgPDwgImZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgIgorICAgICAgICAgInBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgIgorICAgICAgICAgImJpbmRlcjo6U3RhdHVzQ29kZT4gIgogICAgICAgICAgIntcbiI7CiAgIG91dC5JbmRlbnQoKTsKLSAgb3V0IDw8ICJsZXQgc3RhdHVzOiBpMzIgPSBwYXJjZWwucmVhZCgpPztcbiI7Ci0gIG91dCA8PCAiaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH1cbiI7CisgIEdlbmVyYXRlUGFyY2VsU2VyaWFsaXplQm9keShvdXQsIHBhcmNlbCwgdHlwZW5hbWVzKTsKKyAgb3V0LkRlZGVudCgpOworICBvdXQgPDwgIn1cbiI7CiAKKyAgb3V0IDw8ICJmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgIgorICAgICAgICAgInBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCAiCisgICAgICAgICAiYmluZGVyOjpTdGF0dXNDb2RlPiB7XG4iOworICBvdXQuSW5kZW50KCk7CiAgIEdlbmVyYXRlUGFyY2VsRGVzZXJpYWxpemVCb2R5KG91dCwgcGFyY2VsLCB0eXBlbmFtZXMpOworICBvdXQuRGVkZW50KCk7CisgIG91dCA8PCAifVxuIjsKIAogICBvdXQuRGVkZW50KCk7CiAgIG91dCA8PCAifVxuIjsKKworICAvLyBFbWl0IHRoZSBvdXRlciAoZGUpc2VyaWFsaXphdGlvbiB0cmFpdHMKKyAgb3V0IDw8ICJiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlISgiIDw8IHBhcmNlbC0+R2V0TmFtZSgpIDw8ICIpO1xuIjsKKyAgb3V0IDw8ICJiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKCIgPDwgcGFyY2VsLT5HZXROYW1lKCkgPDwgIik7XG4iOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFyY2VsYWJsZVR5cGU+Cit2b2lkIEdlbmVyYXRlTWV0YWRhdGFUcmFpdChDb2RlV3JpdGVyJiBvdXQsIGNvbnN0IFBhcmNlbGFibGVUeXBlKiBwYXJjZWwpIHsKKyAgb3V0IDw8ICJpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgIiA8PCBwYXJjZWwtPkdldE5hbWUoKSA8PCAiIHtcbiI7CisgIG91dC5JbmRlbnQoKTsKKworICBvdXQgPDwgImZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgXCIiIDw8IHBhcmNlbC0+R2V0Q2Fub25pY2FsTmFtZSgpIDw8ICJcIiB9XG4iOworCisgIGlmIChwYXJjZWwtPklzVmludGZTdGFiaWxpdHkoKSkgeworICAgIG91dCA8PCAiZm4gZ2V0X3N0YWJpbGl0eSgmc2VsZikgLT4gYmluZGVyOjpiaW5kZXJfaW1wbDo6U3RhYmlsaXR5IHsgIgorICAgICAgICAgICAiYmluZGVyOjpiaW5kZXJfaW1wbDo6U3RhYmlsaXR5OjpWaW50ZiB9XG4iOworICB9CisKICAgb3V0LkRlZGVudCgpOwogICBvdXQgPDwgIn1cbiI7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXJjZWxhYmxlVHlwZT4KLWJvb2wgR2VuZXJhdGVSdXN0UGFyY2VsKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IFBhcmNlbGFibGVUeXBlKiBwYXJjZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlKSB7Ci0gIENvZGVXcml0ZXJQdHIgY29kZV93cml0ZXIgPSBpb19kZWxlZ2F0ZS5HZXRDb2RlV3JpdGVyKGZpbGVuYW1lKTsKLQordm9pZCBHZW5lcmF0ZVJ1c3RQYXJjZWwoQ29kZVdyaXRlciogY29kZV93cml0ZXIsIGNvbnN0IFBhcmNlbGFibGVUeXBlKiBwYXJjZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKICAgLy8gRGVidWcgaXMgYWx3YXlzIGRlcml2ZWQgYmVjYXVzZSBhbGwgUnVzdCBBSURMIHR5cGVzIGltcGxlbWVudCBpdAogICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvciBkb2Vzbid0IHN1cHBvcnQgYW55IG9mIHRoZSBvdGhlcnMgYmVjYXVzZQogICAvLyBpdCdzIGEgbmV3dHlwZSBvdmVyIHN0ZDo6ZnM6OkZpbGUgd2hpY2ggb25seSBpbXBsZW1lbnRzIERlYnVnCkBAIC03NjAsNjEgKzEwODMsNzUgQEAKICAgKmNvZGVfd3JpdGVyIDw8ICIjW2Rlcml2ZSgiIDw8IEpvaW4oZGVyaXZlcywgIiwgIikgPDwgIildXG4iOwogICBHZW5lcmF0ZVBhcmNlbEJvZHkoKmNvZGVfd3JpdGVyLCBwYXJjZWwsIHR5cGVuYW1lcyk7CiAgIEdlbmVyYXRlQ29uc3RhbnREZWNsYXJhdGlvbnMoKmNvZGVfd3JpdGVyLCAqcGFyY2VsLCB0eXBlbmFtZXMpOwotICBHZW5lcmF0ZU1hbmdsZWRBbGlhcygqY29kZV93cml0ZXIsIHBhcmNlbCk7CiAgIEdlbmVyYXRlUGFyY2VsRGVmYXVsdCgqY29kZV93cml0ZXIsIHBhcmNlbCk7Ci0gIEdlbmVyYXRlUGFyY2VsU2VyaWFsaXplKCpjb2RlX3dyaXRlciwgcGFyY2VsLCB0eXBlbmFtZXMpOwotICBHZW5lcmF0ZVBhcmNlbERlc2VyaWFsaXplKCpjb2RlX3dyaXRlciwgcGFyY2VsLCB0eXBlbmFtZXMpOwotICByZXR1cm4gdHJ1ZTsKKyAgR2VuZXJhdGVQYXJjZWxhYmxlVHJhaXQoKmNvZGVfd3JpdGVyLCBwYXJjZWwsIHR5cGVuYW1lcyk7CisgIEdlbmVyYXRlTWV0YWRhdGFUcmFpdCgqY29kZV93cml0ZXIsIHBhcmNlbCk7CiB9CiAKLWJvb2wgR2VuZXJhdGVSdXN0RW51bURlY2xhcmF0aW9uKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IEFpZGxFbnVtRGVjbGFyYXRpb24qIGVudW1fZGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpIHsKLSAgQ29kZVdyaXRlclB0ciBjb2RlX3dyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIoZmlsZW5hbWUpOwotCit2b2lkIEdlbmVyYXRlUnVzdEVudW1EZWNsYXJhdGlvbihDb2RlV3JpdGVyKiBjb2RlX3dyaXRlciwgY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzKSB7CiAgIGNvbnN0IGF1dG8mIGFpZGxfYmFja2luZ190eXBlID0gZW51bV9kZWNsLT5HZXRCYWNraW5nVHlwZSgpOwotICBhdXRvIGJhY2tpbmdfdHlwZSA9IFJ1c3ROYW1lT2YoYWlkbF9iYWNraW5nX3R5cGUsIHR5cGVuYW1lcywgU3RvcmFnZU1vZGU6OlZBTFVFKTsKKyAgYXV0byBiYWNraW5nX3R5cGUgPSBSdXN0TmFtZU9mKGFpZGxfYmFja2luZ190eXBlLCB0eXBlbmFtZXMsIFN0b3JhZ2VNb2RlOjpWQUxVRSwgTGlmZXRpbWU6Ok5PTkUpOwogCi0gIC8vIFRPRE8oYi8xNzc4NjA0MjMpIHN1cHBvcnQgImRlcHJlY2F0ZWQiIGZvciBlbnVtIHR5cGVzCiAgICpjb2RlX3dyaXRlciA8PCAiIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldXG4iOwogICAqY29kZV93cml0ZXIgPDwgInVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07XG4iOwotICAqY29kZV93cml0ZXIgPDwgImRlY2xhcmVfYmluZGVyX2VudW0hIHsgIiA8PCBlbnVtX2RlY2wtPkdldE5hbWUoKSA8PCAiIDogIiA8PCBiYWNraW5nX3R5cGUKLSAgICAgICAgICAgICAgIDw8ICIge1xuIjsKKyAgKmNvZGVfd3JpdGVyIDw8ICJkZWNsYXJlX2JpbmRlcl9lbnVtISB7XG4iOworICBjb2RlX3dyaXRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVEZXByZWNhdGVkKCpjb2RlX3dyaXRlciwgKmVudW1fZGVjbCk7CisgICpjb2RlX3dyaXRlciA8PCBlbnVtX2RlY2wtPkdldE5hbWUoKSA8PCAiIDogWyIgPDwgYmFja2luZ190eXBlIDw8ICI7ICIKKyAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGVudW1fZGVjbC0+R2V0RW51bWVyYXRvcnMoKS5zaXplKCkpIDw8ICJdIHtcbiI7CiAgIGNvZGVfd3JpdGVyLT5JbmRlbnQoKTsKICAgZm9yIChjb25zdCBhdXRvJiBlbnVtZXJhdG9yIDogZW51bV9kZWNsLT5HZXRFbnVtZXJhdG9ycygpKSB7CiAgICAgYXV0byB2YWx1ZSA9IGVudW1lcmF0b3ItPkdldFZhbHVlKCktPlZhbHVlU3RyaW5nKGFpZGxfYmFja2luZ190eXBlLCBDb25zdGFudFZhbHVlRGVjb3JhdG9yKTsKICAgICAqY29kZV93cml0ZXIgPDwgZW51bWVyYXRvci0+R2V0TmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsXG4iOwogICB9CiAgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKLSAgKmNvZGVfd3JpdGVyIDw8ICJ9IH1cbiI7CisgICpjb2RlX3dyaXRlciA8PCAifVxuIjsKIAotICBHZW5lcmF0ZU1hbmdsZWRBbGlhcygqY29kZV93cml0ZXIsIGVudW1fZGVjbCk7Ci0KLSAgcmV0dXJuIHRydWU7CisgIGNvZGVfd3JpdGVyLT5EZWRlbnQoKTsKKyAgKmNvZGVfd3JpdGVyIDw8ICJ9XG4iOwogfQogCi1ib29sIEdlbmVyYXRlUnVzdChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGRlZmluZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIGlmIChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUqIHBhcmNlbGFibGUgPSBkZWZpbmVkX3R5cGUtPkFzU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKK3ZvaWQgR2VuZXJhdGVDbGFzcyhDb2RlV3JpdGVyKiBjb2RlX3dyaXRlciwgY29uc3QgQWlkbERlZmluZWRUeXBlJiBkZWZpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgaWYgKGNvbnN0IEFpZGxTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS5Bc1N0cnVjdHVyZWRQYXJjZWxhYmxlKCk7CiAgICAgICBwYXJjZWxhYmxlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVSdXN0UGFyY2VsKGZpbGVuYW1lLCBwYXJjZWxhYmxlLCB0eXBlbmFtZXMsIGlvX2RlbGVnYXRlKTsKKyAgICBHZW5lcmF0ZVJ1c3RQYXJjZWwoY29kZV93cml0ZXIsIHBhcmNlbGFibGUsIHR5cGVzKTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsRW51bURlY2xhcmF0aW9uKiBlbnVtX2RlY2wgPSBkZWZpbmVkX3R5cGUuQXNFbnVtRGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICBlbnVtX2RlY2wgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlUnVzdEVudW1EZWNsYXJhdGlvbihjb2RlX3dyaXRlciwgZW51bV9kZWNsLCB0eXBlcyk7CisgIH0gZWxzZSBpZiAoY29uc3QgQWlkbEludGVyZmFjZSogaW50ZXJmYWNlID0gZGVmaW5lZF90eXBlLkFzSW50ZXJmYWNlKCk7IGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgR2VuZXJhdGVSdXN0SW50ZXJmYWNlKGNvZGVfd3JpdGVyLCBpbnRlcmZhY2UsIHR5cGVzLCBvcHRpb25zKTsKKyAgfSBlbHNlIGlmIChjb25zdCBBaWRsVW5pb25EZWNsKiB1bmlvbl9kZWNsID0gZGVmaW5lZF90eXBlLkFzVW5pb25EZWNsYXJhdGlvbigpOworICAgICAgICAgICAgIHVuaW9uX2RlY2wgIT0gbnVsbHB0cikgeworICAgIEdlbmVyYXRlUnVzdFBhcmNlbChjb2RlX3dyaXRlciwgdW5pb25fZGVjbCwgdHlwZXMpOworICB9IGVsc2UgeworICAgIEFJRExfRkFUQUwoZGVmaW5lZF90eXBlKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgUnVzdCBnZW5lcmF0aW9uLiI7CiAgIH0KIAotICBpZiAoY29uc3QgQWlkbFVuaW9uRGVjbCogcGFyY2VsYWJsZSA9IGRlZmluZWRfdHlwZS0+QXNVbmlvbkRlY2xhcmF0aW9uKCk7IHBhcmNlbGFibGUgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBHZW5lcmF0ZVJ1c3RQYXJjZWwoZmlsZW5hbWUsIHBhcmNlbGFibGUsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUpOworICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IGRlZmluZWRfdHlwZS5HZXROZXN0ZWRUeXBlcygpKSB7CisgICAgKCpjb2RlX3dyaXRlcikgPDwgInB1YiBtb2QgIiA8PCBuZXN0ZWQtPkdldE5hbWUoKSA8PCAiIHtcbiI7CisgICAgY29kZV93cml0ZXItPkluZGVudCgpOworICAgIEdlbmVyYXRlQ2xhc3MoY29kZV93cml0ZXIsICpuZXN0ZWQsIHR5cGVzLCBvcHRpb25zKTsKKyAgICBjb2RlX3dyaXRlci0+RGVkZW50KCk7CisgICAgKCpjb2RlX3dyaXRlcikgPDwgIn1cbiI7CiAgIH0KK30KIAotICBpZiAoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiogZW51bV9kZWNsID0gZGVmaW5lZF90eXBlLT5Bc0VudW1EZWNsYXJhdGlvbigpOwotICAgICAgZW51bV9kZWNsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVSdXN0RW51bURlY2xhcmF0aW9uKGZpbGVuYW1lLCBlbnVtX2RlY2wsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUpOwotICB9Cit2b2lkIEdlbmVyYXRlUnVzdChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSYgZGVmaW5lZF90eXBlLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICBDb2RlV3JpdGVyUHRyIGNvZGVfd3JpdGVyID0gaW9fZGVsZWdhdGUuR2V0Q29kZVdyaXRlcihmaWxlbmFtZSk7CiAKLSAgaWYgKGNvbnN0IEFpZGxJbnRlcmZhY2UqIGludGVyZmFjZSA9IGRlZmluZWRfdHlwZS0+QXNJbnRlcmZhY2UoKTsgaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gR2VuZXJhdGVSdXN0SW50ZXJmYWNlKGZpbGVuYW1lLCBpbnRlcmZhY2UsIHR5cGVuYW1lcywgaW9fZGVsZWdhdGUsIG9wdGlvbnMpOwotICB9CisgIC8vIEZvcmJpZCB0aGUgdXNlIG9mIHVuc2FmZSBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlLgorICAvLyBVbnNhZmUgY29kZSBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIGxpYmJpbmRlcl9ycy4KKyAgKmNvZGVfd3JpdGVyIDw8ICIjIVtmb3JiaWQodW5zYWZlX2NvZGUpXVxuIjsKKyAgLy8gRGlzYWJsZSBydXN0Zm10IG9uIGF1dG8tZ2VuZXJhdGVkIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGdvbGRlbiBvdXRwdXRzCisgICpjb2RlX3dyaXRlciA8PCAiIyFbcnVzdGZtdDo6c2tpcF1cbiI7CisgIEdlbmVyYXRlQ2xhc3MoY29kZV93cml0ZXIuZ2V0KCksIGRlZmluZWRfdHlwZSwgdHlwZXMsIG9wdGlvbnMpOworICBHZW5lcmF0ZU1hbmdsZWRBbGlhc2VzKCpjb2RlX3dyaXRlciwgZGVmaW5lZF90eXBlKTsKIAotICBBSURMX0ZBVEFMKGZpbGVuYW1lKSA8PCAiVW5yZWNvZ25pemVkIHR5cGUgc2VudCBmb3IgUnVzdCBnZW5lcmF0aW9uLiI7Ci0gIHJldHVybiBmYWxzZTsKKyAgQUlETF9GQVRBTF9JRighY29kZV93cml0ZXItPkNsb3NlKCksIGRlZmluZWRfdHlwZSkgPDwgIkkvTyBFcnJvciEiOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdApkaWZmIC0tZ2l0IGEvZ2VuZXJhdGVfcnVzdC5oIGIvZ2VuZXJhdGVfcnVzdC5oCmluZGV4IDM1ZGFmOWIuLjlkZThlNTYgMTAwNjQ0Ci0tLSBhL2dlbmVyYXRlX3J1c3QuaAorKysgYi9nZW5lcmF0ZV9ydXN0LmgKQEAgLTI2LDkgKzI2LDggQEAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBydXN0IHsKIAotYm9vbCBHZW5lcmF0ZVJ1c3QoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBBaWRsRGVmaW5lZFR5cGUqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwordm9pZCBHZW5lcmF0ZVJ1c3QoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgQWlkbFR5cGVuYW1lcyYgdHlwZXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGRlZmluZWRfdHlwZSwgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpOwogCiB9ICAvLyBuYW1lc3BhY2UgcnVzdAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2ltcG9ydF9yZXNvbHZlci5jcHAgYi9pbXBvcnRfcmVzb2x2ZXIuY3BwCmluZGV4IDFiZjI3OTQuLjQ4ZmJhM2MgMTAwNjQ0Ci0tLSBhL2ltcG9ydF9yZXNvbHZlci5jcHAKKysrIGIvaW1wb3J0X3Jlc29sdmVyLmNwcApAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSAib3MuaCIKIAordXNpbmcgc3RkOjpzZXQ7CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6dmVjdG9yOwogCkBAIC0zNyw4ICszOCw4IEBACiBuYW1lc3BhY2UgYWlkbCB7CiAKIEltcG9ydFJlc29sdmVyOjpJbXBvcnRSZXNvbHZlcihjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSwgY29uc3Qgc3RyaW5nJiBpbnB1dF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0PHN0cmluZz4mIGltcG9ydF9wYXRocywgY29uc3QgdmVjdG9yPHN0cmluZz4mIGlucHV0X2ZpbGVzKQotICAgIDogaW9fZGVsZWdhdGVfKGlvX2RlbGVnYXRlKSwgaW5wdXRfZmlsZV9uYW1lXyhpbnB1dF9maWxlX25hbWUpLCBpbnB1dF9maWxlc18oaW5wdXRfZmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXQ8c3RyaW5nPiYgaW1wb3J0X3BhdGhzKQorICAgIDogaW9fZGVsZWdhdGVfKGlvX2RlbGVnYXRlKSwgaW5wdXRfZmlsZV9uYW1lXyhpbnB1dF9maWxlX25hbWUpIHsKICAgZm9yIChzdHJpbmcgcGF0aCA6IGltcG9ydF9wYXRocykgewogICAgIGlmIChwYXRoLmVtcHR5KCkpIHsKICAgICAgIHBhdGggPSAiLiI7CkBAIC00Niw0MyArNDcsNDIgQEAKICAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9IE9TX1BBVEhfU0VQQVJBVE9SKSB7CiAgICAgICBwYXRoICs9IE9TX1BBVEhfU0VQQVJBVE9SOwogICAgIH0KLSAgICBpbXBvcnRfcGF0aHNfLnB1c2hfYmFjayhzdGQ6Om1vdmUocGF0aCkpOworICAgIGltcG9ydF9wYXRoc18uZW1wbGFjZShzdGQ6Om1vdmUocGF0aCkpOwogICB9CiB9CiAKIHN0cmluZyBJbXBvcnRSZXNvbHZlcjo6RmluZEltcG9ydEZpbGUoY29uc3Qgc3RyaW5nJiBjYW5vbmljYWxfbmFtZSkgY29uc3QgewotICAvLyBDb252ZXJ0IHRoZSBjYW5vbmljYWwgbmFtZSB0byBhIHJlbGF0aXZlIGZpbGUgcGF0aC4KLSAgc3RyaW5nIHJlbGF0aXZlX3BhdGggPSBjYW5vbmljYWxfbmFtZTsKLSAgZm9yIChjaGFyJiBjIDogcmVsYXRpdmVfcGF0aCkgewotICAgIGlmIChjID09ICcuJykgewotICAgICAgYyA9IE9TX1BBVEhfU0VQQVJBVE9SOworICBhdXRvIHBhcnRzID0gYmFzZTo6U3BsaXQoY2Fub25pY2FsX25hbWUsICIuIik7CisgIHdoaWxlICghcGFydHMuZW1wdHkoKSkgeworICAgIHN0cmluZyByZWxhdGl2ZV9wYXRoID0gYmFzZTo6Sm9pbihwYXJ0cywgT1NfUEFUSF9TRVBBUkFUT1IpICsgIi5haWRsIjsKKyAgICBhdXRvIGNhbmRpZGF0ZXMgPSBTY2FuSW1wb3J0UGF0aHMocmVsYXRpdmVfcGF0aCk7CisgICAgaWYgKGNhbmRpZGF0ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIC8vIHJlbW92ZSB0aGUgbGFzdCBwYXJ0ICYga2VlcCBzZWFyY2hpbmcKKyAgICAgIHBhcnRzLnBvcF9iYWNrKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGNhbmRpZGF0ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgIC8vIGZvdW5kIQorICAgICAgcmV0dXJuICpjYW5kaWRhdGVzLmJlZ2luKCk7CisgICAgfQorICAgIGlmIChjYW5kaWRhdGVzLnNpemUoKSA+IDEpIHsKKyAgICAgIEFJRExfRVJST1IoaW5wdXRfZmlsZV9uYW1lXykgPDwgIkR1cGxpY2F0ZSBmaWxlcyBmb3VuZCBmb3IgIiA8PCBjYW5vbmljYWxfbmFtZSA8PCAiIGZyb206XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJhc2U6OkpvaW4oY2FuZGlkYXRlcywgIlxuIik7CisgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgcmVsYXRpdmVfcGF0aCArPSAiLmFpZGwiOworICByZXR1cm4gIiI7Cit9CiAKK3NldDxzdHJpbmc+IEltcG9ydFJlc29sdmVyOjpTY2FuSW1wb3J0UGF0aHMoY29uc3Qgc3RyaW5nJiByZWxhdGl2ZV9wYXRoKSBjb25zdCB7CiAgIC8vIExvb2sgZm9yIHRoYXQgcmVsYXRpdmUgcGF0aCBhdCBlYWNoIG9mIG91ciBpbXBvcnQgcm9vdHMuCi0gIHZlY3RvcjxzdHJpbmc+IGZvdW5kX3BhdGhzOwotICBmb3IgKHN0cmluZyBwYXRoIDogaW1wb3J0X3BhdGhzXykgewotICAgIHBhdGggPSBwYXRoICsgcmVsYXRpdmVfcGF0aDsKLSAgICBpZiAoaW9fZGVsZWdhdGVfLkZpbGVJc1JlYWRhYmxlKHBhdGgpKSB7Ci0gICAgICBmb3VuZF9wYXRocy5lbXBsYWNlX2JhY2socGF0aCk7CisgIHNldDxzdHJpbmc+IGZvdW5kOworICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiBpbXBvcnRfcGF0aHNfKSB7CisgICAgaWYgKGlvX2RlbGVnYXRlXy5GaWxlSXNSZWFkYWJsZShwYXRoICsgcmVsYXRpdmVfcGF0aCkpIHsKKyAgICAgIGZvdW5kLmVtcGxhY2UocGF0aCArIHJlbGF0aXZlX3BhdGgpOwogICAgIH0KICAgfQotICAvLyByZW1vdmUgZHVwbGljYXRlcwotICBzdGQ6OnNvcnQoZm91bmRfcGF0aHMuYmVnaW4oKSwgZm91bmRfcGF0aHMuZW5kKCkpOwotICBhdXRvIGxhc3QgPSBzdGQ6OnVuaXF1ZShmb3VuZF9wYXRocy5iZWdpbigpLCBmb3VuZF9wYXRocy5lbmQoKSk7Ci0gIGZvdW5kX3BhdGhzLmVyYXNlKGxhc3QsIGZvdW5kX3BhdGhzLmVuZCgpKTsKLQotICBpbnQgbnVtX2ZvdW5kID0gZm91bmRfcGF0aHMuc2l6ZSgpOwotICBpZiAobnVtX2ZvdW5kID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0gZWxzZSBpZiAobnVtX2ZvdW5kID09IDEpIHsKLSAgICByZXR1cm4gZm91bmRfcGF0aHMuZnJvbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBBSURMX0VSUk9SKGlucHV0X2ZpbGVfbmFtZV8pIDw8ICJEdXBsaWNhdGUgZmlsZXMgZm91bmQgZm9yICIgPDwgY2Fub25pY2FsX25hbWUgPDwgIiBmcm9tOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihmb3VuZF9wYXRocywgIlxuIik7Ci0gICAgcmV0dXJuICIiOwotICB9CisgIHJldHVybiBmb3VuZDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2ltcG9ydF9yZXNvbHZlci5oIGIvaW1wb3J0X3Jlc29sdmVyLmgKaW5kZXggZTUyODQzZS4uYTlmMzhmZCAxMDA2NDQKLS0tIGEvaW1wb3J0X3Jlc29sdmVyLmgKKysrIGIvaW1wb3J0X3Jlc29sdmVyLmgKQEAgLTE4LDcgKzE4LDYgQEAKIAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiaW9fZGVsZWdhdGUuaCIKIApAQCAtMjgsOCArMjcsNyBAQAogY2xhc3MgSW1wb3J0UmVzb2x2ZXIgewogIHB1YmxpYzoKICAgSW1wb3J0UmVzb2x2ZXIoY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgaW1wb3J0X3BhdGhzLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGlucHV0X2ZpbGVzKTsKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpbXBvcnRfcGF0aHMpOwogICB2aXJ0dWFsIH5JbXBvcnRSZXNvbHZlcigpID0gZGVmYXVsdDsKIAogICAvLyBub24tY29weWFibGUsIG5vbi1tb3ZhYmxlCkBAIC00MywxMCArNDEsMTEgQEAKICAgc3RkOjpzdHJpbmcgRmluZEltcG9ydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbm9uaWNhbF9uYW1lKSBjb25zdDsKIAogIHByaXZhdGU6CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBTY2FuSW1wb3J0UGF0aHMoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbGF0aXZlX3BhdGgpIGNvbnN0OworCiAgIGNvbnN0IElvRGVsZWdhdGUmIGlvX2RlbGVnYXRlXzsKICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0X2ZpbGVfbmFtZV87Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRfcGF0aHNfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5wdXRfZmlsZXNfOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gaW1wb3J0X3BhdGhzXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9pb19kZWxlZ2F0ZS5jcHAgYi9pb19kZWxlZ2F0ZS5jcHAKaW5kZXggNDVlZjY1YS4uZDQwYmYxZCAxMDA2NDQKLS0tIGEvaW9fZGVsZWdhdGUuY3BwCisrKyBiL2lvX2RlbGVnYXRlLmNwcApAQCAtNDMsNiArNDMsNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJyb3I7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTcGxpdDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGg7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTEwNywxMSArMTA4LDYgQEAKICAgcmV0dXJuIGNvbnRlbnRzOwogfQogCi11bmlxdWVfcHRyPExpbmVSZWFkZXI+IElvRGVsZWdhdGU6OkdldExpbmVSZWFkZXIoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIGNvbnN0IHsKLSAgcmV0dXJuIExpbmVSZWFkZXI6OlJlYWRGcm9tRmlsZShmaWxlX3BhdGgpOwotfQotCiBib29sIElvRGVsZWdhdGU6OkZpbGVJc1JlYWRhYmxlKGNvbnN0IHN0cmluZyYgcGF0aCkgY29uc3QgewogI2lmZGVmIF9XSU4zMgogICAvLyBjaGVjayB0aGF0IHRoZSBmaWxlIGV4aXN0cyBhbmQgaXMgbm90IHdyaXRlLW9ubHkKQEAgLTE4NywxNCArMTgzLDYgQEAKICAgfQogfQogCi12b2lkIElvRGVsZWdhdGU6OlJlbW92ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgY29uc3QgewotI2lmZGVmIF9XSU4zMgotICBfdW5saW5rKGZpbGVfcGF0aC5jX3N0cigpKTsKLSNlbHNlCi0gIHVubGluayhmaWxlX3BhdGguY19zdHIoKSk7Ci0jZW5kaWYKLX0KLQogI2lmZGVmIF9XSU4zMgogUmVzdWx0PHZlY3RvcjxzdHJpbmc+PiBJb0RlbGVnYXRlOjpMaXN0RmlsZXMoY29uc3Qgc3RyaW5nJikgY29uc3QgewogICByZXR1cm4gRXJyb3IoKSA8PCAiRmlsZSBsaXN0aW5nIG5vdCBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzIjsKQEAgLTI0NCw1ICsyMzIsMTIgQEAKIH0KICNlbmRpZgogCitzdHJpbmcgSW9EZWxlZ2F0ZTo6Q2xlYW5QYXRoKGNvbnN0IHN0cmluZyYgcGF0aCkgeworICBpZiAoYmFzZTo6U3RhcnRzV2l0aChwYXRoLCBzdHJpbmd7Jy4nLCBPU19QQVRIX1NFUEFSQVRPUn0pKSB7CisgICAgcmV0dXJuIHBhdGguc3Vic3RyKDIpOworICB9CisgIHJldHVybiBwYXRoOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2lvX2RlbGVnYXRlLmggYi9pb19kZWxlZ2F0ZS5oCmluZGV4IDZjMWVmOTYuLmE5MmE5YjkgMTAwNjQ0Ci0tLSBhL2lvX2RlbGVnYXRlLmgKKysrIGIvaW9fZGVsZWdhdGUuaApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KIAogI2luY2x1ZGUgImNvZGVfd3JpdGVyLmgiCi0jaW5jbHVkZSAibGluZV9yZWFkZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtNDQsMjIgKzQzLDIwIEBACiAgIHN0YXRpYyBib29sIEdldEFic29sdXRlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBhYnNvbHV0ZV9wYXRoKTsKIAorICAvLyBSZW1vdmUgbGVhZGluZyAiLi8iIGZyb20gfHBhdGh8LgorICBzdGF0aWMgc3RkOjpzdHJpbmcgQ2xlYW5QYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKwogICAvLyBSZXR1cm5zIGEgdW5pcXVlX3B0ciB0byB0aGUgY29udGVudHMgb2YgfGZpbGVuYW1lfC4KICAgLy8gV2lsbCBhcHBlbmQgdGhlIG9wdGlvbmFsIHxjb250ZW50X3N1ZmZpeHwgdG8gdGhlIHJldHVybmVkIGNvbnRlbnRzLgogICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gR2V0RmlsZUNvbnRlbnRzKAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRfc3VmZml4ID0gIiIpIGNvbnN0OwogCi0gIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPExpbmVSZWFkZXI+IEdldExpbmVSZWFkZXIoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdDsKLQogICB2aXJ0dWFsIGJvb2wgRmlsZUlzUmVhZGFibGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OwogCiAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPENvZGVXcml0ZXI+IEdldENvZGVXcml0ZXIoCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdDsKLQogICB2aXJ0dWFsIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IExpc3RGaWxlcyhjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSBjb25zdDsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saW5lX3JlYWRlci5jcHAgYi9saW5lX3JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZGNhMjAuLjAwMDAwMDAKLS0tIGEvbGluZV9yZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsaW5lX3JlYWRlci5oIgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi11c2luZyBzdGQ6OmlzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6Omlmc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLQotY2xhc3MgRmlsZUxpbmVSZWFkZXIgOiBwdWJsaWMgTGluZVJlYWRlciB7Ci0gcHVibGljOgotICBGaWxlTGluZVJlYWRlcigpID0gZGVmYXVsdDsKLSAgfkZpbGVMaW5lUmVhZGVyKCkgb3ZlcnJpZGUgewotICAgIGlucHV0X3N0cmVhbV8uY2xvc2UoKTsKLSAgfQotCi0gIC8vIG5vbi1jb3B5YWJsZSwgbm9uLW1vdmFibGUKLSAgRmlsZUxpbmVSZWFkZXIoY29uc3QgRmlsZUxpbmVSZWFkZXImKSA9IGRlbGV0ZTsKLSAgRmlsZUxpbmVSZWFkZXIoRmlsZUxpbmVSZWFkZXImJikgPSBkZWxldGU7Ci0gIEZpbGVMaW5lUmVhZGVyJiBvcGVyYXRvcj0oY29uc3QgRmlsZUxpbmVSZWFkZXImKSA9IGRlbGV0ZTsKLSAgRmlsZUxpbmVSZWFkZXImIG9wZXJhdG9yPShGaWxlTGluZVJlYWRlciYmKSA9IGRlbGV0ZTsKLQotICBib29sIEluaXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgewotICAgIGlucHV0X3N0cmVhbV8ub3BlbihmaWxlX3BhdGgsIGlmc3RyZWFtOjppbiB8IGlmc3RyZWFtOjpiaW5hcnkpOwotICAgIHJldHVybiBpbnB1dF9zdHJlYW1fLmlzX29wZW4oKSAmJiBpbnB1dF9zdHJlYW1fLmdvb2QoKTsKLSAgfQotCi0gIGJvb2wgUmVhZExpbmUoc3RyaW5nKiBsaW5lKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFpbnB1dF9zdHJlYW1fLmdvb2QoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBsaW5lLT5jbGVhcigpOwotICAgIHN0ZDo6Z2V0bGluZShpbnB1dF9zdHJlYW1fLCAqbGluZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGlmc3RyZWFtIGlucHV0X3N0cmVhbV87Ci19OyAgLy8gY2xhc3MgRmlsZUxpbmVSZWFkZXIKLQotY2xhc3MgTWVtb3J5TGluZVJlYWRlciA6IHB1YmxpYyBMaW5lUmVhZGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1lbW9yeUxpbmVSZWFkZXIoY29uc3Qgc3RyaW5nJiBjb250ZW50cykgOiBpbnB1dF9zdHJlYW1fKGNvbnRlbnRzKSB7fQotICB+TWVtb3J5TGluZVJlYWRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvLyBub24tY29weWFibGUsIG5vbi1tb3ZhYmxlCi0gIE1lbW9yeUxpbmVSZWFkZXIoY29uc3QgTWVtb3J5TGluZVJlYWRlciYpID0gZGVsZXRlOwotICBNZW1vcnlMaW5lUmVhZGVyKE1lbW9yeUxpbmVSZWFkZXImJikgPSBkZWxldGU7Ci0gIE1lbW9yeUxpbmVSZWFkZXImIG9wZXJhdG9yPShjb25zdCBNZW1vcnlMaW5lUmVhZGVyJikgPSBkZWxldGU7Ci0gIE1lbW9yeUxpbmVSZWFkZXImIG9wZXJhdG9yPShNZW1vcnlMaW5lUmVhZGVyJiYpID0gZGVsZXRlOwotCi0gIGJvb2wgUmVhZExpbmUoc3RyaW5nKiBsaW5lKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFpbnB1dF9zdHJlYW1fLmdvb2QoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBsaW5lLT5jbGVhcigpOwotICAgIHN0ZDo6Z2V0bGluZShpbnB1dF9zdHJlYW1fLCAqbGluZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGlzdHJpbmdzdHJlYW0gaW5wdXRfc3RyZWFtXzsKLX07ICAvLyBjbGFzcyBNZW1vcnlMaW5lUmVhZGVyCi0KLXVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gTGluZVJlYWRlcjo6UmVhZEZyb21GaWxlKGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKSB7Ci0gIHVuaXF1ZV9wdHI8RmlsZUxpbmVSZWFkZXI+IGZpbGVfcmVhZGVyKG5ldyBGaWxlTGluZVJlYWRlcigpKTsKLSAgdW5pcXVlX3B0cjxMaW5lUmVhZGVyPiByZXQ7Ci0gIGlmIChmaWxlX3JlYWRlci0+SW5pdChmaWxlX3BhdGgpKSB7Ci0gICAgcmV0LnJlc2V0KGZpbGVfcmVhZGVyLnJlbGVhc2UoKSk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotdW5pcXVlX3B0cjxMaW5lUmVhZGVyPiBMaW5lUmVhZGVyOjpSZWFkRnJvbU1lbW9yeShjb25zdCBzdHJpbmcmIGNvbnRlbnRzKSB7Ci0gIHJldHVybiB1bmlxdWVfcHRyPExpbmVSZWFkZXI+KG5ldyBNZW1vcnlMaW5lUmVhZGVyKGNvbnRlbnRzKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGluZV9yZWFkZXIuaCBiL2xpbmVfcmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODFhNjAuLjAwMDAwMDAKLS0tIGEvbGluZV9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLQotY2xhc3MgTGluZVJlYWRlciB7Ci0gcHVibGljOgotICBMaW5lUmVhZGVyKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5MaW5lUmVhZGVyKCkgPSBkZWZhdWx0OwotCi0gIExpbmVSZWFkZXIoY29uc3QgTGluZVJlYWRlciYpID0gZGVsZXRlOwotICBMaW5lUmVhZGVyKExpbmVSZWFkZXImJikgPSBkZWxldGU7Ci0gIExpbmVSZWFkZXImIG9wZXJhdG9yPShjb25zdCBMaW5lUmVhZGVyJikgPSBkZWxldGU7Ci0gIExpbmVSZWFkZXImIG9wZXJhdG9yPShMaW5lUmVhZGVyJiYpID0gZGVsZXRlOwotCi0gIHZpcnR1YWwgYm9vbCBSZWFkTGluZShzdGQ6OnN0cmluZyogbGluZSkgPSAwOwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gUmVhZEZyb21GaWxlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCk7Ci0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gUmVhZEZyb21NZW1vcnkoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMpOwotfTsgIC8vIGNsYXNzIExpbmVSZWFkZXIKLQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tYWluLmNwcCBiL21haW4uY3BwCmluZGV4IDY5YmEwNjAuLmMwMDc4YmEgMTAwNjQ0Ci0tLSBhL21haW4uY3BwCisrKyBiL21haW4uY3BwCkBAIC0zMSwxMCArMzEsNiBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIE9wdGlvbnMgb3B0aW9ucyhhcmdjLCBhcmd2LCBrRGVmYXVsdExhbmcpOwotICBpZiAoIW9wdGlvbnMuT2soKSkgewotICAgIEFJRExfRVJST1Iob3B0aW9ucy5HZXRFcnJvck1lc3NhZ2UoKSkgPDwgb3B0aW9ucy5HZXRVc2FnZSgpOwotICAgIHJldHVybiAxOwotICB9CiAKICAgLy8gT25seSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGdvIGhlcmUsIHNvIHRoYXQgYXMgbXVjaCBvZiBwb3NzaWJsZSBvZgogICAvLyB0aGUgYWlkbCBjb21waWxlciBpcyBtb2NrZWQgd2l0aCB0aGUgc2luZ2xlIGZ1bmN0aW9uIGBhaWRsX2VudHJ5YApkaWZmIC0tZ2l0IGEvbWV0YWRhdGEvaW5jbHVkZS9haWRsL21ldGFkYXRhLmggYi9tZXRhZGF0YS9pbmNsdWRlL2FpZGwvbWV0YWRhdGEuaAppbmRleCBhOWY5ZjQzLi4wOWM2MGJhIDEwMDY0NAotLS0gYS9tZXRhZGF0YS9pbmNsdWRlL2FpZGwvbWV0YWRhdGEuaAorKysgYi9tZXRhZGF0YS9pbmNsdWRlL2FpZGwvbWV0YWRhdGEuaApAQCAtMzQsNiArMzQsMTIgQEAKICAgLy8gbGlzdCBvZiBhbGwgaGFzaGVzCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBoYXNoZXM7CiAKKyAgLy8gdHJ1ZSBpZiB0aGUgaW50ZXJmYWNlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGZyb3plbiB2ZXJzaW9uCisgIGJvb2wgaGFzX2RldmVsb3BtZW50OworCisgIC8vIGxpc3Qgb2YgYWxsIGZyb3plbiB2ZXJzaW9ucworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHZlcnNpb25zOworCiAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxBaWRsSW50ZXJmYWNlTWV0YWRhdGE+IGFsbCgpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWV0YWRhdGEvcGFyc2VyLmNwcCBiL21ldGFkYXRhL3BhcnNlci5jcHAKaW5kZXggNzMzNDU1NC4uNjQ2YTc3YiAxMDA2NDQKLS0tIGEvbWV0YWRhdGEvcGFyc2VyLmNwcAorKysgYi9tZXRhZGF0YS9wYXJzZXIuY3BwCkBAIC01Niw2ICs1NiwxMiBAQAogICAgICAgc3RkOjpjb3V0IDw8ICJzdGQ6OnN0cmluZyhcIiIgPDwgaW50Zi5hc1N0cmluZygpIDw8ICJcIiksIiA8PCBzdGQ6OmVuZGw7CiAgICAgfQogICAgIHN0ZDo6Y291dCA8PCAifSwiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgZW50cnlbImhhc19kZXZlbG9wbWVudCJdLmFzU3RyaW5nKCkgPDwgIiwiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6dmVjdG9yPHNpemVfdD57IiA8PCBzdGQ6OmVuZGw7CisgICAgZm9yIChjb25zdCBKc29uOjpWYWx1ZSYgaW50ZiA6IGVudHJ5WyJ2ZXJzaW9ucyJdKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgaW50Zi5hc1N0cmluZygpIDw8ICIsIiA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCAifSwiIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNvdXQgPDwgIn0sIiA8PCBzdGQ6OmVuZGw7CiAgIH0KICAgc3RkOjpjb3V0IDw8ICJ9OyIgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvbWV0YWRhdGEvdGVzdC5jcHAgYi9tZXRhZGF0YS90ZXN0LmNwcAppbmRleCA2N2QwOGIyLi41NjE3NDE1IDEwMDY0NAotLS0gYS9tZXRhZGF0YS90ZXN0LmNwcAorKysgYi9tZXRhZGF0YS90ZXN0LmNwcApAQCAtNDAsNCArNDAsMTcgQEAKICAgRVhQRUNUX1RIQVQoaW5mby0+aGFzaGVzLCBFbGVtZW50c0FyZSgiMTNlMjRiMmZhYzZhOTc5OTcxODE5ZmJhMmFiMGQ2ZDdjNDE4MjEyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRjMmE5MjkyODQ3ZTQzYjQzNjBiYjE4M2Y3NDkxZjBlOTg5NWVhYTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1NGY5MzU5MjBhYjA5MzRjMjQyMTQ1Y2YwMGY5ODUyYWUzZjVhNjNlIikpOworICBFWFBFQ1RfVEhBVChpbmZvLT52ZXJzaW9ucywgRWxlbWVudHNBcmUoMSwgMiwgMykpOworICBFWFBFQ1RfRVEoaW5mby0+aGFzX2RldmVsb3BtZW50LCB0cnVlKTsKK30KKworVEVTVChBaWRsTWV0YWRhdGEsIEhhc1Rlc3RJbnN0YW5jZXNOb0RldmVsb3BtZW50KSB7CisgIGNvbnN0IGF1dG8mIGluZm8gPSBtZXRhZGF0YUZvck1vZHVsZSgidGVzdC1waWVjZS0yIik7CisgIEFTU0VSVF9ORShpbmZvLCBzdGQ6Om51bGxvcHQpOworICBFWFBFQ1RfRVEoaW5mby0+c3RhYmlsaXR5LCAiIik7CisgIEVYUEVDVF9USEFUKGluZm8tPnR5cGVzLCBFbGVtZW50c0FyZSgiSU5vUGFja2FnZSIsICJzb21lX3BhY2thZ2UuSUJhciIpKTsKKyAgRVhQRUNUX1RIQVQoaW5mby0+aGFzaGVzLCBFbGVtZW50c0FyZSgiYzU0NDkwMmFiOGExZDJlNzJhZTkzOTYwMzJiYTExM2U5Yjk2OThjNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZjZDM2ZGI0NTFjZGJlZWIwNDk4MzNmZDdmNDk5YTk4N2FjZjM5MzAiKSk7CisgIEVYUEVDVF9USEFUKGluZm8tPnZlcnNpb25zLCBFbGVtZW50c0FyZSgxKSk7CisgIEVYUEVDVF9FUShpbmZvLT5oYXNfZGV2ZWxvcG1lbnQsIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL29wdGlvbnMuY3BwIGIvb3B0aW9ucy5jcHAKaW5kZXggYjM4MzA1Mi4uYjk4NzhiOCAxMDA2NDQKLS0tIGEvb3B0aW9ucy5jcHAKKysrIGIvb3B0aW9ucy5jcHAKQEAgLTE1LDIwICsxNSwyNSBAQAogICovCiAKICNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAibG9nZ2luZy5oIgotI2luY2x1ZGUgIm9zLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGdldG9wdC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCisjaW5jbHVkZSAibG9nZ2luZy5oIgorI2luY2x1ZGUgIm9zLmgiCiAKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6VHJpbTsKIHVzaW5nIHN0ZDo6ZW5kbDsKQEAgLTU5LDYgKzY0LDE1IEBACiAgICAgICAgPDwgIiAgIENoZWNrIHdoZXRoZXIgTkVXX0RJUiBBUEkgZHVtcCBpcyB7Y29tcGF0aWJsZXxlcXVhbH0gZXh0ZW5zaW9uICIgPDwgZW5kbAogICAgICAgIDw8ICIgICBvZiB0aGUgQVBJIGR1bXAgT0xEX0RJUi4gRGVmYXVsdDogY29tcGF0aWJsZSIgPDwgZW5kbAogI2VuZGlmCisgICAgICAgPDwgZW5kbAorICAgICAgIDw8IG15bmFtZV8gPDwgIiAtLWFwaW1hcHBpbmcgT1VUUFVUIElOUFVULi4uIiA8PCBlbmRsCisgICAgICAgPDwgIiAgIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBkZWNsYXJlZCBhaWRsIG1ldGhvZCBzaWduYXR1cmVzIHRvIiA8PCBlbmRsCisgICAgICAgPDwgIiAgIHRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci4gZS5nLjogIiA8PCBlbmRsCisgICAgICAgPDwgIiAgICAgICBJZiBsaW5lIDM5IG9mIGZvby9iYXIvSUZvby5haWRsIGNvbnRhaW5zOiIKKyAgICAgICA8PCAiICAgICAgICAgdm9pZCBkb0ZvbyhpbnQgYmFyLCBTdHJpbmcgYmF6KTsiIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgIFRoZW4gdGhlIHJlc3VsdCB3b3VsZCBiZToiIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgICAgZm9vLmJhci5CYXp8ZG9Gb298aW50LFN0cmluZyx8dm9pZCIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICBmb28vYmFyL0lGb28uYWlkbDozOSIgPDwgZW5kbAogICAgICAgIDw8IGVuZGw7CiAKICAgLy8gTGVnYWN5IG9wdGlvbiBmb3JtYXRzCkBAIC03OSw4ICs5Myw2IEBACiAgIHNzdHIgPDwgIk9QVElPTjoiIDw8IGVuZGwKICAgICAgICA8PCAiICAtSSBESVIsIC0taW5jbHVkZT1ESVIiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIFVzZSBESVIgYXMgYSBzZWFyY2ggcGF0aCBmb3IgaW1wb3J0IHN0YXRlbWVudHMuIiA8PCBlbmRsCi0gICAgICAgPDwgIiAgLW0gRklMRSwgLS1pbXBvcnQ9RklMRSIgPDwgZW5kbAotICAgICAgIDw8ICIgICAgICAgICAgSW1wb3J0IEZJTEUgZGlyZWN0bHkgd2l0aG91dCBzZWFyY2hpbmcgaW4gdGhlIHNlYXJjaCBwYXRocy4iIDw8IGVuZGwKICAgICAgICA8PCAiICAtcCBGSUxFLCAtLXByZXByb2Nlc3NlZD1GSUxFIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICBJbmNsdWRlIEZJTEUgd2hpY2ggaXMgY3JlYXRlZCBieSAtLXByZXByb2Nlc3MuIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgLWQgRklMRSwgLS1kZXA9RklMRSIgPDwgZW5kbApAQCAtOTcsMjUgKzEwOSwyNSBAQAogICAgICAgIDw8ICIgICAgICAgICAgVHJpZ2dlciBmYWlsIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgYSBwYXJjZWxhYmxlLiIgPDwgZW5kbAogICAgICAgIDw8ICIgIC0tbmluamEiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIEdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZSBpbiBhIGZvcm1hdCBuaW5qYSB1bmRlcnN0YW5kcy4iIDw8IGVuZGwKKyAgICAgICA8PCAiICAtLXJwYyIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICAgKGZvciBKYXZhKSB3aGV0aGVyIHRvIGdlbmVyYXRlIHN1cHBvcnQgZm9yIFJQQyB0cmFuc2FjdGlvbnMuIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgLS1zdHJ1Y3R1cmVkIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICBXaGV0aGVyIHRoaXMgaW50ZXJmYWNlIGlzIGRlZmluZWQgZXhjbHVzaXZlbHkgaW4gQUlETC4iIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIEl0IGlzIHRoZXJlZm9yZSBhIGNhbmRpZGF0ZSBmb3Igc3RhYmlsaXphdGlvbi4iIDw8IGVuZGwKICAgICAgICA8PCAiICAtLXN0YWJpbGl0eT08bGV2ZWw+IiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICBUaGUgc3RhYmlsaXR5IHJlcXVpcmVtZW50IG9mIHRoaXMgaW50ZXJmYWNlLiIgPDwgZW5kbAorICAgICAgIDw8ICIgIC0tbWluX3Nka192ZXJzaW9uPTx2ZXJzaW9uPiIgPDwgZW5kbAorICAgICAgIDw8ICIgICAgICAgICAgTWluaW11bSBTREsgdmVyc2lvbiB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgc3VwcG9ydC4iIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgICAgIERlZmF1bHRzIHRvICIgPDwgREVGQVVMVF9TREtfVkVSU0lPTl9KQVZBIDw8ICIgZm9yIC0tbGFuZz1qYXZhLCAiIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBERUZBVUxUX1NES19WRVJTSU9OX0NQUCA8PCAiIGZvciAtLWxhbmc9Y3BwLCAiIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBERUZBVUxUX1NES19WRVJTSU9OX05ESyA8PCAiIGZvciAtLWxhbmc9bmRrLCAiIDw8IGVuZGwKKyAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBERUZBVUxUX1NES19WRVJTSU9OX1JVU1QgPDwgIiBmb3IgLS1sYW5nPXJ1c3QsICIgPDwgZW5kbAogICAgICAgIDw8ICIgIC10LCAtLXRyYWNlIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICBJbmNsdWRlIHRyYWNpbmcgY29kZSBmb3Igc3lzdHJhY2UuIE5vdGUgdGhhdCBpZiBlaXRoZXIiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIHRoZSBjbGllbnQgb3Igc2VydmljZSBjb2RlIGlzIG5vdCBhdXRvLWdlbmVyYXRlZCBieSB0aGlzIiA8PCBlbmRsCiAgICAgICAgPDwgIiAgICAgICAgICB0b29sLCB0aGF0IHBhcnQgd2lsbCBub3QgYmUgdHJhY2VkLiIgPDwgZW5kbAogICAgICAgIDw8ICIgIC0tdHJhbnNhY3Rpb25fbmFtZXMiIDw8IGVuZGwKICAgICAgICA8PCAiICAgICAgICAgIEdlbmVyYXRlIHRyYW5zYWN0aW9uIG5hbWVzLiIgPDwgZW5kbAotICAgICAgIDw8ICIgIC0tYXBpbWFwcGluZyIgPDwgZW5kbAotICAgICAgIDw8ICIgICAgICAgICAgR2VuZXJhdGVzIGEgbWFwcGluZyBvZiBkZWNsYXJlZCBhaWRsIG1ldGhvZCBzaWduYXR1cmVzIHRvIiA8PCBlbmRsCi0gICAgICAgPDwgIiAgICAgICAgICB0aGUgb3JpZ2luYWwgbGluZSBudW1iZXIuIGUuZy46ICIgPDwgZW5kbAotICAgICAgIDw8ICIgICAgICAgICAgICAgIElmIGxpbmUgMzkgb2YgZm9vL2Jhci9JRm9vLmFpZGwgY29udGFpbnM6IgotICAgICAgIDw8ICIgICAgICAgICAgICAgIHZvaWQgZG9Gb28oaW50IGJhciwgU3RyaW5nIGJheik7IiA8PCBlbmRsCi0gICAgICAgPDwgIiAgICAgICAgICAgICAgVGhlbiB0aGUgcmVzdWx0IHdvdWxkIGJlOiIgPDwgZW5kbAotICAgICAgIDw8ICIgICAgICAgICAgICAgIGZvby5iYXIuQmF6fGRvRm9vfGludCxTdHJpbmcsfHZvaWQiIDw8IGVuZGwKLSAgICAgICA8PCAiICAgICAgICAgICAgICBmb28vYmFyL0lGb28uYWlkbDozOSIgPDwgZW5kbAogICAgICAgIDw8ICIgIC12IFZFUiwgLS12ZXJzaW9uPVZFUiIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgU2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UgYW5kIHBhcmNlbGFibGUgdG8gVkVSLiIgPDwgZW5kbAogICAgICAgIDw8ICIgICAgICAgICAgVkVSIG11c3QgYmUgYW4gaW50ZXJnZXIgZ3JlYXRlciB0aGFuIDAuIiA8PCBlbmRsCkBAIC0xODEsNiArMTkzLDQ0IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB1aW50MzJfdD4gY29kZU5hbWVUb1ZlcnNpb24gPSB7CisgICAgeyJTIiwgMzF9LAorICAgIHsiVGlyYW1pc3UiLCBTREtfVkVSU0lPTl9UaXJhbWlzdX0sCisgICAgLy8gdGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlIGxhdGVzdCBpbi1kZXZlbG9wbWVudCBwbGF0Zm9ybSB2ZXJzaW9uCisgICAgeyJjdXJyZW50IiwgU0RLX1ZFUlNJT05fY3VycmVudH0sCisgICAgLy8gdGhpcyBpcyBhbiBhbGlhcyBmb3IgdXNlIG9mIGFsbCBBUElzLCBpbmNsdWRpbmcgdGhvc2Ugbm90IGluIGFueSBBUEkgc3VyZmFjZQorICAgIHsicGxhdGZvcm1fYXBpcyIsIDEwMDAxfSwKK307CisKK1Jlc3VsdDx1aW50MzJfdD4gTWluU2RrVmVyc2lvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCBudW07CisgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHN0ciwgJm51bSwgMTAwMDB1IC8qIG1heCAqLykpIHsKKyAgICBpZiAoYXV0byBmb3VuZCA9IGNvZGVOYW1lVG9WZXJzaW9uLmZpbmQoc3RyKTsgZm91bmQgIT0gY29kZU5hbWVUb1ZlcnNpb24uZW5kKCkpIHsKKyAgICAgIHJldHVybiBmb3VuZC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gRXJyb3JmKCJJbnZhbGlkIFNESyB2ZXJzaW9uOiB7fSIsIHN0cik7CisgIH0KKyAgcmV0dXJuIG51bTsKK30KKworc3RhdGljIHVpbnQzMl90IERlZmF1bHRNaW5TZGtWZXJzaW9uRm9yTGFuZyhjb25zdCBPcHRpb25zOjpMYW5ndWFnZSBsYW5nKSB7CisgIHN3aXRjaCAobGFuZykgeworICAgIGNhc2UgT3B0aW9uczo6TGFuZ3VhZ2U6OkNQUDoKKyAgICAgIHJldHVybiBERUZBVUxUX1NES19WRVJTSU9OX0NQUDsKKyAgICBjYXNlIE9wdGlvbnM6Okxhbmd1YWdlOjpKQVZBOgorICAgICAgcmV0dXJuIERFRkFVTFRfU0RLX1ZFUlNJT05fSkFWQTsKKyAgICBjYXNlIE9wdGlvbnM6Okxhbmd1YWdlOjpOREs6CisgICAgICByZXR1cm4gREVGQVVMVF9TREtfVkVSU0lPTl9OREs7CisgICAgY2FzZSBPcHRpb25zOjpMYW5ndWFnZTo6UlVTVDoKKyAgICAgIHJldHVybiBERUZBVUxUX1NES19WRVJTSU9OX1JVU1Q7CisgICAgY2FzZSBPcHRpb25zOjpMYW5ndWFnZTo6VU5TUEVDSUZJRUQ6CisgICAgICByZXR1cm4gREVGQVVMVF9TREtfVkVSU0lPTl9KQVZBOyAgLy8gVGhlIHNhZmVzdCBvcHRpb24KKyAgICBkZWZhdWx0OgorICAgICAgQUlETF9GQVRBTChBSURMX0xPQ0FUSU9OX0hFUkUpCisgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgT3B0aW9uczo6TGFuZ3VhZ2UgZW51bWVyYXRvcjogIiA8PCBzdGF0aWNfY2FzdDxzaXplX3Q+KGxhbmcpOworICB9Cit9CisKIE9wdGlvbnMgT3B0aW9uczo6RnJvbShjb25zdCBzdHJpbmcmIGNtZGxpbmUpIHsKICAgdmVjdG9yPHN0cmluZz4gYXJncyA9IFNwbGl0KGNtZGxpbmUsICIgIik7CiAgIHJldHVybiBGcm9tKGFyZ3MpOwpAQCAtMjAyLDcgKzI1Miw3IEBACiB9CiAKIE9wdGlvbnM6Ok9wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IHJhd19hcmd2W10sIE9wdGlvbnM6Okxhbmd1YWdlIGRlZmF1bHRfbGFuZykKLSAgICA6IG15bmFtZV8ocmF3X2FyZ3ZbMF0pLCBsYW5ndWFnZV8oZGVmYXVsdF9sYW5nKSB7CisgICAgOiBteW5hbWVfKGFyZ2MgPj0gMSA/IHJhd19hcmd2WzBdIDogImFpZGwiKSwgbGFuZ3VhZ2VfKGRlZmF1bHRfbGFuZykgewogICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gYXJndiA9IHdhcm5pbmdfb3B0aW9uc18uUGFyc2UoYXJnYywgcmF3X2FyZ3YsIGVycm9yX21lc3NhZ2VfKTsKICAgaWYgKCFPaygpKSByZXR1cm47CiAgIGFyZ2MgPSBhcmd2LnNpemUoKTsKQEAgLTIyMCwxMyArMjcwLDE0IEBACiAjZW5kaWYKICAgICAgICAgeyJhcGltYXBwaW5nIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCiAgICAgICAgIHsiaW5jbHVkZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICAgICAgICB7ImltcG9ydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbSd9LAogICAgICAgICB7InByZXByb2Nlc3NlZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncCd9LAogICAgICAgICB7ImRlcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZCd9LAogICAgICAgICB7Im91dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbyd9LAogICAgICAgICB7ImhlYWRlcl9vdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2gnfSwKICAgICAgICAgeyJuaW5qYSIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAorICAgICAgICB7InJwYyIsIG5vX2FyZ3VtZW50LCAwLCAncid9LAogICAgICAgICB7InN0YWJpbGl0eSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnWSd9LAorICAgICAgICB7Im1pbl9zZGtfdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbSd9LAogICAgICAgICB7InN0cnVjdHVyZWQiLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKICAgICAgICAgeyJ0cmFjZSIsIG5vX2FyZ3VtZW50LCAwLCAndCd9LAogICAgICAgICB7InRyYW5zYWN0aW9uX25hbWVzIiwgbm9fYXJndW1lbnQsIDAsICdjJ30sCkBAIC0yMzcsNyArMjg4LDcgQEAKICAgICAgICAgezAsIDAsIDAsIDB9LAogICAgIH07CiAgICAgY29uc3QgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBjb25zdF9jYXN0PGNoYXIqIGNvbnN0Kj4oYXJndi5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkk6bTpwOmQ6bzpoOmFidHY6IiwgbG9uZ19vcHRpb25zLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJOnA6ZDpvOmg6YWJ0djppOiIsIGxvbmdfb3B0aW9ucywgbnVsbHB0cik7CiAgICAgaWYgKGMgPT0gLTEpIHsKICAgICAgIC8vIG5vIG1vcmUgb3B0aW9ucwogICAgICAgYnJlYWs7CkBAIC0yNzEsMzMgKzMyMiwyNyBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAncyc6Ci0gICAgICAgIGlmICh0YXNrXyAhPSBPcHRpb25zOjpUYXNrOjpVTlNQRUNJRklFRCkgewotICAgICAgICAgIHRhc2tfID0gT3B0aW9uczo6VGFzazo6UFJFUFJPQ0VTUzsKLSAgICAgICAgfQorICAgICAgICB0YXNrXyA9IE9wdGlvbnM6OlRhc2s6OlBSRVBST0NFU1M7CiAgICAgICAgIGJyZWFrOwogI2lmbmRlZiBfV0lOMzIKICAgICAgIGNhc2UgJ3UnOgotICAgICAgICBpZiAodGFza18gIT0gT3B0aW9uczo6VGFzazo6VU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICB0YXNrXyA9IE9wdGlvbnM6OlRhc2s6OkRVTVBfQVBJOwotICAgICAgICB9CisgICAgICAgIHRhc2tfID0gT3B0aW9uczo6VGFzazo6RFVNUF9BUEk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAneCc6CiAgICAgICAgIGR1bXBfbm9fbGljZW5zZV8gPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgJ0EnOgotICAgICAgICBpZiAodGFza18gIT0gT3B0aW9uczo6VGFzazo6VU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICB0YXNrXyA9IE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSTsKLSAgICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCBhbGwgcGFyY2VsYWJsZXMgaW4gdGhlIGFwaSBkdW1wZXMgYXJlIHN0cnVjdHVyZWQKLSAgICAgICAgICBzdHJ1Y3R1cmVkXyA9IHRydWU7Ci0gICAgICAgICAgaWYgKG9wdGFyZykgewotICAgICAgICAgICAgaWYgKHN0cmNtcChvcHRhcmcsICJjb21wYXRpYmxlIikgPT0gMCkKLSAgICAgICAgICAgICAgY2hlY2tfYXBpX2xldmVsXyA9IENoZWNrQXBpTGV2ZWw6OkNPTVBBVElCTEU7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZXF1YWwiKSA9PSAwKQotICAgICAgICAgICAgICBjaGVja19hcGlfbGV2ZWxfID0gQ2hlY2tBcGlMZXZlbDo6RVFVQUw7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZV8gPDwgIlVuc3VwcG9ydGVkIC0tY2hlY2thcGkgbGV2ZWw6ICciIDw8IG9wdGFyZyA8PCAiJyIgPDwgZW5kbDsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICB0YXNrXyA9IE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSTsKKyAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgYWxsIHBhcmNlbGFibGVzIGluIHRoZSBhcGkgZHVtcGVzIGFyZSBzdHJ1Y3R1cmVkCisgICAgICAgIHN0cnVjdHVyZWRfID0gdHJ1ZTsKKyAgICAgICAgaWYgKG9wdGFyZykgeworICAgICAgICAgIGlmIChzdHJjbXAob3B0YXJnLCAiY29tcGF0aWJsZSIpID09IDApCisgICAgICAgICAgICBjaGVja19hcGlfbGV2ZWxfID0gQ2hlY2tBcGlMZXZlbDo6Q09NUEFUSUJMRTsKKyAgICAgICAgICBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZXF1YWwiKSA9PSAwKQorICAgICAgICAgICAgY2hlY2tfYXBpX2xldmVsXyA9IENoZWNrQXBpTGV2ZWw6OkVRVUFMOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZXJyb3JfbWVzc2FnZV8gPDwgIlVuc3VwcG9ydGVkIC0tY2hlY2thcGkgbGV2ZWw6ICciIDw8IG9wdGFyZyA8PCAiJyIgPDwgZW5kbDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0zMDYsMTAgKzM1MSw2IEBACiAgICAgICAgIGltcG9ydF9kaXJzXy5lbXBsYWNlKFRyaW0ob3B0YXJnKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgY2FzZSAnbSc6IHsKLSAgICAgICAgaW1wb3J0X2ZpbGVzXy5lbXBsYWNlKFRyaW0ob3B0YXJnKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQogICAgICAgY2FzZSAncCc6CiAgICAgICAgIHByZXByb2Nlc3NlZF9maWxlc18uZW1wbGFjZV9iYWNrKFRyaW0ob3B0YXJnKSk7CiAgICAgICAgIGJyZWFrOwpAQCAtMzQzLDYgKzM4NCwxNyBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQorICAgICAgY2FzZSAnbSc6CisgICAgICAgIGlmIChhdXRvIHJldCA9IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKFRyaW0ob3B0YXJnKSk7IHJldC5vaygpKSB7CisgICAgICAgICAgbWluX3Nka192ZXJzaW9uXyA9ICpyZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXJyb3JfbWVzc2FnZV8gPDwgcmV0LmVycm9yKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncic6CisgICAgICAgIGdlbl9ycGNfID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlICd0JzoKICAgICAgICAgZ2VuX3RyYWNlc18gPSB0cnVlOwogICAgICAgICBicmVhazsKQEAgLTM3NSwxNCArNDI3LDE3IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAnZSc6CiAgICAgICAgIHN0ZDo6Y2VyciA8PCBHZXRVc2FnZSgpOwotICAgICAgICBleGl0KDApOworICAgICAgICB0YXNrXyA9IFRhc2s6OkhFTFA7CisgICAgICAgIENIRUNLKE9rKCkpOworICAgICAgICByZXR1cm47CiAgICAgICBjYXNlICdpJzoKICAgICAgICAgb3V0cHV0X2ZpbGVfID0gVHJpbShvcHRhcmcpOwogICAgICAgICB0YXNrXyA9IFRhc2s6OkRVTVBfTUFQUElOR1M7CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3RkOjpjZXJyIDw8IEdldFVzYWdlKCk7Ci0gICAgICAgIGV4aXQoMSk7CisgICAgICAgIGVycm9yX21lc3NhZ2VfIDw8IEdldFVzYWdlKCk7CisgICAgICAgIENIRUNLKCFPaygpKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICAgfSAgLy8gd2hpbGUKIApAQCAtNDMwLDcgKzQ4NSw4IEBACiAgICAgfQogICB9IGVsc2UgewogICAgIC8vIHRoZSBuZXcgYXJndW1lbnRzIGZvcm1hdAotICAgIGlmICh0YXNrXyA9PSBPcHRpb25zOjpUYXNrOjpDT01QSUxFIHx8IHRhc2tfID09IE9wdGlvbnM6OlRhc2s6OkRVTVBfQVBJKSB7CisgICAgaWYgKHRhc2tfID09IE9wdGlvbnM6OlRhc2s6OkNPTVBJTEUgfHwgdGFza18gPT0gT3B0aW9uczo6VGFzazo6RFVNUF9BUEkgfHwKKyAgICAgICAgdGFza18gPT0gT3B0aW9uczo6VGFzazo6RFVNUF9NQVBQSU5HUykgewogICAgICAgaWYgKGFyZ2MgLSBvcHRpbmQgPCAxKSB7CiAgICAgICAgIGVycm9yX21lc3NhZ2VfIDw8ICJObyBpbnB1dCBmaWxlLiIgPDwgZW5kbDsKICAgICAgICAgcmV0dXJuOwpAQCAtNDQxLDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJnb3QgIiA8PCAoYXJnYyAtIG9wdGluZCkgPDwgIi4iIDw8IGVuZGw7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KLSAgICAgIGlmICh0YXNrXyAhPSBPcHRpb25zOjpUYXNrOjpDSEVDS19BUEkgJiYgdGFza18gIT0gT3B0aW9uczo6VGFzazo6RFVNUF9NQVBQSU5HUykgeworICAgICAgaWYgKHRhc2tfICE9IE9wdGlvbnM6OlRhc2s6OkNIRUNLX0FQSSkgewogICAgICAgICBvdXRwdXRfZmlsZV8gPSBhcmd2W29wdGluZCsrXTsKICAgICAgIH0KICAgICB9CkBAIC01MzAsNiArNTg2LDMxIEBACiAgICAgICByZXR1cm47CiAgICAgfQogICB9CisgIGlmICh0YXNrXyAhPSBPcHRpb25zOjpUYXNrOjpDT01QSUxFKSB7CisgICAgaWYgKG1pbl9zZGtfdmVyc2lvbl8gIT0gMCkgeworICAgICAgZXJyb3JfbWVzc2FnZV8gPDwgIi0tbWluX3Nka192ZXJzaW9uIGlzIGF2YWlsYWJsZSBvbmx5IGZvciBjb21waWxhdGlvbi4iIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZvciBvdGhlciB0YXNrcywgdXNlICJjdXJyZW50IgorICAgIG1pbl9zZGtfdmVyc2lvbl8gPSBNaW5TZGtWZXJzaW9uRnJvbVN0cmluZygiY3VycmVudCIpLnZhbHVlKCk7CisgIH0KKworICB1aW50MzJfdCBkZWZhdWx0X3ZlciA9IERlZmF1bHRNaW5TZGtWZXJzaW9uRm9yTGFuZyhsYW5ndWFnZV8pOworICBpZiAobWluX3Nka192ZXJzaW9uXyA9PSAwKSB7ICAvLyAtLW1pbl9zZGtfdmVyc2lvbiBmbGFnIG5vdCBzcGVjaWZpZWQKKyAgICBtaW5fc2RrX3ZlcnNpb25fID0gZGVmYXVsdF92ZXI7CisgIH0gZWxzZSBpZiAobWluX3Nka192ZXJzaW9uXyA8IGRlZmF1bHRfdmVyKSB7CisgICAgZXJyb3JfbWVzc2FnZV8gPDwgIk1pbiBTREsgdmVyc2lvbiBzaG91bGQgYXQgbGVhc3QgYmUgIiA8PCBkZWZhdWx0X3ZlciA8PCAiLiIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICB1aW50MzJfdCBycGNfdmVyc2lvbiA9IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKCJUaXJhbWlzdSIpLnZhbHVlKCk7CisgIC8vIG5vdGU6IHdlIHdvdWxkIGxpa2UgdG8gYWx3YXlzIGdlbmVyYXRlIChKYXZhKSBjb2RlIHRvIHN1cHBvcnQgUlBDIG91dCBvZgorICAvLyB0aGUgYm94LCBidXQgZG9pbmcgc28gY2F1c2VzIGFuIHVuY2xlYXIgZXJyb3IgZm9yIHBlb3BsZSB0cnlpbmcgdG8gdXNlIFJQQworICAvLyAtIG5vdyB3ZSByZXF1aXJlIHRoZW0gdG8gYWRkIHRoZSBnZW5fcnBjIGJ1aWxkIHJ1bGUgYW5kIGdldCB0aGlzIGNsZWFyIG1lc3NhZ2UuCisgIGlmIChnZW5fcnBjXyAmJiBtaW5fc2RrX3ZlcnNpb25fIDwgcnBjX3ZlcnNpb24pIHsKKyAgICBlcnJvcl9tZXNzYWdlXyA8PCAiUlBDIGNvZGUgcmVxdWlyZXMgbWluaW11bSBTREsgdmVyc2lvbiBvZiBhdCBsZWFzdCAiIDw8IHJwY192ZXJzaW9uIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CiAKICAgQUlETF9GQVRBTF9JRighb3V0cHV0X2Rpcl8uZW1wdHkoKSAmJiBvdXRwdXRfZGlyXy5iYWNrKCkgIT0gT1NfUEFUSF9TRVBBUkFUT1IsIG91dHB1dF9kaXJfKTsKICAgQUlETF9GQVRBTF9JRighb3V0cHV0X2hlYWRlcl9kaXJfLmVtcHR5KCkgJiYgb3V0cHV0X2hlYWRlcl9kaXJfLmJhY2soKSAhPSBPU19QQVRIX1NFUEFSQVRPUiwKZGlmZiAtLWdpdCBhL29wdGlvbnMuaCBiL29wdGlvbnMuaAppbmRleCAxMWE1ZTU5Li4yMDRiMzcxIDEwMDY0NAotLS0gYS9vcHRpb25zLmgKKysrIGIvb3B0aW9ucy5oCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KKwogI2luY2x1ZGUgImRpYWdub3N0aWNzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI4LDYgKzMwLDE5IEBACiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6dmVjdG9yOwogCisvLyBUaGUgb2xkZXN0IFNESyB2ZXJzaW9uIHRoYXQgaXMgc3VwcG9ydGVkIGZvciBlYWNoIGJhY2tlbmQuIEZvciBub24tSmF2YSBiYWNrZW5kcywgdGhlc2UgYXJlIHRoZQorLy8gcGxhdGZvcm0gU0RLIHZlcnNpb24gd2hlcmUgdGhlIHN1cHBvcnQgZm9yIHRoZSBiYWNrZW5kIHdhcyBhZGRlZC4gRm9yIEphdmEgYmFja2VuZCwgdGhpcyBpcyAxLgorLy8gVE9ETyhiLzIwNTA2NTcwMykgc3dpdGNoIGJhY2sgdG8gREVGQVVMVF9TREtfVkVSU0lPTl9KQVZBID0gMjMKK2NvbnN0ZXhwciB1aW50MzJfdCBERUZBVUxUX1NES19WRVJTSU9OX0pBVkEgPSAxOworY29uc3RleHByIHVpbnQzMl90IERFRkFVTFRfU0RLX1ZFUlNJT05fQ1BQID0gMjM7Citjb25zdGV4cHIgdWludDMyX3QgREVGQVVMVF9TREtfVkVSU0lPTl9OREsgPSAyOTsKK2NvbnN0ZXhwciB1aW50MzJfdCBERUZBVUxUX1NES19WRVJTSU9OX1JVU1QgPSAzMTsKKworY29uc3RleHByIHVpbnQzMl90IFNES19WRVJTSU9OX2N1cnJlbnQgPSAxMDAwMDsKK2NvbnN0ZXhwciB1aW50MzJfdCBTREtfVkVSU0lPTl9UaXJhbWlzdSA9IFNES19WRVJTSU9OX2N1cnJlbnQ7CisKK2NvbnN0ZXhwciB1aW50MzJfdCBKQVZBX1BST1BBR0FURV9WRVJTSU9OID0gU0RLX1ZFUlNJT05fVGlyYW1pc3U7CisKIC8vIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIG9zdHJpbmdzdHJlYW0uIFRoaXMgaXMganVzdCB0byBtYWtlIE9wdGlvbnMgY2xhc3MKIC8vIGNvcGlhYmxlIGJ5IHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yLiBJZiBvc3RpbmdzdHJlYW0gaXMgbm90IHdyYXBwZWQsCiAvLyB0aGUgaW1wbGNpdCBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vdCBnZW5lcmF0ZWQgYmVjYXVzZSBvc3RyaW5nc3RyZWFtIGlzbid0CkBAIC03Nyw3ICs5Miw3IEBACiAgcHVibGljOgogICBlbnVtIGNsYXNzIExhbmd1YWdlIHsgVU5TUEVDSUZJRUQsIEpBVkEsIENQUCwgTkRLLCBSVVNUIH07CiAKLSAgZW51bSBjbGFzcyBUYXNrIHsgVU5TUEVDSUZJRUQsIENPTVBJTEUsIFBSRVBST0NFU1MsIERVTVBfQVBJLCBDSEVDS19BUEksIERVTVBfTUFQUElOR1MgfTsKKyAgZW51bSBjbGFzcyBUYXNrIHsgSEVMUCwgQ09NUElMRSwgUFJFUFJPQ0VTUywgRFVNUF9BUEksIENIRUNLX0FQSSwgRFVNUF9NQVBQSU5HUyB9OwogCiAgIGVudW0gY2xhc3MgQ2hlY2tBcGlMZXZlbCB7IENPTVBBVElCTEUsIEVRVUFMIH07CiAKQEAgLTg2LDYgKzEwMSwxMiBAQAogCiAgIE9wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSwgTGFuZ3VhZ2UgZGVmYXVsdF9sYW5nID0gTGFuZ3VhZ2U6OlVOU1BFQ0lGSUVEKTsKIAorICBPcHRpb25zIFBsdXNJbXBvcnREaXIoY29uc3Qgc3RkOjpzdHJpbmcmIGltcG9ydF9kaXIpIGNvbnN0IHsKKyAgICBPcHRpb25zIGNvcHkoKnRoaXMpOworICAgIGNvcHkuaW1wb3J0X2RpcnNfLmluc2VydChpbXBvcnRfZGlyKTsKKyAgICByZXR1cm4gY29weTsKKyAgfQorCiAgIHN0YXRpYyBPcHRpb25zIEZyb20oY29uc3Qgc3RyaW5nJiBjbWRsaW5lKTsKIAogICBzdGF0aWMgT3B0aW9ucyBGcm9tKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBhcmdzKTsKQEAgLTk3LDYgKzExOCw4IEBACiAKICAgU3RhYmlsaXR5IEdldFN0YWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIHN0YWJpbGl0eV87IH0KIAorICB1aW50MzJfdCBHZXRNaW5TZGtWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbWluX3Nka192ZXJzaW9uXzsgfQorCiAgIExhbmd1YWdlIFRhcmdldExhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gbGFuZ3VhZ2VfOyB9CiAgIGJvb2wgSXNDcHBPdXRwdXQoKSBjb25zdCB7IHJldHVybiBsYW5ndWFnZV8gPT0gTGFuZ3VhZ2U6OkNQUCB8fCBsYW5ndWFnZV8gPT0gTGFuZ3VhZ2U6Ok5ESzsgfQogCkBAIC0xMDYsOCArMTI5LDYgQEAKIAogICBjb25zdCBzZXQ8c3RyaW5nPiYgSW1wb3J0RGlycygpIGNvbnN0IHsgcmV0dXJuIGltcG9ydF9kaXJzXzsgfQogCi0gIGNvbnN0IHNldDxzdHJpbmc+JiBJbXBvcnRGaWxlcygpIGNvbnN0IHsgcmV0dXJuIGltcG9ydF9maWxlc187IH0KLQogICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgUHJlcHJvY2Vzc2VkRmlsZXMoKSBjb25zdCB7IHJldHVybiBwcmVwcm9jZXNzZWRfZmlsZXNfOyB9CiAKICAgc3RyaW5nIERlcGVuZGVuY3lGaWxlKCkgY29uc3QgewpAQCAtMTE2LDYgKzEzNyw4IEBACiAKICAgYm9vbCBBdXRvRGVwRmlsZSgpIGNvbnN0IHsgcmV0dXJuIGF1dG9fZGVwX2ZpbGVfOyB9CiAKKyAgYm9vbCBHZW5ScGMoKSBjb25zdCB7IHJldHVybiBnZW5fcnBjXzsgfQorCiAgIGJvb2wgR2VuVHJhY2VzKCkgY29uc3QgeyByZXR1cm4gZ2VuX3RyYWNlc187IH0KIAogICBib29sIEdlblRyYW5zYWN0aW9uTmFtZXMoKSBjb25zdCB7IHJldHVybiBnZW5fdHJhbnNhY3Rpb25fbmFtZXNfOyB9CkBAIC0xNzEsMTQgKzE5NCwxNSBAQAogICBUYXNrIHRhc2tfID0gVGFzazo6Q09NUElMRTsKICAgQ2hlY2tBcGlMZXZlbCBjaGVja19hcGlfbGV2ZWxfID0gQ2hlY2tBcGlMZXZlbDo6Q09NUEFUSUJMRTsKICAgc2V0PHN0cmluZz4gaW1wb3J0X2RpcnNfOwotICBzZXQ8c3RyaW5nPiBpbXBvcnRfZmlsZXNfOwogICB2ZWN0b3I8c3RyaW5nPiBwcmVwcm9jZXNzZWRfZmlsZXNfOwogICBzdHJpbmcgZGVwZW5kZW5jeV9maWxlXzsKKyAgYm9vbCBnZW5fcnBjXyA9IGZhbHNlOwogICBib29sIGdlbl90cmFjZXNfID0gZmFsc2U7CiAgIGJvb2wgZ2VuX3RyYW5zYWN0aW9uX25hbWVzXyA9IGZhbHNlOwogICBib29sIGRlcGVuZGVuY3lfZmlsZV9uaW5qYV8gPSBmYWxzZTsKICAgYm9vbCBzdHJ1Y3R1cmVkXyA9IGZhbHNlOwogICBTdGFiaWxpdHkgc3RhYmlsaXR5XyA9IFN0YWJpbGl0eTo6VU5TUEVDSUZJRUQ7CisgIHVpbnQzMl90IG1pbl9zZGtfdmVyc2lvbl8gPSAwOyAgLy8gaW52YWxpZCB2ZXJzaW9uCiAgIHN0cmluZyBvdXRwdXRfZGlyXzsKICAgc3RyaW5nIG91dHB1dF9oZWFkZXJfZGlyXzsKICAgYm9vbCBmYWlsX29uX3BhcmNlbGFibGVfID0gZmFsc2U7CkBAIC0xOTQsNiArMjE4LDcgQEAKIH07CiAKIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhPcHRpb25zOjpMYW5ndWFnZSBsYW5ndWFnZSk7CithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dWludDMyX3Q+IE1pblNka1ZlcnNpb25Gcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwogCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wdGlvbnNfdW5pdHRlc3QuY3BwIGIvb3B0aW9uc191bml0dGVzdC5jcHAKaW5kZXggOWYwNzQwMC4uMTEyMTQwMiAxMDA2NDQKLS0tIGEvb3B0aW9uc191bml0dGVzdC5jcHAKKysrIGIvb3B0aW9uc191bml0dGVzdC5jcHAKQEAgLTQ0NSw1ICs0NDUsNjQgQEAKICAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRlcnIoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCJVbnN1cHBvcnRlZCAtLWNoZWNrYXBpIGxldmVsOiAndW5rbm93biciKSk7CiB9CiAKK1RFU1QoT3B0aW9uc1Rlc3QsIEFjY2VwdFZhbGlkTWluU2RrVmVyc2lvbikgeworICBjb25zdCBjaGFyKiBhcmdzW10gPSB7CisgICAgICAiYWlkbCIsICItLWxhbmc9amF2YSIsICItLW1pbl9zZGtfdmVyc2lvbj0zMCIsICItLW91dD1vdXQiLCAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIGF1dG8gb3B0aW9ucyA9IEdldE9wdGlvbnMoYXJncyk7CisgIEVYUEVDVF9UUlVFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfRVEoMzB1LCBvcHRpb25zLT5HZXRNaW5TZGtWZXJzaW9uKCkpOworfQorCitURVNUKE9QdGlvbnNUZXN0cywgQWNjZXB0Q29kZU5hbWVBc01pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAiLS1sYW5nPWphdmEiLCAiLS1taW5fc2RrX3ZlcnNpb249VGlyYW1pc3UiLCAiLS1vdXQ9b3V0IiwgImlucHV0LmFpZGwiLCBudWxscHRyLAorICB9OworICBhdXRvIG9wdGlvbnMgPSBHZXRPcHRpb25zKGFyZ3MpOworICBFWFBFQ1RfVFJVRShvcHRpb25zLT5PaygpKTsKKyAgRVhQRUNUX0VRKDEwMDAwdSwgb3B0aW9ucy0+R2V0TWluU2RrVmVyc2lvbigpKTsKK30KKworVEVTVChPcHRpb25zVGVzdCwgRGVmYXVsdE1pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAiLS1sYW5nPWphdmEiLCAiLS1vdXQ9b3V0IiwgImlucHV0LmFpZGwiLCBudWxscHRyLAorICB9OworICBhdXRvIG9wdGlvbnMgPSBHZXRPcHRpb25zKGFyZ3MpOworICBFWFBFQ1RfVFJVRShvcHRpb25zLT5PaygpKTsKKyAgRVhQRUNUX0VRKERFRkFVTFRfU0RLX1ZFUlNJT05fSkFWQSwgb3B0aW9ucy0+R2V0TWluU2RrVmVyc2lvbigpKTsKK30KKworVEVTVChPcHRpb25zVGVzdCwgUmVqZWN0SW52YWxpZE1pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAiLS1sYW5nPWphdmEiLCAiLS1taW5fc2RrX3ZlcnNpb249Tk9UX0FfVkVSU0lPTiIsICItLW91dD1vdXQiLCAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gR2V0T3B0aW9ucyhhcmdzKTsKKyAgRVhQRUNUX0ZBTFNFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIkludmFsaWQgU0RLIHZlcnNpb246IE5PVF9BX1ZFUlNJT04iKSk7Cit9CisKK1RFU1QoT3B0aW9uc1Rlc3QsIFJlamVjdE9sZE1pblNka1ZlcnNpb24pIHsKKyAgY29uc3QgY2hhciogYXJnc1tdID0geworICAgICAgImFpZGwiLCAgICAgICAiLS1sYW5nPWNwcCIsICItLW1pbl9zZGtfdmVyc2lvbj0yMiIsICItLW91dD1vdXQiLCAiLS1oZWFkZXJfb3V0PW91dCIsCisgICAgICAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gR2V0T3B0aW9ucyhhcmdzKTsKKyAgRVhQRUNUX0ZBTFNFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIk1pbiBTREsgdmVyc2lvbiBzaG91bGQgYXQgbGVhc3QgYmUgMjMiKSk7Cit9CisKK1RFU1QoT3B0aW9uc1Rlc3QsIFJlamVjdFJwY09uT2xkU2RrVmVyc2lvbikgeworICBjb25zdCBjaGFyKiBhcmdzW10gPSB7CisgICAgICAiYWlkbCIsICItLWxhbmc9amF2YSIsICItLXJwYyIsICItLW1pbl9zZGtfdmVyc2lvbj0yMyIsICItLW91dD1vdXQiLCAiaW5wdXQuYWlkbCIsIG51bGxwdHIsCisgIH07CisgIENhcHR1cmVTdGRlcnIoKTsKKyAgYXV0byBvcHRpb25zID0gR2V0T3B0aW9ucyhhcmdzKTsKKyAgRVhQRUNUX0ZBTFNFKG9wdGlvbnMtPk9rKCkpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZGVycigpLAorICAgICAgICAgICAgICB0ZXN0aW5nOjpIYXNTdWJzdHIoIlJQQyBjb2RlIHJlcXVpcmVzIG1pbmltdW0gU0RLIHZlcnNpb24gb2YgYXQgbGVhc3QiKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcGFyc2VyLmNwcCBiL3BhcnNlci5jcHAKaW5kZXggNzIxOTc5Zi4uOTk4OGY1NiAxMDA2NDQKLS0tIGEvcGFyc2VyLmNwcAorKysgYi9wYXJzZXIuY3BwCkBAIC0xNSw2ICsxNSw5IEBACiAgKi8KIAogI2luY2x1ZGUgInBhcnNlci5oIgorCisjaW5jbHVkZSA8cXVldWU+CisKICNpbmNsdWRlICJhaWRsX2xhbmd1YWdlX3kuaCIKICNpbmNsdWRlICJsb2dnaW5nLmgiCiAKQEAgLTI1LDEzICsyOCwyMCBAQAogWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyKGNoYXIqLCBzaXplX3QsIHZvaWQqKTsKIHZvaWQgeXlfZGVsZXRlX2J1ZmZlcihZWV9CVUZGRVJfU1RBVEUsIHZvaWQqKTsKIAotc3RkOjp1bmlxdWVfcHRyPFBhcnNlcj4gUGFyc2VyOjpQYXJzZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmFpZGw6OklvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpIHsKK2NvbnN0IEFpZGxEb2N1bWVudCogUGFyc2VyOjpQYXJzZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6YWlkbDo6SW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbFR5cGVuYW1lcyYgdHlwZW5hbWVzLCBib29sIGlzX3ByZXByb2Nlc3NlZCkgeworICBhdXRvIGNsZWFuX3BhdGggPSBhbmRyb2lkOjphaWRsOjpJb0RlbGVnYXRlOjpDbGVhblBhdGgoZmlsZW5hbWUpOworICAvLyByZXVzZSBwcmUtcGFyc2VkIGRvY3VtZW50IGZyb20gdHlwZW5hbWVzCisgIGZvciAoYXV0byYgZG9jIDogdHlwZW5hbWVzLkFsbERvY3VtZW50cygpKSB7CisgICAgaWYgKGRvYy0+R2V0TG9jYXRpb24oKS5HZXRGaWxlKCkgPT0gY2xlYW5fcGF0aCkgeworICAgICAgcmV0dXJuIGRvYy5nZXQoKTsKKyAgICB9CisgIH0KICAgLy8gTWFrZSBzdXJlIHdlIGNhbiByZWFkIHRoZSBmaWxlIGZpcnN0LCBiZWZvcmUgdHJhc2hpbmcgcHJldmlvdXMgc3RhdGUuCi0gIHVuaXF1ZV9wdHI8c3RyaW5nPiByYXdfYnVmZmVyID0gaW9fZGVsZWdhdGUuR2V0RmlsZUNvbnRlbnRzKGZpbGVuYW1lKTsKKyAgdW5pcXVlX3B0cjxzdHJpbmc+IHJhd19idWZmZXIgPSBpb19kZWxlZ2F0ZS5HZXRGaWxlQ29udGVudHMoY2xlYW5fcGF0aCk7CiAgIGlmIChyYXdfYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICBBSURMX0VSUk9SKGZpbGVuYW1lKSA8PCAiRXJyb3Igd2hpbGUgb3BlbmluZyBmaWxlIGZvciBwYXJzaW5nIjsKKyAgICBBSURMX0VSUk9SKGNsZWFuX3BhdGgpIDw8ICJFcnJvciB3aGlsZSBvcGVuaW5nIGZpbGUgZm9yIHBhcnNpbmciOwogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKQEAgLTM5LDEzICs0OSwxOCBAQAogICAvLyBudWxscyBhdCB0aGUgZW5kLgogICByYXdfYnVmZmVyLT5hcHBlbmQoMnUsICdcMCcpOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxQYXJzZXI+IHBhcnNlcihuZXcgUGFyc2VyKGZpbGVuYW1lLCAqcmF3X2J1ZmZlciwgdHlwZW5hbWVzKSk7CisgIFBhcnNlciBwYXJzZXIoY2xlYW5fcGF0aCwgKnJhd19idWZmZXIsIGlzX3ByZXByb2Nlc3NlZCk7CiAKLSAgaWYgKHl5OjpwYXJzZXIocGFyc2VyLmdldCgpKS5wYXJzZSgpICE9IDAgfHwgcGFyc2VyLT5IYXNFcnJvcigpKSB7CisgIGlmICh5eTo6cGFyc2VyKCZwYXJzZXIpLnBhcnNlKCkgIT0gMCB8fCBwYXJzZXIuSGFzRXJyb3IoKSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKLSAgcmV0dXJuIHBhcnNlcjsKKyAgLy8gdHJhbnNmZXIgb3duZXJzaGlwIHRvIEFpZGxUeXBlbmFtZXMgYW5kIHJldHVybiB0aGUgcmF3IHBvaW50ZXIKKyAgY29uc3QgQWlkbERvY3VtZW50KiByZXN1bHQgPSBwYXJzZXIuZG9jdW1lbnRfLmdldCgpOworICBpZiAoIXR5cGVuYW1lcy5BZGREb2N1bWVudChzdGQ6Om1vdmUocGFyc2VyLmRvY3VtZW50XykpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdm9pZCBQYXJzZXI6OlNldFR5cGVQYXJhbWV0ZXJzKEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlLApAQCAtNjEsNjQgKzc2LDIwMSBAQAogICB9CiB9CiAKLWNsYXNzIENvbnN0YW50UmVmZXJlbmNlUmVzb2x2ZXIgOiBwdWJsaWMgQWlkbFZpc2l0b3IgewotIHB1YmxpYzoKLSAgQ29uc3RhbnRSZWZlcmVuY2VSZXNvbHZlcihjb25zdCBBaWRsRGVmaW5lZFR5cGUqIHNjb3BlLCBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVJlc29sdmVyJiByZXNvbHZlciwgYm9vbCogc3VjY2VzcykKLSAgICAgIDogc2NvcGVfKHNjb3BlKSwgdHlwZW5hbWVzXyh0eXBlbmFtZXMpLCByZXNvbHZlcl8ocmVzb2x2ZXIpLCBzdWNjZXNzXyhzdWNjZXNzKSB7fQotICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxDb25zdGFudFJlZmVyZW5jZSYgdikgb3ZlcnJpZGUgewotICAgIGlmIChJc0NpcmN1bGFyUmVmZXJlbmNlKCZ2KSkgewotICAgICAgKnN1Y2Nlc3NfID0gZmFsc2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQordm9pZCBQYXJzZXI6OkNoZWNrVmFsaWRUeXBlTmFtZShjb25zdCBBaWRsVG9rZW4mIHRva2VuLCBjb25zdCBBaWRsTG9jYXRpb24mIGxvYykgeworICBpZiAoIWlzX3ByZXByb2Nlc3NlZF8gJiYgdG9rZW4uR2V0VGV4dCgpLmZpbmQoJy4nKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIEFJRExfRVJST1IobG9jKSA8PCAiVHlwZSBuYW1lIGNhbid0IGJlIHF1YWxpZmllZC4gVXNlIGBwYWNrYWdlYC4iOworICAgIEFkZEVycm9yKCk7CisgIH0KK30KIAotICAgIGlmICh2LkdldFJlZlR5cGUoKSAmJiAhdi5HZXRSZWZUeXBlKCktPklzUmVzb2x2ZWQoKSkgewotICAgICAgaWYgKCFyZXNvbHZlcl8odHlwZW5hbWVzXy5HZXREb2N1bWVudEZvcihzY29wZV8pLCB2LkdldFJlZlR5cGUoKS5nZXQoKSkpIHsKLSAgICAgICAgQUlETF9FUlJPUih2LkdldFJlZlR5cGUoKSkgPDwgIlVua25vd24gdHlwZSAnIiA8PCB2LkdldFJlZlR5cGUoKS0+R2V0TmFtZSgpIDw8ICInIjsKLSAgICAgICAgKnN1Y2Nlc3NfID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgUGFyc2VyOjpTZXRQYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlKSB7CisgIGlmIChpc19wcmVwcm9jZXNzZWRfKSB7CisgICAgQUlETF9FUlJPUihwYWNrYWdlKSA8PCAiUHJlcHJvY2Vzc2VkIGZpbGUgY2FuJ3QgZGVjbGFyZSBwYWNrYWdlLiI7CisgICAgQWRkRXJyb3IoKTsKKyAgfQorICBwYWNrYWdlXyA9IHBhY2thZ2U7Cit9CisKK2Jvb2wgQ2hlY2tOb1JlY3Vyc2l2ZURlZmluaXRpb24oY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgc3RydWN0IFZpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgICAgZW51bSB7CisgICAgICBOT1RfU1RBUlRFRCA9IDAsCisgICAgICBTVEFSVEVEID0gMSwKKyAgICAgIEZJTklTSEVEID0gMiwKKyAgICB9OworICAgIHN0ZDo6bWFwPGNvbnN0IEFpZGxQYXJjZWxhYmxlKiwgaW50PiB2aXNpdGVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRoOworICAgIGJvb2wgZm91bmRfY3ljbGUgPSBmYWxzZTsKKworICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFN0cnVjdHVyZWRQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7IEZpbmRDeWNsZSgmdCk7IH0KKyAgICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxVbmlvbkRlY2wmIHQpIG92ZXJyaWRlIHsgRmluZEN5Y2xlKCZ0KTsgfQorICAgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFBhcmNlbGFibGUmIHQpIG92ZXJyaWRlIHsgRmluZEN5Y2xlKCZ0KTsgfQorCisgICAgYm9vbCBGaW5kQ3ljbGUoY29uc3QgQWlkbFBhcmNlbGFibGUqIHApIHsKKyAgICAgIC8vIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIKKyAgICAgIGlmIChmb3VuZF9jeWNsZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KKyAgICAgIC8vIHdlIGp1c3QgZm91bmQgYSBjeWNsZQorICAgICAgaWYgKHZpc2l0ZWRbcF0gPT0gU1RBUlRFRCkgeworICAgICAgICBwYXRoLnB1c2hfYmFjayhwLT5HZXROYW1lKCkpOworICAgICAgICBBSURMX0VSUk9SKHApIDw8IHAtPkdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgYSByZWN1cnNpdmUgcGFyY2VsYWJsZTogIiA8PCBhbmRyb2lkOjpiYXNlOjpKb2luKHBhdGgsICItPiIpOworICAgICAgICByZXR1cm4gKGZvdW5kX2N5Y2xlID0gdHJ1ZSk7CisgICAgICB9CisgICAgICAvLyB3ZSBhcnJpdmVkIGhlcmUgd2l0aCBhIGRpZmZlcmVudCByb3V0ZS4KKyAgICAgIGlmICh2aXNpdGVkW3BdID09IEZJTklTSEVEKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIHN0YXJ0IERGUworICAgICAgdmlzaXRlZFtwXSA9IFNUQVJURUQ7CisgICAgICBwYXRoLnB1c2hfYmFjayhwLT5HZXROYW1lKCkpOworICAgICAgZm9yIChjb25zdCBhdXRvJiBmIDogcC0+R2V0RmllbGRzKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgcmVmID0gZi0+R2V0VHlwZSgpOworICAgICAgICBpZiAoIXJlZi5Jc0FycmF5KCkgJiYgIXJlZi5Jc0hlYXBOdWxsYWJsZSgpKSB7CisgICAgICAgICAgY29uc3QgYXV0byYgdHlwZSA9IHJlZi5HZXREZWZpbmVkVHlwZSgpOworICAgICAgICAgIGlmICh0eXBlICYmIHR5cGUtPkFzUGFyY2VsYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoRmluZEN5Y2xlKHR5cGUtPkFzUGFyY2VsYWJsZSgpKSkgeworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBhdGgucG9wX2JhY2soKTsKKyAgICAgIHZpc2l0ZWRbcF0gPSBGSU5JU0hFRDsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgY29uc3QgQWlkbENvbnN0YW50VmFsdWUqIHJlc29sdmVkID0gdi5SZXNvbHZlKHNjb3BlXyk7Ci0gICAgaWYgKCFyZXNvbHZlZCkgewotICAgICAgQUlETF9FUlJPUih2KSA8PCAiVW5rbm93biByZWZlcmVuY2UgJyIgPDwgdi5MaXRlcmFsKCkgPDwgIiciOwotICAgICAgKnN1Y2Nlc3NfID0gZmFsc2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQorICB9IHY7CisgIFZpc2l0VG9wRG93bih2LCBub2RlKTsKKyAgcmV0dXJuICF2LmZvdW5kX2N5Y2xlOworfQogCi0gICAgLy8gcmVzb2x2ZSByZWN1cnNpdmUgcmVmZXJlbmNlcwotICAgIFB1c2goJnYpOwotICAgIFZpc2l0VG9wRG93bigqdGhpcywgKnJlc29sdmVkKTsKLSAgICBQb3AoKTsKKy8vIEVhY2ggVmlzaXQqKCkgbWV0aG9kIGNhbiB1c2UgU2NvcGUoKSB0byBnZXQgaXRzIHNjb3BlKEFpZGxEZWZpbmVkVHlwZSkKK2NsYXNzIFNjb3BlZFZpc2l0b3IgOiBwdWJsaWMgQWlkbFZpc2l0b3IgeworIHByb3RlY3RlZDoKKyAgY29uc3QgQWlkbERlZmluZWRUeXBlKiBTY29wZSgpIGNvbnN0IHsKKyAgICBBSURMX0ZBVEFMX0lGKHNjb3BlXy5lbXB0eSgpLCBBSURMX0xPQ0FUSU9OX0hFUkUpIDw8ICJTY29wZSBpcyBlbXB0eSI7CisgICAgcmV0dXJuIHNjb3BlXy5iYWNrKCk7CisgIH0KKyAgdm9pZCBQdXNoU2NvcGUoY29uc3QgQWlkbERlZmluZWRUeXBlKiBzY29wZSkgeyBzY29wZV8ucHVzaF9iYWNrKHNjb3BlKTsgfQorICB2b2lkIFBvcFNjb3BlKCkgeyBzY29wZV8ucG9wX2JhY2soKTsgfQorICAvLyBLZWVwIHVzZXIgZGVmaW5lZCB0eXBlIGFzIGEgZGVmaW5pbmcgc2NvcGUKKyAgdm9pZCBWaXNpdFNjb3BlZFRvcERvd24oY29uc3QgQWlkbE5vZGUmIG5vZGUpIHsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQWlkbE5vZGUmKT4gdG9wX2Rvd24gPSBbJl0oY29uc3QgQWlkbE5vZGUmIGEpIHsKKyAgICAgIGEuRGlzcGF0Y2hWaXNpdCgqdGhpcyk7CisgICAgICBhdXRvIGRlZmluZWRfdHlwZSA9IEFpZGxDYXN0PEFpZGxEZWZpbmVkVHlwZT4oYSk7CisgICAgICBpZiAoZGVmaW5lZF90eXBlKSBQdXNoU2NvcGUoZGVmaW5lZF90eXBlKTsKKyAgICAgIGEuVHJhdmVyc2VDaGlsZHJlbih0b3BfZG93bik7CisgICAgICBpZiAoZGVmaW5lZF90eXBlKSBQb3BTY29wZSgpOworICAgIH07CisgICAgdG9wX2Rvd24obm9kZSk7CiAgIH0KIAogIHByaXZhdGU6Ci0gIHN0cnVjdCBTdGFja0VsZW0gewotICAgIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogc2NvcGU7Ci0gICAgY29uc3QgQWlkbENvbnN0YW50UmVmZXJlbmNlKiByZWY7Ci0gIH07CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEFpZGxEZWZpbmVkVHlwZSo+IHNjb3BlXyA9IHt9OworfTsKIAotICB2b2lkIFB1c2goY29uc3QgQWlkbENvbnN0YW50UmVmZXJlbmNlKiByZWYpIHsKLSAgICBzdGFja18ucHVzaF9iYWNrKHtzY29wZV8sIHJlZn0pOwotICAgIGlmIChyZWYtPkdldFJlZlR5cGUoKSkgewotICAgICAgc2NvcGVfID0gcmVmLT5HZXRSZWZUeXBlKCktPkdldERlZmluZWRUeXBlKCk7CitjbGFzcyBUeXBlUmVmZXJlbmNlUmVzb2x2ZXIgOiBwdWJsaWMgU2NvcGVkVmlzaXRvciB7CisgcHVibGljOgorICBUeXBlUmVmZXJlbmNlUmVzb2x2ZXIoVHlwZVJlc29sdmVyJiByZXNvbHZlcikgOiByZXNvbHZlcl8ocmVzb2x2ZXIpIHt9CisKKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsVHlwZVNwZWNpZmllciYgdCkgb3ZlcnJpZGUgeworICAgIC8vIFdlJ3JlIHZpc2l0aW5nIHRoZSBzYW1lIG5vZGUgYWdhaW4uIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHR3byBjb25zdGFudCByZWZlcmVuY2VzCisgICAgLy8gcG9pbnQgdG8gYW4gYW5jZXN0b3Igb2YgdGhpcyBub2RlLgorICAgIGlmICh0LklzUmVzb2x2ZWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBaWRsVHlwZVNwZWNpZmllciYgdHlwZSA9IGNvbnN0X2Nhc3Q8QWlkbFR5cGVTcGVjaWZpZXImPih0KTsKKyAgICBpZiAoIXJlc29sdmVyXyhTY29wZSgpLCAmdHlwZSkpIHsKKyAgICAgIEFJRExfRVJST1IodHlwZSkgPDwgIkZhaWxlZCB0byByZXNvbHZlICciIDw8IHR5cGUuR2V0VW5yZXNvbHZlZE5hbWUoKSA8PCAiJyI7CisgICAgICBzdWNjZXNzXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluIGNhc2UgYSBuZXcgZG9jdW1lbnQgaXMgaW1wb3J0ZWQgZm9yIHRoZSB0eXBlIHJlZmVyZW5jZSwgZW5xdWV1ZSBpdCBmb3IgdHlwZSByZXNvbHV0aW9uLgorICAgIGF1dG8gcmVzb2x2ZWQgPSB0LkdldERlZmluZWRUeXBlKCk7CisgICAgaWYgKHJlc29sdmVkKSB7CisgICAgICBxdWV1ZV8ucHVzaCgmcmVzb2x2ZWQtPkdldERvY3VtZW50KCkpOwogICAgIH0KICAgfQogCi0gIHZvaWQgUG9wKCkgewotICAgIHNjb3BlXyA9IHN0YWNrXy5iYWNrKCkuc2NvcGU7CisgIGJvb2wgUmVzb2x2ZShjb25zdCBBaWRsRG9jdW1lbnQmIGRvY3VtZW50KSB7CisgICAgcXVldWVfLnB1c2goJmRvY3VtZW50KTsKKyAgICB3aGlsZSAoIXF1ZXVlXy5lbXB0eSgpKSB7CisgICAgICBhdXRvIGRvYyA9IHF1ZXVlXy5mcm9udCgpOworICAgICAgcXVldWVfLnBvcCgpOworICAgICAgLy8gU2tpcCB0aGUgZG9jIGlmIGl0J3MgdmlzaXRlZCBhbHJlYWR5LgorICAgICAgaWYgKCF2aXNpdGVkXy5pbnNlcnQoZG9jKS5zZWNvbmQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBWaXNpdFNjb3BlZFRvcERvd24oKmRvYyk7CisgICAgfQorICAgIHJldHVybiBzdWNjZXNzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgVHlwZVJlc29sdmVyJiByZXNvbHZlcl87CisgIGJvb2wgc3VjY2Vzc18gPSB0cnVlOworICBzdGQ6OnF1ZXVlPGNvbnN0IEFpZGxEb2N1bWVudCo+IHF1ZXVlXyA9IHt9OworICBzdGQ6OnNldDxjb25zdCBBaWRsRG9jdW1lbnQqPiB2aXNpdGVkXyA9IHt9OworfTsKKworY2xhc3MgQ29uc3RhbnRSZWZlcmVuY2VSZXNvbHZlciA6IHB1YmxpYyBTY29wZWRWaXNpdG9yIHsKKyBwdWJsaWM6CisgIENvbnN0YW50UmVmZXJlbmNlUmVzb2x2ZXIoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsQ29uc3RhbnRSZWZlcmVuY2UmIHYpIG92ZXJyaWRlIHsKKyAgICBpZiAoSXNDaXJjdWxhclJlZmVyZW5jZSgmdikpIHsKKyAgICAgIHN1Y2Nlc3NfID0gZmFsc2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgQWlkbENvbnN0YW50VmFsdWUqIHJlc29sdmVkID0gdi5SZXNvbHZlKFNjb3BlKCkpOworICAgIGlmICghcmVzb2x2ZWQpIHsKKyAgICAgIEFJRExfRVJST1IodikgPDwgIlVua25vd24gcmVmZXJlbmNlICciIDw8IHYuTGl0ZXJhbCgpIDw8ICInIjsKKyAgICAgIHN1Y2Nlc3NfID0gZmFsc2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT24gZXJyb3IsIHNraXAgcmVjdXJzaXZlIHZpc2l0aW5nIHRvIGF2b2lkIHJlZHVuZGFudCBtZXNzYWdlcworICAgIGlmICghc3VjY2Vzc18pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gcmVzb2x2ZSByZWN1cnNpdmUgcmVmZXJlbmNlcworICAgIFB1c2hDb25zdFJlZigmdik7CisgICAgVmlzaXRTY29wZWRUb3BEb3duKCpyZXNvbHZlZCk7CisgICAgUG9wQ29uc3RSZWYoKTsKKyAgfQorCisgIGJvb2wgUmVzb2x2ZShjb25zdCBBaWRsRG9jdW1lbnQmIGRvY3VtZW50KSB7CisgICAgVmlzaXRTY29wZWRUb3BEb3duKGRvY3VtZW50KTsKKyAgICByZXR1cm4gc3VjY2Vzc187CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgUHVzaENvbnN0UmVmKGNvbnN0IEFpZGxDb25zdGFudFJlZmVyZW5jZSogcmVmKSB7CisgICAgc3RhY2tfLnB1c2hfYmFjayhyZWYpOworICAgIGlmIChyZWYtPkdldFJlZlR5cGUoKSkgeworICAgICAgUHVzaFNjb3BlKHJlZi0+R2V0UmVmVHlwZSgpLT5HZXREZWZpbmVkVHlwZSgpKTsKKyAgICB9CisgIH0KKworICB2b2lkIFBvcENvbnN0UmVmKCkgeworICAgIGlmIChzdGFja18uYmFjaygpLT5HZXRSZWZUeXBlKCkpIHsKKyAgICAgIFBvcFNjb3BlKCk7CisgICAgfQogICAgIHN0YWNrXy5wb3BfYmFjaygpOwogICB9CiAKICAgYm9vbCBJc0NpcmN1bGFyUmVmZXJlbmNlKGNvbnN0IEFpZGxDb25zdGFudFJlZmVyZW5jZSogcmVmKSB7Ci0gICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihzdGFja18uYmVnaW4oKSwgc3RhY2tfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKGNvbnN0IGF1dG8mIGVsZW0pIHsgcmV0dXJuIGVsZW0ucmVmID09IHJlZjsgfSk7CisgICAgYXV0byBpdCA9CisgICAgICAgIHN0ZDo6ZmluZF9pZihzdGFja18uYmVnaW4oKSwgc3RhY2tfLmVuZCgpLCBbJl0oY29uc3QgYXV0byYgZWxlbSkgeyByZXR1cm4gZWxlbSA9PSByZWY7IH0pOwogICAgIGlmIChpdCA9PSBzdGFja18uZW5kKCkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhdGg7CiAgICAgd2hpbGUgKGl0ICE9IHN0YWNrXy5lbmQoKSkgewotICAgICAgcGF0aC5wdXNoX2JhY2soaXQtPnJlZi0+TGl0ZXJhbCgpKTsKKyAgICAgIHBhdGgucHVzaF9iYWNrKCgqaXQpLT5MaXRlcmFsKCkpOwogICAgICAgKytpdDsKICAgICB9CiAgICAgcGF0aC5wdXNoX2JhY2socmVmLT5MaXRlcmFsKCkpOwpAQCAtMTI2LDM1ICsyNzgsMjggQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIGNvbnN0IEFpZGxEZWZpbmVkVHlwZSogc2NvcGVfOwotICBjb25zdCBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXNfOwotICBUeXBlUmVzb2x2ZXImIHJlc29sdmVyXzsKLSAgYm9vbCogc3VjY2Vzc187Ci0gIHN0ZDo6dmVjdG9yPFN0YWNrRWxlbT4gc3RhY2tfID0ge307CisgIGJvb2wgc3VjY2Vzc18gPSB0cnVlOworICBzdGQ6OnZlY3Rvcjxjb25zdCBBaWRsQ29uc3RhbnRSZWZlcmVuY2UqPiBzdGFja18gPSB7fTsKIH07CiAKLWJvb2wgUGFyc2VyOjpSZXNvbHZlKFR5cGVSZXNvbHZlciYgdHlwZV9yZXNvbHZlcikgewotICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotICBmb3IgKEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlc3BlYyA6IHVucmVzb2x2ZWRfdHlwZXNwZWNzXykgewotICAgIGlmICghdHlwZV9yZXNvbHZlcihkb2N1bWVudF8sIHR5cGVzcGVjKSkgewotICAgICAgQUlETF9FUlJPUih0eXBlc3BlYykgPDwgIkZhaWxlZCB0byByZXNvbHZlICciIDw8IHR5cGVzcGVjLT5HZXRVbnJlc29sdmVkTmFtZSgpIDw8ICInIjsKLSAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIC8vIGRvbid0IHN0b3AgdG8gc2hvdyBtb3JlIGVycm9ycyBpZiBhbnkKLSAgICB9CisvLyBSZXNvbHZlIHJlZmVyZW5jZXModHlwZXMvY29uc3RhbnRzKSBpbiB0aGUgIm1haW4iIGRvY3VtZW50LgorYm9vbCBSZXNvbHZlUmVmZXJlbmNlcyhjb25zdCBBaWRsRG9jdW1lbnQmIGRvY3VtZW50LCBUeXBlUmVzb2x2ZXImIHR5cGVfcmVzb2x2ZXIpIHsKKyAgLy8gVHlwZXMgYXJlIHJlc29sdmVkIGZpcnN0IGJlZm9yZSByZXNvbHZpbmcgY29uc3RhbnQgcmVmZXJlbmNlcyBzbyB0aGF0IGV2ZXJ5IHJlZmVyZW5jZWQgZG9jdW1lbnQKKyAgLy8gZ2V0cyBpbXBvcnRlZC4KKyAgaWYgKCFUeXBlUmVmZXJlbmNlUmVzb2x2ZXIodHlwZV9yZXNvbHZlcikuUmVzb2x2ZShkb2N1bWVudCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQotICAvLyByZXNvbHZlICJmaWVsZCByZWZlcmVuY2VzIiBhcyB3ZWxsLgotICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiBkb2N1bWVudF8tPkRlZmluZWRUeXBlcygpKSB7Ci0gICAgQ29uc3RhbnRSZWZlcmVuY2VSZXNvbHZlciByZWZfcmVzb2x2ZXJ7dHlwZS5nZXQoKSwgdHlwZW5hbWVzXywgdHlwZV9yZXNvbHZlciwgJnN1Y2Nlc3N9OwotICAgIFZpc2l0VG9wRG93bihyZWZfcmVzb2x2ZXIsICp0eXBlKTsKKyAgaWYgKCFDb25zdGFudFJlZmVyZW5jZVJlc29sdmVyKCkuUmVzb2x2ZShkb2N1bWVudCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQotICByZXR1cm4gc3VjY2VzczsKKyAgaWYgKCFDaGVja05vUmVjdXJzaXZlRGVmaW5pdGlvbihkb2N1bWVudCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CiB9CiAKLVBhcnNlcjo6UGFyc2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgc3RkOjpzdHJpbmcmIHJhd19idWZmZXIsCi0gICAgICAgICAgICAgICBhbmRyb2lkOjphaWRsOjpBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpCi0gICAgOiBmaWxlbmFtZV8oZmlsZW5hbWUpLCB0eXBlbmFtZXNfKHR5cGVuYW1lcykgeworUGFyc2VyOjpQYXJzZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBzdGQ6OnN0cmluZyYgcmF3X2J1ZmZlciwgYm9vbCBpc19wcmVwcm9jZXNzZWQpCisgICAgOiBmaWxlbmFtZV8oZmlsZW5hbWUpLCBpc19wcmVwcm9jZXNzZWRfKGlzX3ByZXByb2Nlc3NlZCkgewogICB5eWxleF9pbml0KCZzY2FubmVyXyk7CiAgIGJ1ZmZlcl8gPSB5eV9zY2FuX2J1ZmZlcigmcmF3X2J1ZmZlclswXSwgcmF3X2J1ZmZlci5sZW5ndGgoKSwgc2Nhbm5lcl8pOwogfQpAQCAtMTYzLDMgKzMwOCwxMSBAQAogICB5eV9kZWxldGVfYnVmZmVyKGJ1ZmZlcl8sIHNjYW5uZXJfKTsKICAgeXlsZXhfZGVzdHJveShzY2FubmVyXyk7CiB9CisKK3ZvaWQgUGFyc2VyOjpNYWtlRG9jdW1lbnQoY29uc3QgQWlkbExvY2F0aW9uJiBsb2NhdGlvbiwgY29uc3QgQ29tbWVudHMmIGNvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW1wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxEZWZpbmVkVHlwZT4+IGRlZmluZWRfdHlwZXMpIHsKKyAgQUlETF9GQVRBTF9JRihkb2N1bWVudF8uZ2V0KCksIGxvY2F0aW9uKTsKKyAgZG9jdW1lbnRfID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsRG9jdW1lbnQ+KGxvY2F0aW9uLCBjb21tZW50cywgc3RkOjptb3ZlKGltcG9ydHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRlZmluZWRfdHlwZXMpLCBpc19wcmVwcm9jZXNzZWRfKTsKK30KZGlmZiAtLWdpdCBhL3BhcnNlci5oIGIvcGFyc2VyLmgKaW5kZXggZTJkZWEwOC4uMDc0ZDZkNSAxMDA2NDQKLS0tIGEvcGFyc2VyLmgKKysrIGIvcGFyc2VyLmgKQEAgLTU0LDcgKzU0LDggQEAKICAgYW5kcm9pZDo6YWlkbDo6Q29tbWVudHMgY29tbWVudHNfOwogfTsKIAotdXNpbmcgVHlwZVJlc29sdmVyID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEFpZGxEb2N1bWVudCosIEFpZGxUeXBlU3BlY2lmaWVyKik+OwordXNpbmcgVHlwZVJlc29sdmVyID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEFpZGxEZWZpbmVkVHlwZSosIEFpZGxUeXBlU3BlY2lmaWVyKik+OworYm9vbCBSZXNvbHZlUmVmZXJlbmNlcyhjb25zdCBBaWRsRG9jdW1lbnQmIGRvY3VtZW50LCBUeXBlUmVzb2x2ZXImIHJlc29sdmVyKTsKIAogY2xhc3MgUGFyc2VyIHsKICBwdWJsaWM6CkBAIC02NSw5ICs2Niw5IEBACiAgIH5QYXJzZXIoKTsKIAogICAvLyBQYXJzZSBjb250ZW50cyBvZiBmaWxlIHxmaWxlbmFtZXwuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBhcnNlcj4gUGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6YWlkbDo6SW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMpOworICBzdGF0aWMgY29uc3QgQWlkbERvY3VtZW50KiBQYXJzZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmFpZGw6OklvRGVsZWdhdGUmIGlvX2RlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXMsIGJvb2wgaXNfcHJlcHJvY2Vzc2VkID0gZmFsc2UpOwogCiAgIHZvaWQgQWRkRXJyb3IoKSB7IGVycm9yXysrOyB9CiAgIGJvb2wgSGFzRXJyb3IoKSBjb25zdCB7IHJldHVybiBlcnJvcl8gIT0gMDsgfQpAQCAtODQsNDMgKzg1LDI1IEBACiAgIHZvaWQgU2V0VHlwZVBhcmFtZXRlcnMoQWlkbFR5cGVTcGVjaWZpZXIqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFpZGxUeXBlU3BlY2lmaWVyPj4qIHR5cGVfYXJncyk7CiAKLSAgdm9pZCBTZXRQYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlKSB7IHBhY2thZ2VfID0gcGFja2FnZTsgfQorICAvLyBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lcyBhcmUgYWxsb3dlZCBvbmx5IGluIHByZXByb2Nlc3NlZCBmaWxlcworICB2b2lkIENoZWNrVmFsaWRUeXBlTmFtZShjb25zdCBBaWRsVG9rZW4mIHRva2VuLCBjb25zdCBBaWRsTG9jYXRpb24mIGxvYyk7CisKKyAgdm9pZCBTZXRQYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcmIFBhY2thZ2UoKSBjb25zdCB7IHJldHVybiBwYWNrYWdlXzsgfQogCi0gIHZvaWQgRGVmZXJSZXNvbHV0aW9uKEFpZGxUeXBlU3BlY2lmaWVyKiB0eXBlc3BlYykgewotICAgIHVucmVzb2x2ZWRfdHlwZXNwZWNzXy5lbXBsYWNlX2JhY2sodHlwZXNwZWMpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPEFpZGxUeXBlU3BlY2lmaWVyKj4mIEdldFVucmVzb2x2ZWRUeXBlc3BlY3MoKSBjb25zdCB7IHJldHVybiB1bnJlc29sdmVkX3R5cGVzcGVjc187IH0KLQotICBib29sIFJlc29sdmUoVHlwZVJlc29sdmVyJiB0eXBlX3Jlc29sdmVyKTsKLSAgdm9pZCBTZXREb2N1bWVudChzdGQ6OnVuaXF1ZV9wdHI8QWlkbERvY3VtZW50PiYmIGRvY3VtZW50KSB7Ci0gICAgLy8gVGhlIHBhcnNlZCBkb2N1bWVudCBpcyBvd25lZCBieSB0eXBlbmFtZXNfLiBUaGlzIHBhcnNlciBvYmplY3Qgb25seSBoYXMKLSAgICAvLyBhIHJlZmVyZW5jZSB0byBpdC4KLSAgICBkb2N1bWVudF8gPSBkb2N1bWVudC5nZXQoKTsKLSAgICBpZiAoIXR5cGVuYW1lc18uQWRkRG9jdW1lbnQoc3RkOjptb3ZlKGRvY3VtZW50KSkpIHsKLSAgICAgIGRvY3VtZW50XyA9IG51bGxwdHI7Ci0gICAgICBBZGRFcnJvcigpOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IEFpZGxEb2N1bWVudCYgUGFyc2VkRG9jdW1lbnQoKSBjb25zdCB7Ci0gICAgQUlETF9GQVRBTF9JRihIYXNFcnJvcigpLCBGaWxlTmFtZSgpKTsKLSAgICByZXR1cm4gKmRvY3VtZW50XzsKLSAgfQorICB2b2lkIE1ha2VEb2N1bWVudChjb25zdCBBaWRsTG9jYXRpb24mIGxvY2F0aW9uLCBjb25zdCBDb21tZW50cyYgY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbXBvcnRzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWlkbERlZmluZWRUeXBlPj4gZGVmaW5lZF90eXBlcyk7CiAKICBwcml2YXRlOgotICBleHBsaWNpdCBQYXJzZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBzdGQ6OnN0cmluZyYgcmF3X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmFpZGw6OkFpZGxUeXBlbmFtZXMmIHR5cGVuYW1lcyk7CisgIGV4cGxpY2l0IFBhcnNlcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIHN0ZDo6c3RyaW5nJiByYXdfYnVmZmVyLCBib29sIGlzX3ByZXByb2Nlc3NlZCk7CiAKICAgc3RkOjpzdHJpbmcgZmlsZW5hbWVfOworICBib29sIGlzX3ByZXByb2Nlc3NlZF87CiAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfOwotICBBaWRsVHlwZW5hbWVzJiB0eXBlbmFtZXNfOwotCiAgIHZvaWQqIHNjYW5uZXJfID0gbnVsbHB0cjsKICAgWVlfQlVGRkVSX1NUQVRFIGJ1ZmZlcl87CiAgIGludCBlcnJvcl8gPSAwOwogCi0gIHZlY3RvcjxBaWRsVHlwZVNwZWNpZmllcio+IHVucmVzb2x2ZWRfdHlwZXNwZWNzXzsKLSAgY29uc3QgQWlkbERvY3VtZW50KiBkb2N1bWVudF87CisgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsRG9jdW1lbnQ+IGRvY3VtZW50XzsKIH07CmRpZmYgLS1naXQgYS9wZXJtaXNzaW9uLmNwcCBiL3Blcm1pc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Y2ZmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wZXJtaXNzaW9uLmNwcApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBlcm1pc3Npb24uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZhcmlhbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHBlcm0geworCitzdGQ6OnN0cmluZyBBc0phdmFBbm5vdGF0aW9uKGNvbnN0IEV4cHJlc3Npb24mIGV4cHIpIHsKKyAgaWYgKGNvbnN0IGF1dG8mIHMgPSBzdGQ6OmdldF9pZjxzdGQ6OnN0cmluZz4oJmV4cHIpOyBzKSB7CisgICAgcmV0dXJuIEphdmFBbm5vdGF0aW9uKCpzKTsKKyAgfQorICBpZiAoY29uc3QgYXV0byYgYWxsID0gc3RkOjpnZXRfaWY8QWxsT2Y+KCZleHByKTsgYWxsKSB7CisgICAgcmV0dXJuIGFsbC0+SmF2YUFubm90YXRpb24oKTsKKyAgfQorICBpZiAoY29uc3QgYXV0byYgYW55ID0gc3RkOjpnZXRfaWY8QW55T2Y+KCZleHByKTsgYW55KSB7CisgICAgcmV0dXJuIGFueS0+SmF2YUFubm90YXRpb24oKTsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKK3N0ZDo6c3RyaW5nIEphdmFBbm5vdGF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXNzaW9uKSB7CisgIHJldHVybiAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLiIgKyBwZXJtaXNzaW9uOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVybQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9wZXJtaXNzaW9uLmggYi9wZXJtaXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4N2Q1YwotLS0gL2Rldi9udWxsCisrKyBiL3Blcm1pc3Npb24uaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZhcmlhbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHBlcm0geworCitzdHJ1Y3QgQW55T2Y7CitzdHJ1Y3QgQWxsT2Y7CisKK3R5cGVkZWYgc3RkOjp2YXJpYW50PHN0ZDo6c3RyaW5nLCBBbnlPZiwgQWxsT2Y+IEV4cHJlc3Npb247CitzdGQ6OnN0cmluZyBBc0phdmFBbm5vdGF0aW9uKGNvbnN0IEV4cHJlc3Npb24mIGV4cHIpOworc3RkOjpzdHJpbmcgSmF2YUFubm90YXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHBlcm1pc3Npb24pOworCitzdHJ1Y3QgQW55T2YgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3BlcmFuZHM7CisKKyAgc3RkOjpzdHJpbmcgSmF2YUFubm90YXRpb24oKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0KCJhbnlPZiA9IHsiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZXJhbmRzLnNpemUoKTsgaSsrKSB7CisgICAgICByZXQgKz0gYW5kcm9pZDo6YWlkbDo6cGVybTo6SmF2YUFubm90YXRpb24ob3BlcmFuZHNbaV0pOworICAgICAgaWYgKGkgIT0gb3BlcmFuZHMuc2l6ZSgpIC0gMSkgeworICAgICAgICByZXQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldCArICJ9IjsKKyAgfQorfTsKKworc3RydWN0IEFsbE9mIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9wZXJhbmRzOworCisgIHN0ZDo6c3RyaW5nIEphdmFBbm5vdGF0aW9uKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCgiYWxsT2YgPSB7Iik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVyYW5kcy5zaXplKCk7IGkrKykgeworICAgICAgcmV0ICs9IGFuZHJvaWQ6OmFpZGw6OnBlcm06OkphdmFBbm5vdGF0aW9uKG9wZXJhbmRzW2ldKTsKKyAgICAgIGlmIChpICE9IG9wZXJhbmRzLnNpemUoKSAtIDEpIHsKKyAgICAgICAgcmV0ICs9ICIsICI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQgKyAifSI7CisgIH0KK307CisKKworCit9ICAvLyBuYW1lc3BhY2UgcGVybQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9wcmVwcm9jZXNzLmNwcCBiL3ByZXByb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzJmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmVwcm9jZXNzLmNwcApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJwcmVwcm9jZXNzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorCisjaW5jbHVkZSAiYWlkbC5oIgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpKb2luOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CisKK25hbWVzcGFjZSB7CisvLyBQcmVwcm9jZXNzVmlzaXRvciBlbWl0cworLy8gLSB0eXBlcyBpbmNsdWRpbmcgY29tbWVudHMoaGlkZS9kZXByZWNhdGVkKSBhbmQgYW5ub3RhdGlvbnMKKy8vIC0gY29uc3RhbnQgZGVsY2FyYXRpb25zIGZvciBpbnRlcmZhY2UvcGFyY2VsYWJsZS91bmlvbnMKKy8vIC0gZW51bWVyYXRvcnMgZm9yIGVudW1zCitzdHJ1Y3QgUHJlcHJvY2Vzc1Zpc2l0b3IgOiBBaWRsVmlzaXRvciB7CisgIENvZGVXcml0ZXImIG91dDsKKyAgUHJlcHJvY2Vzc1Zpc2l0b3IoQ29kZVdyaXRlciYgb3V0KSA6IG91dChvdXQpIHt9CisKKyAgdm9pZCBEdW1wVHlwZShjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGR0LCBjb25zdCBzdHJpbmcmIHR5cGUpIHsKKyAgICBEdW1wQ29tbWVudHMoZHQpOworICAgIER1bXBBbm5vdGF0aW9ucyhkdCk7CisgICAgLy8gVG9wLWxldmVsIGRlZmluaXRpb24gZW1pdHMgY2Fub25pY2FsIG5hbWUgd2hpbGUgbmVzdGVkIHR5cGUgZW1pdHMgIm5hbWUiIG9ubHkuCisgICAgaWYgKGR0LkdldFBhcmVudFR5cGUoKSkgeworICAgICAgb3V0IDw8IHR5cGUgPDwgIiAiIDw8IGR0LkdldE5hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHR5cGUgPDwgIiAiIDw8IGR0LkdldENhbm9uaWNhbE5hbWUoKTsKKyAgICB9CisgICAgaWYgKGF1dG8gZ2VuZXJpY190eXBlID0gZHQuQXNQYXJhbWV0ZXJpemFibGUoKTsgZ2VuZXJpY190eXBlICYmIGdlbmVyaWNfdHlwZS0+SXNHZW5lcmljKCkpIHsKKyAgICAgIG91dCA8PCAiPCIgPDwgSm9pbihnZW5lcmljX3R5cGUtPkdldFR5cGVQYXJhbWV0ZXJzKCksICIsICIpIDw8ICI+IjsKKyAgICB9CisgIH0KKyAgdm9pZCBEdW1wTWVtYmVycyhjb25zdCBBaWRsRGVmaW5lZFR5cGUmIGR0KSB7CisgICAgb3V0IDw8ICIge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjb25zdGRlY2wgOiBkdC5HZXRDb25zdGFudERlY2xhcmF0aW9ucygpKSB7CisgICAgICBjb25zdGRlY2wtPkRpc3BhdGNoVmlzaXQoKnRoaXMpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5lc3RlZCA6IGR0LkdldE5lc3RlZFR5cGVzKCkpIHsKKyAgICAgIG5lc3RlZC0+RGlzcGF0Y2hWaXNpdCgqdGhpcyk7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KKyAgdm9pZCBEdW1wQ29tbWVudHMoY29uc3QgQWlkbENvbW1lbnRhYmxlJiBjKSB7CisgICAgY29uc3QgYXV0byBoaWRkZW4gPSBjLklzSGlkZGVuKCk7CisgICAgY29uc3QgYXV0byBkZXByZWNhdGVkID0gRmluZERlcHJlY2F0ZWQoYy5HZXRDb21tZW50cygpKTsKKyAgICBpZiAoaGlkZGVuIHx8IGRlcHJlY2F0ZWQpIHsKKyAgICAgIG91dCA8PCAiLyoqXG4iOworICAgICAgaWYgKGhpZGRlbikgeworICAgICAgICBvdXQgPDwgIiAqIEBoaWRlXG4iOworICAgICAgfQorICAgICAgaWYgKGRlcHJlY2F0ZWQpIHsKKyAgICAgICAgb3V0IDw8ICIgKiBAZGVwcmVjYXRlZCAiIDw8IGRlcHJlY2F0ZWQtPm5vdGUgPDwgIlxuIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiICovXG4iOworICAgIH0KKyAgfQorICB2b2lkIER1bXBBbm5vdGF0aW9ucyhjb25zdCBBaWRsQW5ub3RhdGFibGUmIGEpIHsKKyAgICBhdXRvIGFubm90YXRpb25zID0gYS5Ub1N0cmluZygpOworICAgIGlmICghYW5ub3RhdGlvbnMuZW1wdHkoKSkgeworICAgICAgb3V0IDw8IGFubm90YXRpb25zIDw8ICJcbiI7CisgICAgfQorICB9CisgIHZvaWQgRHVtcENvbnN0YW50VmFsdWUoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHR5cGUsIGNvbnN0IEFpZGxDb25zdGFudFZhbHVlJiBjKSB7CisgICAgb3V0IDw8IGMuVmFsdWVTdHJpbmcodHlwZSwgQWlkbENvbnN0YW50VmFsdWVEZWNvcmF0b3IpOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEludGVyZmFjZSYgdCkgb3ZlcnJpZGUgeworICAgIER1bXBUeXBlKHQsICJpbnRlcmZhY2UiKTsKKyAgICBEdW1wTWVtYmVycyh0KTsKKyAgfQorICB2b2lkIFZpc2l0KGNvbnN0IEFpZGxQYXJjZWxhYmxlJiB0KSBvdmVycmlkZSB7CisgICAgRHVtcFR5cGUodCwgInBhcmNlbGFibGUiKTsKKyAgICBpZiAoY29uc3QgYXV0byYgY3BwX2hlYWRlciA9IHQuR2V0Q3BwSGVhZGVyKCk7ICFjcHBfaGVhZGVyLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAiIGNwcF9oZWFkZXIgIiA8PCBjcHBfaGVhZGVyOworICAgIH0KKyAgICBvdXQgPDwgIjtcbiI7CisgIH0KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsU3RydWN0dXJlZFBhcmNlbGFibGUmIHQpIG92ZXJyaWRlIHsKKyAgICBEdW1wVHlwZSh0LCAicGFyY2VsYWJsZSIpOworICAgIER1bXBNZW1iZXJzKHQpOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFVuaW9uRGVjbCYgdCkgb3ZlcnJpZGUgeworICAgIER1bXBUeXBlKHQsICJ1bmlvbiIpOworICAgIER1bXBNZW1iZXJzKHQpOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbEVudW1EZWNsYXJhdGlvbiYgdCkgb3ZlcnJpZGUgeworICAgIER1bXBUeXBlKHQsICJlbnVtIik7CisgICAgb3V0IDw8ICIge1xuIjsKKyAgICBvdXQuSW5kZW50KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBlIDogdC5HZXRFbnVtZXJhdG9ycygpKSB7CisgICAgICBvdXQgPDwgZS0+R2V0TmFtZSgpIDw8ICIgPSAiOworICAgICAgRHVtcENvbnN0YW50VmFsdWUodC5HZXRCYWNraW5nVHlwZSgpLCAqZS0+R2V0VmFsdWUoKSk7CisgICAgICBvdXQgPDwgIixcbiI7CisgICAgfQorICAgIG91dC5EZWRlbnQoKTsKKyAgICBvdXQgPDwgIn1cbiI7CisgIH0KKyAgdm9pZCBWaXNpdChjb25zdCBBaWRsQ29uc3RhbnREZWNsYXJhdGlvbiYgYykgb3ZlcnJpZGUgeworICAgIER1bXBDb21tZW50cyhjKTsKKyAgICBvdXQgPDwgImNvbnN0ICI7CisgICAgVmlzaXQoYy5HZXRUeXBlKCkpOworICAgIG91dCA8PCAiICIgPDwgYy5HZXROYW1lKCkgPDwgIiA9ICI7CisgICAgRHVtcENvbnN0YW50VmFsdWUoYy5HZXRUeXBlKCksIGMuR2V0VmFsdWUoKSk7CisgICAgb3V0IDw8ICI7XG4iOworICB9CisgIHZvaWQgVmlzaXQoY29uc3QgQWlkbFR5cGVTcGVjaWZpZXImIHQpIG92ZXJyaWRlIHsgb3V0IDw8IHQuVG9TdHJpbmcoKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgUHJlcHJvY2Vzcyhjb25zdCBPcHRpb25zJiBvcHRpb25zLCBjb25zdCBJb0RlbGVnYXRlJiBpb19kZWxlZ2F0ZSkgeworICB1bmlxdWVfcHRyPENvZGVXcml0ZXI+IHdyaXRlciA9IGlvX2RlbGVnYXRlLkdldENvZGVXcml0ZXIob3B0aW9ucy5PdXRwdXRGaWxlKCkpOworICBQcmVwcm9jZXNzVmlzaXRvciB2aXNpdG9yKCp3cml0ZXIpOworCisgIGZvciAoY29uc3QgYXV0byYgZmlsZSA6IG9wdGlvbnMuSW5wdXRGaWxlcygpKSB7CisgICAgQWlkbFR5cGVuYW1lcyB0eXBlbmFtZXM7CisgICAgYXV0byByZXN1bHQgPQorICAgICAgICBpbnRlcm5hbHM6OmxvYWRfYW5kX3ZhbGlkYXRlX2FpZGwoZmlsZSwgb3B0aW9ucywgaW9fZGVsZWdhdGUsICZ0eXBlbmFtZXMsIG51bGxwdHIpOworICAgIGlmIChyZXN1bHQgPT0gQWlkbEVycm9yOjpPSykgeworICAgICAgY29uc3QgYXV0byYgZG9jID0gdHlwZW5hbWVzLk1haW5Eb2N1bWVudCgpOworICAgICAgZm9yIChjb25zdCBhdXRvJiB0IDogZG9jLkRlZmluZWRUeXBlcygpKSB7CisgICAgICAgIHQtPkRpc3BhdGNoVmlzaXQodmlzaXRvcik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gd3JpdGVyLT5DbG9zZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwcm9jZXNzLmggYi9wcmVwcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczNGE2OAotLS0gL2Rldi9udWxsCisrKyBiL3ByZXByb2Nlc3MuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhaWRsX2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiY29kZV93cml0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworCitib29sIFByZXByb2Nlc3MoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgY29uc3QgSW9EZWxlZ2F0ZSYgaW9fZGVsZWdhdGUpOworCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3J1bl9pbnRlZ3JhdGlvbl90ZXN0cy5zaCBiL3J1bl9pbnRlZ3JhdGlvbl90ZXN0cy5zaAppbmRleCAxY2ZkMWMxLi5hNDIzYTNlIDEwMDc1NQotLS0gYS9ydW5faW50ZWdyYXRpb25fdGVzdHMuc2gKKysrIGIvcnVuX2ludGVncmF0aW9uX3Rlc3RzLnNoCkBAIC0zMyw1ICszMywxNyBAQAogYWRiIHB1c2ggXAogICAgICR7QU5EUk9JRF9QUk9EVUNUX09VVH0vdGVzdGNhc2VzL2FpZGxfdGVzdF9qYXZhX2NsaWVudC8qL2FpZGxfdGVzdF9qYXZhX2NsaWVudC5qYXIgXAogICAgIC9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnQuamFyCithZGIgcHVzaCBcCisgICAgJHtBTkRST0lEX1BST0RVQ1RfT1VUfS90ZXN0Y2FzZXMvYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsyOS8qL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMjkuamFyIFwKKyAgICAvZGF0YS9mcmFtZXdvcmsvYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsyOS5qYXIKK2FkYiBwdXNoIFwKKyAgICAke0FORFJPSURfUFJPRFVDVF9PVVR9L3Rlc3RjYXNlcy9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMjkvKi9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMjkuamFyIFwKKyAgICAvZGF0YS9mcmFtZXdvcmsvYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazI5LmphcgorYWRiIHB1c2ggXAorICAgICR7QU5EUk9JRF9QUk9EVUNUX09VVH0vdGVzdGNhc2VzL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMS8qL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMS5qYXIgXAorICAgIC9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazEuamFyCithZGIgcHVzaCBcCisgICAgJHtBTkRST0lEX1BST0RVQ1RfT1VUfS90ZXN0Y2FzZXMvYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazEvKi9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXIgXAorICAgIC9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXIKIAogJHtBTkRST0lEX0JVSUxEX1RPUH0vc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnB5CmRpZmYgLS1naXQgYS9ydXN0Zm10LnRvbWwgYi9ydXN0Zm10LnRvbWwKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDc1YmE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3J1c3RmbXQudG9tbApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9idWlsZC9zb29uZy9zY3JpcHRzL3J1c3RmbXQudG9tbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC5weSBiL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC5weQppbmRleCBjYTc2N2Y0Li41ZjA4NmRhIDEwMDc1NQotLS0gYS90ZXN0cy9haWRsX2ludGVncmF0aW9uX3Rlc3QucHkKKysrIGIvdGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnB5CkBAIC0xLDUgKzEsNiBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcHJvZHVjdAogaW1wb3J0IHBpcGVzCiBpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCkBAIC0xNTksNiArMTYwLDM4IEBACiAgICAgICAgIGlmIHJlLnNlYXJjaChJTlNUUlVNRU5UQVRJT05fU1VDQ0VTU19QQVRURVJOLCByZXN1bHQuc3Rkb3V0KSBpcyBOb25lOgogICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWwocmVzdWx0LnN0ZG91dCkKIAorY2xhc3MgSmF2YVZlcnNpb25UZXN0Q2xpZW50OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBiaXRuZXNzLCB2ZXIpOgorICAgICAgICBzZWxmLm5hbWUgPSAiamF2YV9jbGllbnRfc2RrJWRfJXMiICUgKHZlciwgcHJldHR5X2JpdG5lc3MoYml0bmVzcykpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5iaXRuZXNzID0gYml0bmVzcworICAgICAgICBzZWxmLnZlciA9IHZlcgorICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvc3QucnVuKCdraWxsYWxsICcgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpLAorICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9zdGF0dXM9VHJ1ZSkKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmhvc3QucnVuKCdDTEFTU1BBVEg9L2RhdGEvZnJhbWV3b3JrL2FpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGslZC5qYXIgJyAlIHNlbGYudmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC9kYXRhL2ZyYW1ld29yayBhbmRyb2lkLmFpZGwuc2RrdmVyc2lvbi50ZXN0cy5BaWRsSmF2YVZlcnNpb25UZXN0cycpCisgICAgICAgIHByaW50KHJlc3VsdC5wcmludGFibGVfc3RyaW5nKCkpCisgICAgICAgIGlmIHJlLnNlYXJjaChJTlNUUlVNRU5UQVRJT05fU1VDQ0VTU19QQVRURVJOLCByZXN1bHQuc3Rkb3V0KSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWwocmVzdWx0LnN0ZG91dCkKKworY2xhc3MgSmF2YVZlcnNpb25UZXN0U2VydmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBiaXRuZXNzLCB2ZXIpOgorICAgICAgICBzZWxmLm5hbWUgPSAiamF2YV9zZXJ2ZXJfc2RrJXNfJXMiICUgKHZlciwgcHJldHR5X2JpdG5lc3MoYml0bmVzcykpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5iaXRuZXNzID0gYml0bmVzcworICAgICAgICBzZWxmLnZlciA9IHZlcgorICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvc3QucnVuKCdraWxsYWxsICcgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpLAorICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9zdGF0dXM9VHJ1ZSkKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ob3N0LnJ1bignQ0xBU1NQQVRIPS9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkayVkLmphciAnICUgc2VsZi52ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBUFBfUFJPQ0VTU19GT1JfUFJFVFRZX0JJVE5FU1MgJSBwcmV0dHlfYml0bmVzcyhzZWxmLmJpdG5lc3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAvZGF0YS9mcmFtZXdvcmsgYW5kcm9pZC5haWRsLnNka3ZlcnNpb24uc2VydmljZS5BaWRsSmF2YVZlcnNpb25UZXN0U2VydmljZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9VHJ1ZSkKKwogZGVmIGdldHByb3AoaG9zdCwgcHJvcCk6CiAgICAgcmV0dXJuIGhvc3QucnVuKCdnZXRwcm9wICIlcyInICUgcHJvcCkuc3Rkb3V0LnN0cmlwKCkKIApAQCAtMTg1LDYgKzIxOCwxNiBAQAogICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLmhvc3QucnVuKHNlbGYuYmluYXJ5LCBiYWNrZ3JvdW5kPVRydWUpCiAKK2NsYXNzIFJ1c3RBc3luY1NlcnZlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgYml0bmVzcyk6CisgICAgICAgIHNlbGYubmFtZSA9ICIlc19iaXRfcnVzdF9zZXJ2ZXJfYXN5bmMiICUgcHJldHR5X2JpdG5lc3MoYml0bmVzcykKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLmJpbmFyeSA9IFJVU1RfVEVTVF9TRVJWSUNFX0ZPUl9CSVRORVNTICUgYml0bmVzcworICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvc3QucnVuKCdraWxsYWxsICVzJyAlIHNlbGYuYmluYXJ5LCBpZ25vcmVfc3RhdHVzPVRydWUpCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaG9zdC5ydW4oc2VsZi5iaW5hcnksIGJhY2tncm91bmQ9VHJ1ZSkKKwogZGVmIHN1cHBvcnRlZF9iaXRuZXNzZXMoaG9zdCk6CiAgICAgYml0bmVzc2VzID0gW10KICAgICBpZiBnZXRwcm9wKGhvc3QsICJyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzIiKSAhPSAiIjoKQEAgLTIwOSw2ICsyNTIsMTEgQEAKICAgICAgICAgICAgIHNlcnZlci5jbGVhbnVwKCkKICAgICByZXR1cm4gdGVzdAogCitkZWYgYWRkX3Rlc3QoY2xpZW50LCBzZXJ2ZXIpOgorICAgIHRlc3RfbmFtZSA9ICd0ZXN0XyVzX3RvXyVzJyAlIChjbGllbnQubmFtZSwgc2VydmVyLm5hbWUpCisgICAgdGVzdCA9IG1ha2VfdGVzdChjbGllbnQsIHNlcnZlcikKKyAgICBzZXRhdHRyKFRlc3RBaWRsLCB0ZXN0X25hbWUsIHRlc3QpCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaG9zdCA9IEFkYkhvc3QoKQogICAgIGJpdG5lc3NlcyA9IHN1cHBvcnRlZF9iaXRuZXNzZXMoaG9zdCkKQEAgLTIzMCwxMiArMjc4LDE5IEBACiAKICAgICAgICAgY2xpZW50cyArPSBbUnVzdENsaWVudChob3N0LCBiaXRuZXNzKV0KICAgICAgICAgc2VydmVycyArPSBbUnVzdFNlcnZlcihob3N0LCBiaXRuZXNzKV0KKyAgICAgICAgc2VydmVycyArPSBbUnVzdEFzeW5jU2VydmVyKGhvc3QsIGJpdG5lc3MpXQogCiAgICAgZm9yIGNsaWVudCBpbiBjbGllbnRzOgogICAgICAgICBmb3Igc2VydmVyIGluIHNlcnZlcnM6Ci0gICAgICAgICAgICB0ZXN0X25hbWUgPSAndGVzdF8lc190b18lcycgJSAoY2xpZW50Lm5hbWUsIHNlcnZlci5uYW1lKQotICAgICAgICAgICAgdGVzdCA9IG1ha2VfdGVzdChjbGllbnQsIHNlcnZlcikKLSAgICAgICAgICAgIHNldGF0dHIoVGVzdEFpZGwsIHRlc3RfbmFtZSwgdGVzdCkKKyAgICAgICAgICAgIGFkZF90ZXN0KGNsaWVudCwgc2VydmVyKQorCisgICAgIyBib29sZWFuOiA+PSAyOQorICAgICMgdHlwZWQ6ICAgPj0gMjMKKyAgICB2ZXJzaW9ucyA9IFsxLCAyOV0KKyAgICBmb3IgY192ZXJzaW9uLCBjX2JpdG5lc3MsIHNfdmVyc2lvbiwgc19iaXRuZXNzIGluIHByb2R1Y3QodmVyc2lvbnMsIGJpdG5lc3NlcywgcmVwZWF0PTIpOgorICAgICAgICBjbGllbnQgPSBKYXZhVmVyc2lvblRlc3RDbGllbnQoaG9zdCwgY19iaXRuZXNzLCBjX3ZlcnNpb24pCisgICAgICAgIHNlcnZlciA9IEphdmFWZXJzaW9uVGVzdFNlcnZlcihob3N0LCBzX2JpdG5lc3MsIHNfdmVyc2lvbikKKyAgICAgICAgYWRkX3Rlc3QoY2xpZW50LCBzZXJ2ZXIpCiAKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEFpZGwpCiAgICAgc3lzLmV4aXQobm90IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKS5ydW4oc3VpdGUpLndhc1N1Y2Nlc3NmdWwoKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC54bWwgYi90ZXN0cy9haWRsX2ludGVncmF0aW9uX3Rlc3QueG1sCmluZGV4IDZmNGY2ODYuLjRlNTZlMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfaW50ZWdyYXRpb25fdGVzdC54bWwKKysrIGIvdGVzdHMvYWlkbF9pbnRlZ3JhdGlvbl90ZXN0LnhtbApAQCAtNDEsNiArNDEsMTIgQEAKICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImFpZGxfdGVzdF9qYXZhX2NsaWVudC5qYXItPi9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnQuamFyIiAvPgogICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYWlkbF90ZXN0X2phdmFfc2VydmljZS5qYXItPi9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9zZXJ2aWNlLmphciIgLz4KIAorICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYWlkbF90ZXN0X2phdmFfY2xpZW50X3NkazI5Lmphci0+L2RhdGEvZnJhbWV3b3JrL2FpZGxfdGVzdF9qYXZhX2NsaWVudF9zZGsyOS5qYXIiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazI5Lmphci0+L2RhdGEvZnJhbWV3b3JrL2FpZGxfdGVzdF9qYXZhX3NlcnZpY2Vfc2RrMjkuamFyIiAvPgorCisgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhaWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXItPi9kYXRhL2ZyYW1ld29yay9haWRsX3Rlc3RfamF2YV9jbGllbnRfc2RrMS5qYXIiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhaWRsX3Rlc3RfamF2YV9zZXJ2aWNlX3NkazEuamFyLT4vZGF0YS9mcmFtZXdvcmsvYWlkbF90ZXN0X2phdmFfc2VydmljZV9zZGsxLmphciIgLz4KKwogICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF9wYXJzZXJfZnV6emVyLmNwcCBiL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5jcHAKaW5kZXggY2JhZTE4NC4uNGUzN2IzMSAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF9wYXJzZXJfZnV6emVyLmNwcAorKysgYi90ZXN0cy9haWRsX3BhcnNlcl9mdXp6ZXIuY3BwCkBAIC0yOSw3ICsyOSwzMCBAQAogCiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0OjpGYWtlSW9EZWxlZ2F0ZTsKIAotdm9pZCBmdXp6KGNvbnN0IEZha2VJb0RlbGVnYXRlJiBpbywgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7CitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDw9IDEpIHJldHVybiAwOyAgLy8gbm8gdXNlCisKKyAgLy8gYi8xNDU0NDc1NDAsIGxhcmdlIG5lc3RlZCBleHByZXNzaW9ucyBzb21ldGltZXMgaGl0IHRoZSBzdGFjayBkZXB0aCBsaW1pdC4KKyAgLy8gRnV6emluZyB0aGluZ3Mgb2YgdGhpcyBzaXplIGRvbid0IHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgbWVhbmluZ2Z1bAorICAvLyBjb3ZlcmFnZS4gVGhpcyBpcyBhbiBhcHByb3hpbWF0ZSB2YWx1ZSB3aGljaCBzaG91bGQgYWxsb3cgdXMgdG8gZXhwbG9yZSBhbGwKKyAgLy8gb2YgdGhlIGxhbmd1YWdlIHcvbyBoaXR0aW5nIGEgc3RhY2sgb3ZlcmZsb3cuCisgIGlmIChzaXplID4gMjAwMCkgcmV0dXJuIDA7CisKKyAgRnV6emVkRGF0YVByb3ZpZGVyIHByb3ZpZGVyID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBGYWtlSW9EZWxlZ2F0ZSBpbzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7CisKKyAgc2l6ZV90IG51bUFyZ3MgPSBwcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDIwKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICBhcmdzLmVtcGxhY2VfYmFjayhwcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkpOworICB9CisKKyAgd2hpbGUgKHByb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBwcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudHMgPSBwcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgaW8uU2V0RmlsZUNvbnRlbnRzKG5hbWUsIGNvbnRlbnRzKTsKKyAgfQorCiAgIGlmIChrRnV6ekxvZykgewogICAgIHN0ZDo6Y291dCA8PCAiY21kOiAiOwogICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGFyZyA6IGFyZ3MpIHsKQEAgLTQzLDcxICs2NiwxNiBAQAogICB9CiAKICAgaW50IHJldCA9IGFuZHJvaWQ6OmFpZGw6OmFpZGxfZW50cnkoT3B0aW9uczo6RnJvbShhcmdzKSwgaW8pOwotICBpZiAocmV0ICE9IDApIHJldHVybjsKIAogICBpZiAoa0Z1enpMb2cpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtmLCBvdXRwdXRdIDogaW8uT3V0cHV0RmlsZXMoKSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJPVVRQVVQgIiA8PCBmIDw8ICI6ICIgPDwgc3RkOjplbmRsOwotICAgICAgc3RkOjpjb3V0IDw8IG91dHB1dCA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJSRVQ6ICIgPDwgcmV0IDw8IHN0ZDo6ZW5kbDsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgW2YsIG91dHB1dF0gOiBpby5PdXRwdXRGaWxlcygpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiT1VUUFVUICIgPDwgZiA8PCAiOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8IG91dHB1dCA8PCBzdGQ6OmVuZGw7CisgICAgICB9CiAgICAgfQogICB9Ci19Ci0KLXZvaWQgZnV6ekxhbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmdPcHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50KSB7Ci0gIEZha2VJb0RlbGVnYXRlIGlvOwotICBpby5TZXRGaWxlQ29udGVudHMoImEvcGF0aC9Gb28uYWlkbCIsIGNvbnRlbnQpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzOwotICBhcmdzLmVtcGxhY2VfYmFjaygiYWlkbCIpOwotICBhcmdzLmVtcGxhY2VfYmFjaygiLS1sYW5nPSIgKyBsYW5nT3B0KTsKLSAgYXJncy5lbXBsYWNlX2JhY2soIi1iIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCItSSAuIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCItbyBvdXQiKTsKLSAgLy8gY29ycmVzcG9uZGluZyBwYWNrYWdlIGFsc28gaW4gYWlkbF9wYXJzZXJfZnV6emVyLmRpY3QKLSAgYXJncy5lbXBsYWNlX2JhY2soImEvcGF0aC9Gb28uYWlkbCIpOwotCi0gIGZ1enooaW8sIGFyZ3MpOwotfQotCi12b2lkIGZ1enpDaGVja0FwaShjb25zdCBzdGQ6OnN0cmluZyYgYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGIpIHsKLSAgRmFrZUlvRGVsZWdhdGUgaW87Ci0gIGlvLlNldEZpbGVDb250ZW50cygiYS9wYXRoL0Zvby5haWRsIiwgYSk7Ci0gIGlvLlNldEZpbGVDb250ZW50cygiYi9wYXRoL0Zvby5haWRsIiwgYik7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCJhaWRsIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCItLWNoZWNrYXBpIik7Ci0gIC8vIGNvcnJlc3BvbmRpbmcgcGFja2FnZSBhbHNvIGluIGFpZGxfcGFyc2VyX2Z1enplci5kaWN0Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCJhL3BhdGgvIik7Ci0gIGFyZ3MuZW1wbGFjZV9iYWNrKCJiL3BhdGgvIik7Ci0KLSAgZnV6eihpbywgYXJncyk7Ci19Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKHNpemUgPD0gMSkgcmV0dXJuIDA7ICAvLyBubyB1c2UKLQotICAvLyBiLzE0NTQ0NzU0MCwgbGFyZ2UgbmVzdGVkIGV4cHJlc3Npb25zIHNvbWV0aW1lcyBoaXQgdGhlIHN0YWNrIGRlcHRoIGxpbWl0LgotICAvLyBGdXp6aW5nIHRoaW5ncyBvZiB0aGlzIHNpemUgZG9uJ3QgcHJvdmlkZSBhbnkgYWRkaXRpb25hbCBtZWFuaW5nZnVsCi0gIC8vIGNvdmVyYWdlLiBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHZhbHVlIHdoaWNoIHNob3VsZCBhbGxvdyB1cyB0byBleHBsb3JlIGFsbAotICAvLyBvZiB0aGUgbGFuZ3VhZ2Ugdy9vIGhpdHRpbmcgYSBzdGFjayBvdmVyZmxvdy4KLSAgaWYgKHNpemUgPiAyMDAwKSByZXR1cm4gMDsKLQotICBGdXp6ZWREYXRhUHJvdmlkZXIgcHJvdmlkZXIgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7Ci0KLSAgaWYgKHByb3ZpZGVyLkNvbnN1bWVCb29sKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBjb250ZW50ID0gcHJvdmlkZXIuQ29uc3VtZVJlbWFpbmluZ0J5dGVzQXNTdHJpbmcoKTsKLQotICAgIGZ1enpMYW5nKCJuZGsiLCBjb250ZW50KTsKLSAgICBmdXp6TGFuZygiY3BwIiwgY29udGVudCk7Ci0gICAgZnV6ekxhbmcoImphdmEiLCBjb250ZW50KTsKLSAgICBmdXp6TGFuZygicnVzdCIsIGNvbnRlbnQpOwotICB9IGVsc2UgewotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRBID0gcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOwotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRCID0gcHJvdmlkZXIuQ29uc3VtZVJlbWFpbmluZ0J5dGVzQXNTdHJpbmcoKTsKLQotICAgIGZ1enpDaGVja0FwaShjb250ZW50QSwgY29udGVudEIpOwotICB9CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3BhcnNlcl9mdXp6ZXIuZGljdCBiL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5kaWN0CmluZGV4IGVmNWZhOGIuLmViMmQ4Y2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5kaWN0CisrKyBiL3Rlc3RzL2FpZGxfcGFyc2VyX2Z1enplci5kaWN0CkBAIC01NSw2ICs1NSw4IEBACiAiIEBEZXNjcmlwdG9yICIKICIgQEphdmFEZXJ2aWUgIgogIiBAUnVzdERlcml2ZSAiCisiIC8qKiBAaGlkZSAqLyAiCisiIC8qKiBAZGVwcmVjYXRlZCByZWFzb24gKi8gIgogCiAjIGFubm90YXRpb24gYXJndW1lbnRzCiAiIHZhbHVlICIKQEAgLTg2LDQgKzg4LDQxIEBACiAiIGEucGF0aCAiCiAiIGIucGF0aCAiCiAiIEZvbyAiCisiIGEvcGF0aC9Gb28uYWlkbCAiCisiIGIvcGF0aC9Gb28uYWlkbCAiCisiIHBhdGgvRm9vLmFpZGwgIgogCisjYXJndW1lbnRzCisiIGFpZGwgIgorIiAtLWFwaW1hcHBpbmcgIgorIiAtLWNoZWNrYXBpPWNvbXBhdGlibGUgIgorIiAtLWNoZWNrYXBpPWVxdWFsICIKKyIgLS1oYXNoICIKKyIgLS1oZWxwICIKKyIgLS1sYW5nPWphdmEgIgorIiAtLWxhbmc9bmRrICIKKyIgLS1sYW5nPW5kayAiCisiIC0tbGFuZz1ydXN0ICIKKyIgLS1sb2cgIgorIiAtLW5pbmphICIKKyIgLS1wcmVwcm9jZXNzICIKKyIgLS1zdGFiaWxpdHkgIgorIiAtLXN0YWJpbGl0eT12aW50ZiAiCisiIC0tc3RydWN0dXJlZCAiCisiIC0tdHJhY2UgIgorIiAtLXRyYW5zYWN0aW9uX25hbWVzICIKKyIgLUkgIgorIiAtVyAiCisiIC1XZXJyb3IgIgorIiAtV2V2ZXJ5dGhpbmcgIgorIiAtV25vLSAiCisiIC1Xbm8tZXJyb3IgIgorIiAtYSAiCisiIC1iICIKKyIgLWQgIgorIiAtaCAiCisiIC1vICIKKyIgLXAgIgorIiAtdCAiCisiIC12ICIKKyIgLXcgIgpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9idWlsdGluX3RyYW5zYWN0aW9ucy5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2J1aWx0aW5fdHJhbnNhY3Rpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjUyODc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9idWlsdGluX3RyYW5zYWN0aW9ucy5jcHAKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJhaWRsX3Rlc3RfY2xpZW50LmgiCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorCit1c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwordXNpbmcgYW5kcm9pZDo6T0s7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKKworVEVTVF9GKEFpZGxUZXN0LCBQaW5nKSB7CisgIEVYUEVDVF9FUShPSywgSUludGVyZmFjZTo6YXNCaW5kZXIoc2VydmljZSktPnBpbmdCaW5kZXIoKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgR2V0SW50ZXJmYWNlRGVzY3JpcHRvcikgeworICBFWFBFQ1RfRVEoU3RyaW5nMTYoImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UiKSwKKyAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHNlcnZpY2UpLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWZhdWx0aW1wbC5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2RlZmF1bHRpbXBsLmNwcAppbmRleCAzMmUzNWQ4Li5kZjU3ZDJjIDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2RlZmF1bHRpbXBsLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2RlZmF1bHRpbXBsLmNwcApAQCAtMzgsOCArMzgsMTkgQEAKICAgfQogfTsKIAorLyogTWFrZSBzdXJlIHRoZSB1bmltcGxlbWVudGVkTWV0aG9kIGJlaGF2ZXMgYXMgZXhwZWN0ZWQgYmVmb3JlIHRlc3RpbmcgdGhlCisgKiBkZWZhdWx0IGltcGwKKyAqLworVEVTVF9GKEFpZGxUZXN0LCB1bmltcGxlbWVudGVkTWV0aG9kSW1wbCkgeworICBpbnQzMl90IHJldHVybmVkX3ZhbHVlOworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlVuaW1wbGVtZW50ZWRNZXRob2Qoa0V4cGVjdGVkQXJnVmFsdWUsICZyZXR1cm5lZF92YWx1ZSk7CisgIEFTU0VSVF9GQUxTRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXM7CisgIEFTU0VSVF9FUShzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfVFJBTlNBQ1RJT05fRkFJTEVEKTsKKyAgRVhQRUNUX0VRKHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCksIGFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworfQorCiBURVNUX0YoQWlkbFRlc3QsIGRlZmF1bHRJbXBsKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJVGVzdFNlcnZpY2U+IGRlZkltcGwgPSBzdGQ6Om1ha2VfdW5pcXVlPERlZj4oKTsKKyAgYW5kcm9pZDo6c3A8SVRlc3RTZXJ2aWNlPiBkZWZJbXBsID0gYW5kcm9pZDo6c3A8RGVmPjo6bWFrZSgpOwogICBhdXRvIHJldCA9IElUZXN0U2VydmljZTo6c2V0RGVmYXVsdEltcGwoc3RkOjptb3ZlKGRlZkltcGwpKTsKICAgQVNTRVJUX1RSVUUocmV0KTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWxlZ2F0ZS5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X2RlbGVnYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTcxMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9kZWxlZ2F0ZS5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiYWlkbF90ZXN0X2NsaWVudC5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oIgorCit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKKwordXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTsKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2VEZWxlZ2F0b3I7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50OF90IGtDdXN0b21CeXRlID0gODsKKworc3RydWN0IEN1c3RvbURlbGVnYXRvciA6IHB1YmxpYyBJVGVzdFNlcnZpY2VEZWxlZ2F0b3IgeworIHB1YmxpYzoKKyAgQ3VzdG9tRGVsZWdhdG9yKHNwPElUZXN0U2VydmljZT4mIGltcGwpIDogSVRlc3RTZXJ2aWNlRGVsZWdhdG9yKGltcGwpIHt9CisKKyAgLy8gQ2hhbmdlIFJlcGVhdEJ5dGUgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBieXRlLgorICBTdGF0dXMgUmVwZWF0Qnl0ZShpbnQ4X3QgLyogdG9rZW4gKi8sIGludDhfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKl9haWRsX3JldHVybiA9IGtDdXN0b21CeXRlOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KK307CisKK1RFU1RfRihBaWRsVGVzdCwgRGVsZWdhdG9yKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxJVGVzdFNlcnZpY2VEZWxlZ2F0b3I+IGRlbGVnYXRvciA9CisgICAgICBzdGQ6Om1ha2VfdW5pcXVlPElUZXN0U2VydmljZURlbGVnYXRvcj4oc2VydmljZSk7CisKKyAgaW50OF90IHJldHVybmVkX3ZhbHVlOworICBhdXRvIHN0YXR1cyA9IGRlbGVnYXRvci0+UmVwZWF0Qnl0ZSgxMiwgJnJldHVybmVkX3ZhbHVlKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzOworICBFWFBFQ1RfRVEoMTIsIHJldHVybmVkX3ZhbHVlKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBDdXN0b21EZWxlZ2F0b3IpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEN1c3RvbURlbGVnYXRvcj4gZGVsZWdhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDdXN0b21EZWxlZ2F0b3I+KHNlcnZpY2UpOworCisgIGludDhfdCByZXR1cm5lZF92YWx1ZTsKKyAgYXV0byBzdGF0dXMgPSBkZWxlZ2F0b3ItPlJlcGVhdEJ5dGUoMTIsICZyZXR1cm5lZF92YWx1ZSk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1czsKKyAgRVhQRUNUX0VRKGtDdXN0b21CeXRlLCByZXR1cm5lZF92YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19uZXN0ZWQuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbmVzdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJlNWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbmVzdGVkLmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmg+CisKKyNpbmNsdWRlIDxvcHRpb25hbD4KKwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDsKK3VzaW5nIE5lc3RlZFJlc3VsdCA9IGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ7Cit1c2luZyBOZXN0ZWRTdGF0dXMgPSBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOwordXNpbmcgc3RkOjpvcHRpb25hbDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpPcHRpb25hbDsKKworc3RydWN0IEFpZGxUZXN0IDogdGVzdGluZzo6VGVzdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnNoYXJlZF9wdHI8VD4gZ2V0U2VydmljZSgpIHsKKyAgICBuZGs6OlNwQUlCaW5kZXIgYmluZGVyID0gbmRrOjpTcEFJQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKFQ6OmRlc2NyaXB0b3IpKTsKKyAgICByZXR1cm4gVDo6ZnJvbUJpbmRlcihiaW5kZXIpOworICB9Cit9OworCitURVNUX0YoQWlkbFRlc3QsIE5lc3RlZFNlcnZpY2UpIHsKKyAgYXV0byBuZXN0ZWRTZXJ2aWNlID0gZ2V0U2VydmljZTxJTmVzdGVkU2VydmljZT4oKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG5lc3RlZFNlcnZpY2UpOworCisgIFBhcmNlbGFibGVXaXRoTmVzdGVkIHA7CisgIHAuc3RhdHVzID0gTmVzdGVkU3RhdHVzOjpPSzsKKyAgTmVzdGVkUmVzdWx0IHI7CisgIC8vIE9LIC0+IE5PVF9PSworICBhdXRvIHN0YXR1cyA9IG5lc3RlZFNlcnZpY2UtPmZsaXBTdGF0dXMocCwgJnIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgRVhQRUNUX0VRKHIuc3RhdHVzLCBOZXN0ZWRTdGF0dXM6Ok5PVF9PSyk7CisKKyAgLy8gTk9UX09LIC0+IE9LIHdpdGggY2FsbGJhY2sgKG5lc3RlZCBpbnRlcmZhY2UpCisgIHN0cnVjdCBDYWxsYmFjayA6IElOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrIHsKKyAgICBvcHRpb25hbDxQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzPiByZXN1bHQ7CisgICAgbmRrOjpTY29wZWRBU3RhdHVzIGRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdCkgb3ZlcnJpZGUgeworICAgICAgcmVzdWx0ID0gc3Q7CisgICAgICByZXR1cm4gbmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgfTsKKyAgYXV0byBjYiA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxDYWxsYmFjaz4oKTsKKyAgc3RhdHVzID0gbmVzdGVkU2VydmljZS0+ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhyLnN0YXR1cywgY2IpOworICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgRVhQRUNUX1RIQVQoY2ItPnJlc3VsdCwgT3B0aW9uYWwoTmVzdGVkU3RhdHVzOjpPSykpOworCisgIC8vIGFuZHJvaWQ6OmVudW1fcmFuZ2VzPD4KKyAgdmVjdG9yPE5lc3RlZFN0YXR1cz4gdmFsdWVze25kazo6ZW51bV9yYW5nZTxOZXN0ZWRTdGF0dXM+KCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kazo6ZW51bV9yYW5nZTxOZXN0ZWRTdGF0dXM+KCkuZW5kKCl9OworICBFWFBFQ1RfRVEodmFsdWVzLCB2ZWN0b3I8TmVzdGVkU3RhdHVzPih7TmVzdGVkU3RhdHVzOjpPSywgTmVzdGVkU3RhdHVzOjpOT1RfT0t9KSk7CisKKyAgLy8gdG9TdHJpbmcoKQorICBFWFBFQ1RfRVEodG9TdHJpbmcoTmVzdGVkU3RhdHVzOjpOT1RfT0spLCAiTk9UX09LIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19udWxsYWJsZXMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbnVsbGFibGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU2Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfbnVsbGFibGVzLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgorCit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGU7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOwordXNpbmcgdGVzdGluZzo6RXE7CisKK3N0cnVjdCBBaWRsVGVzdCA6IHRlc3Rpbmc6OlRlc3QgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RkOjpzaGFyZWRfcHRyPFQ+IGdldFNlcnZpY2UoKSB7CisgICAgbmRrOjpTcEFJQmluZGVyIGJpbmRlciA9IG5kazo6U3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZShUOjpkZXNjcmlwdG9yKSk7CisgICAgcmV0dXJuIFQ6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgfQorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlPElUZXN0U2VydmljZT4oKTsKKyAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPmdldEJhY2tlbmRUeXBlKCZiYWNrZW5kKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKyAgfQorICBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOworICBCYWNrZW5kVHlwZSBiYWNrZW5kOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIERvVGVzdChuZGs6OlNjb3BlZEFTdGF0dXMgKElUZXN0U2VydmljZTo6KmZ1bmMpKGNvbnN0IHN0ZDo6b3B0aW9uYWw8VD4mLCBzdGQ6Om9wdGlvbmFsPFQ+KiksCisgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8VD4gaW5wdXQpIHsKKyAgICBzdGQ6Om9wdGlvbmFsPFQ+IG91dHB1dDsKKyAgICBhdXRvIHN0YXR1cyA9ICgqc2VydmljZS4qZnVuYykoaW5wdXQsICZvdXRwdXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9UUlVFKG91dHB1dC5oYXNfdmFsdWUoKSk7CisgICAgQVNTRVJUX1RIQVQoKm91dHB1dCwgRXEoKmlucHV0KSk7CisKKyAgICBpbnB1dC5yZXNldCgpOworICAgIHN0YXR1cyA9ICgqc2VydmljZS4qZnVuYykoaW5wdXQsICZvdXRwdXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuaGFzX3ZhbHVlKCkpOworICB9Cit9OworCitURVNUX0YoQWlkbFRlc3QsIHBhcmNlbGFibGVBcnJheSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+PiBpbnB1dDsKKyAgaW5wdXQucHVzaF9iYWNrKElUZXN0U2VydmljZTo6RW1wdHkoKSk7CisgIGlucHV0LnB1c2hfYmFjayhzdGQ6Om51bGxvcHQpOworICBEb1Rlc3QoJklUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXksIHN0ZDo6bWFrZV9vcHRpb25hbChpbnB1dCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIHBhcmNlbGFibGVMaXN0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+IGlucHV0OworICBpbnB1dC5wdXNoX2JhY2soSVRlc3RTZXJ2aWNlOjpFbXB0eSgpKTsKKyAgaW5wdXQucHVzaF9iYWNrKHN0ZDo6bnVsbG9wdCk7CisgIERvVGVzdCgmSVRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0LCBzdGQ6Om1ha2Vfb3B0aW9uYWwoaW5wdXQpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBudWxsQmluZGVyKSB7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXIobnVsbHB0cik7CisgIEFTU0VSVF9USEFUKHN0YXR1cy5nZXRTdGF0dXMoKSwgRXEoU1RBVFVTX1VORVhQRUNURURfTlVMTCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworICAvLyBOb3RlIHRoYXQgTkRLIGJhY2tlbmQgY2hlY2tzIG51bGwgYmVmb3JlIHRyYW5zYWN0aW9uIHdoaWxlIEMrKyBiYWNrZW5kcyBkb2Vzbid0LgorfQorCitURVNUX0YoQWlkbFRlc3QsIGJpbmRlckxpc3RXaXRoTnVsbCkgeworICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+IGlucHV0e3NlcnZpY2UtPmFzQmluZGVyKCksIG51bGxwdHJ9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQW5JQmluZGVyTGlzdChpbnB1dCk7CisgIEFTU0VSVF9USEFUKHN0YXR1cy5nZXRTdGF0dXMoKSwgRXEoU1RBVFVTX1VORVhQRUNURURfTlVMTCkpOworICAvLyBOb3RlIHRoYXQgTkRLIGJhY2tlbmQgY2hlY2tzIG51bGwgYmVmb3JlIHRyYW5zYWN0aW9uIHdoaWxlIEMrKyBiYWNrZW5kcyBkb2Vzbid0LgorfQorCitURVNUX0YoQWlkbFRlc3QsIG5vbk51bGxCaW5kZXIpIHsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5UYWtlc0FuSUJpbmRlcihzZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgYmluZGVyTGlzdFdpdGhvdXROdWxsKSB7CisgIHN0ZDo6dmVjdG9yPG5kazo6U3BBSUJpbmRlcj4gaW5wdXR7c2VydmljZS0+YXNCaW5kZXIoKX07CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgbnVsbEJpbmRlclRvQW5ub3RhdGVkTWV0aG9kKSB7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyKG51bGxwdHIpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJMaXN0V2l0aE51bGxUb0Fubm90YXRlZE1ldGhvZCkgeworICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+IGlucHV0e3NlcnZpY2UtPmFzQmluZGVyKCksIG51bGxwdHJ9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJBcnJheSkgeworICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+IHJlcGVhdGVkOworICBpZiAoYmFja2VuZCA9PSBCYWNrZW5kVHlwZTo6SkFWQSkgeworICAgIC8vIEphdmEgY2FuIG9ubHkgbW9kaWZ5IG91dC1hcmd1bWVudCBhcnJheXMgaW4tcGxhY2UKKyAgICByZXBlYXRlZC5yZXNpemUoMik7CisgIH0KKyAgLy8gZ2V0IElOYW1lZENhbGxiYWNrIGZvciAiU3BBSUJpbmRlciIgb2JqZWN0CisgIHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4gY2FsbGJhY2s7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+R2V0Q2FsbGJhY2soZmFsc2UsICZjYWxsYmFjayk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworCisgIHN0ZDo6dmVjdG9yPG5kazo6U3BBSUJpbmRlcj4gcmV2ZXJzZWQ7CisgIHN0ZDo6dmVjdG9yPG5kazo6U3BBSUJpbmRlcj4gaW5wdXR7c2VydmljZS0+YXNCaW5kZXIoKSwgY2FsbGJhY2stPmFzQmluZGVyKCl9OworICBzdGF0dXMgPSBzZXJ2aWNlLT5SZXZlcnNlSUJpbmRlckFycmF5KGlucHV0LCAmcmVwZWF0ZWQsICZyZXZlcnNlZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworCisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXBlYXRlZCkpOworICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihyZXZlcnNlZCksIHN0ZDo6ZW5kKHJldmVyc2VkKSk7CisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXZlcnNlZCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIG51bGxhYmxlQmluZGVyQXJyYXkpIHsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+PiByZXBlYXRlZDsKKyAgaWYgKGJhY2tlbmQgPT0gQmFja2VuZFR5cGU6OkpBVkEpIHsKKyAgICAvLyBKYXZhIGNhbiBvbmx5IG1vZGlmeSBvdXQtYXJndW1lbnQgYXJyYXlzIGluLXBsYWNlCisgICAgcmVwZWF0ZWQgPSBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+KDIpOworICB9CisKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+PiByZXZlcnNlZDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+PiBpbnB1dCA9CisgICAgICBzdGQ6OnZlY3RvcjxuZGs6OlNwQUlCaW5kZXI+e3NlcnZpY2UtPmFzQmluZGVyKCksIHNlcnZpY2UtPmFzQmluZGVyKCl9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbnB1dCwgJnJlcGVhdGVkLCAmcmV2ZXJzZWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKSA8PCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKTsKKworICBFWFBFQ1RfVEhBVChpbnB1dCwgRXEocmVwZWF0ZWQpKTsKKyAgQVNTRVJUX1RSVUUocmV2ZXJzZWQpOworICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbigqcmV2ZXJzZWQpLCBzdGQ6OmVuZCgqcmV2ZXJzZWQpKTsKKyAgRVhQRUNUX1RIQVQoaW5wdXQsIEVxKHJldmVyc2VkKSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcGFyY2VsYWJsZXMuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcGFyY2VsYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDMwOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19wYXJjZWxhYmxlcy5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oPgorCit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOwordXNpbmcgQm5SZXBlYXRGaXhlZFNpemVBcnJheSA9CisgICAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTsKK3VzaW5nIEJwUmVwZWF0Rml4ZWRTaXplQXJyYXkgPQorICAgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk7Cit1c2luZyBJbnRQYXJjZWxhYmxlID0gYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZTsKK3VzaW5nIElSZXBlYXRGaXhlZFNpemVBcnJheSA9CisgICAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OwordXNpbmcgQm5FbXB0eUludGVyZmFjZSA9CisgICAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U7Cit1c2luZyBhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdDsKK3VzaW5nIGFuZHJvaWQ6Ok9LOwordXNpbmcgbmRrOjpBUGFyY2VsX3JlYWREYXRhOwordXNpbmcgbmRrOjpBUGFyY2VsX3dyaXRlRGF0YTsKK3VzaW5nIG5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIG5kazo6U2hhcmVkUmVmQmFzZTsKK3VzaW5nIG5kazo6U3BBSUJpbmRlcjsKKworc3RydWN0IEFpZGxUZXN0IDogdGVzdGluZzo6VGVzdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnNoYXJlZF9wdHI8VD4gZ2V0U2VydmljZSgpIHsKKyAgICBuZGs6OlNwQUlCaW5kZXIgYmluZGVyID0gbmRrOjpTcEFJQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKFQ6OmRlc2NyaXB0b3IpKTsKKyAgICByZXR1cm4gVDo6ZnJvbUJpbmRlcihiaW5kZXIpOworICB9Cit9OworCisvLyBUT0RPKGIvMTk2NDU0ODk3KTogY29weSBtb3JlIHRlc3RzIGZyb20gYWlkbF90ZXN0X2NsaWVudAorCitURVNUX0YoQWlkbFRlc3QsIFJldmVyc2VSZWN1cnNpdmVMaXN0KSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZWN1cnNpdmVMaXN0PiBoZWFkOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBhdXRvIG5vZGUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlY3Vyc2l2ZUxpc3Q+KCk7CisgICAgbm9kZS0+dmFsdWUgPSBpOworICAgIG5vZGUtPm5leHQgPSBzdGQ6Om1vdmUoaGVhZCk7CisgICAgaGVhZCA9IHN0ZDo6bW92ZShub2RlKTsKKyAgfQorICAvLyBoZWFkOiBbOSwgOCwgLi4uIDBdCisKKyAgUmVjdXJzaXZlTGlzdCByZXZlcnNlZDsKKyAgYXV0byBzdGF0dXMgPSBnZXRTZXJ2aWNlPElUZXN0U2VydmljZT4oKS0+UmV2ZXJzZUxpc3QoKmhlYWQsICZyZXZlcnNlZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworCisgIC8vIHJldmVyc2VkIHNob3VsZCBiZSBbMCwgMSwgLi4gOV0KKyAgUmVjdXJzaXZlTGlzdCogY3VyID0gJnJldmVyc2VkOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoaSwgY3VyLT52YWx1ZSk7CisgICAgY3VyID0gY3VyLT5uZXh0LmdldCgpOworICB9CisgIEVYUEVDVF9FUShudWxscHRyLCBjdXIpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEZpeGVkU2l6ZUFycmF5KSB7CisgIGF1dG8gcGFyY2VsID0gQVBhcmNlbF9jcmVhdGUoKTsKKworICBGaXhlZFNpemVBcnJheUV4YW1wbGUgcDsKKyAgcC5ieXRlTWF0cml4WzBdWzBdID0gMDsKKyAgcC5ieXRlTWF0cml4WzBdWzFdID0gMTsKKyAgcC5ieXRlTWF0cml4WzFdWzBdID0gMjsKKyAgcC5ieXRlTWF0cml4WzFdWzFdID0gMzsKKyAgcC5mbG9hdE1hdHJpeFswXVswXSA9IDAuZjsKKyAgcC5mbG9hdE1hdHJpeFswXVsxXSA9IDEuZjsKKyAgcC5mbG9hdE1hdHJpeFsxXVswXSA9IDIuZjsKKyAgcC5mbG9hdE1hdHJpeFsxXVsxXSA9IDMuZjsKKyAgRVhQRUNUX0VRKE9LLCBwLndyaXRlVG9QYXJjZWwocGFyY2VsKSk7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCAwKTsKKworICBGaXhlZFNpemVBcnJheUV4YW1wbGUgcTsKKyAgRVhQRUNUX0VRKE9LLCBxLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpOworICBFWFBFQ1RfRVEocCwgcSk7CisKKyAgQVBhcmNlbF9kZWxldGUocGFyY2VsKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheVdpdGhWYWx1ZXNBdE51bGxhYmxlRmllbGRzKSB7CisgIGF1dG8gcGFyY2VsID0gQVBhcmNlbF9jcmVhdGUoKTsKKworICBGaXhlZFNpemVBcnJheUV4YW1wbGUgcDsKKyAgcC5ib29sTnVsbGFibGVBcnJheSA9IHN0ZDo6YXJyYXk8Ym9vbCwgMj57dHJ1ZSwgZmFsc2V9OworICBwLmJ5dGVOdWxsYWJsZUFycmF5ID0gc3RkOjphcnJheTx1aW50OF90LCAyPns0MiwgMH07CisgIHAuc3RyaW5nTnVsbGFibGVBcnJheSA9IHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4sIDI+eyJoZWxsbyIsICJ3b3JsZCJ9OworCisgIHAuYm9vbE51bGxhYmxlTWF0cml4LmVtcGxhY2UoKTsKKyAgcC5ib29sTnVsbGFibGVNYXRyaXgtPmF0KDApID0gc3RkOjphcnJheTxib29sLCAyPnt0cnVlLCBmYWxzZX07CisgIHAuYnl0ZU51bGxhYmxlTWF0cml4LmVtcGxhY2UoKTsKKyAgcC5ieXRlTnVsbGFibGVNYXRyaXgtPmF0KDApID0gc3RkOjphcnJheTx1aW50OF90LCAyPns0MiwgMH07CisgIHAuc3RyaW5nTnVsbGFibGVNYXRyaXguZW1wbGFjZSgpOworICBwLnN0cmluZ051bGxhYmxlTWF0cml4LT5hdCgwKSA9IHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4sIDI+eyJoZWxsbyIsICJ3b3JsZCJ9OworCisgIEVYUEVDVF9FUShPSywgcC53cml0ZVRvUGFyY2VsKHBhcmNlbCkpOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgMCk7CisKKyAgRml4ZWRTaXplQXJyYXlFeGFtcGxlIHE7CisgIEVYUEVDVF9FUShPSywgcS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpKTsKKyAgRVhQRUNUX0VRKHAsIHEpOworCisgIEFQYXJjZWxfZGVsZXRlKHBhcmNlbCk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlPZkJ5dGVzU2hvdWxkQmVQYWNrZWQpIHsKKyAgYXV0byBwYXJjZWwgPSBBUGFyY2VsX2NyZWF0ZSgpOworCisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gYnl0ZV9hcnJheTsKKyAgYnl0ZV9hcnJheVswXSA9IHsxLCAyLCAzfTsKKyAgYnl0ZV9hcnJheVsxXSA9IHs0LCA1LCA2fTsKKyAgRVhQRUNUX0VRKE9LLCBBUGFyY2VsX3dyaXRlRGF0YShwYXJjZWwsIGJ5dGVfYXJyYXkpKTsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIDApOworCisgIGludDMyX3QgbGVuOworICBFWFBFQ1RfRVEoT0ssIEFQYXJjZWxfcmVhZERhdGEocGFyY2VsLCAmbGVuKSk7CisgIEVYUEVDVF9FUSgyLCBsZW4pOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlX3ZlY3RvcjsKKyAgRVhQRUNUX0VRKE9LLCBBUGFyY2VsX3JlYWREYXRhKHBhcmNlbCwgJmJ5dGVfdmVjdG9yKSk7CisgIEVYUEVDVF9FUShieXRlX3ZlY3RvciwgKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ezEsIDIsIDN9KSk7CisgIEVYUEVDVF9FUShPSywgQVBhcmNlbF9yZWFkRGF0YShwYXJjZWwsICZieXRlX3ZlY3RvcikpOworICBFWFBFQ1RfRVEoYnl0ZV92ZWN0b3IsIChzdGQ6OnZlY3Rvcjx1aW50OF90Pns0LCA1LCA2fSkpOworCisgIEFQYXJjZWxfZGVsZXRlKHBhcmNlbCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlLCB0eXBlbmFtZSBNZW1GbiwgdHlwZW5hbWUgSW5wdXQ+Cit2b2lkIENoZWNrUmVwZWF0KFNlcnZpY2Ugc2VydmljZSwgTWVtRm4gZm4sIElucHV0IGlucHV0KSB7CisgIElucHV0IG91dDEsIG91dDI7CisgIEVYUEVDVF9UUlVFKHN0ZDo6aW52b2tlKGZuLCBzZXJ2aWNlLCBpbnB1dCwgJm91dDEsICZvdXQyKS5pc09rKCkpOworICBFWFBFQ1RfRVEoaW5wdXQsIG91dDEpOworICBFWFBFQ1RfRVEoaW5wdXQsIG91dDIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6YXJyYXk8c3RkOjphcnJheTxULCAzPiwgMj4gTWFrZTJkQXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8VCwgMz4sIDI+IGFyciA9IHt9OworICBhdXRvIGl0ID0gc3RkOjpiZWdpbih2YWx1ZXMpOworICBmb3IgKGF1dG8mIHJvdyA6IGFycikgeworICAgIGZvciAoYXV0byYgZWwgOiByb3cpIHsKKyAgICAgIGlmIChpdCA9PSBzdGQ6OmVuZCh2YWx1ZXMpKSBicmVhazsKKyAgICAgIGVsID0gKml0Kys7CisgICAgfQorICB9CisgIHJldHVybiBhcnI7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlPdmVyQmluZGVyKSB7CisgIGF1dG8gc2VydmljZSA9IGdldFNlcnZpY2U8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PigpOworCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEJ5dGVzLCAoc3RkOjphcnJheTx1aW50OF90LCAzPnsxLCAyLCAzfSkpOworCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEludHMsIChzdGQ6OmFycmF5PGludDMyX3QsIDM+ezEsIDIsIDN9KSk7CisKKyAgYXV0byBiaW5kZXIxID0gU2hhcmVkUmVmQmFzZTo6bWFrZTxCbkVtcHR5SW50ZXJmYWNlPigpLT5hc0JpbmRlcigpOworICBhdXRvIGJpbmRlcjIgPSBTaGFyZWRSZWZCYXNlOjptYWtlPEJuRW1wdHlJbnRlcmZhY2U+KCktPmFzQmluZGVyKCk7CisgIGF1dG8gYmluZGVyMyA9IFNoYXJlZFJlZkJhc2U6Om1ha2U8Qm5FbXB0eUludGVyZmFjZT4oKS0+YXNCaW5kZXIoKTsKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0QmluZGVycywKKyAgICAgICAgICAgICAgKHN0ZDo6YXJyYXk8U3BBSUJpbmRlciwgMz57YmluZGVyMSwgYmluZGVyMiwgYmluZGVyM30pKTsKKworICBJbnRQYXJjZWxhYmxlIHAxLCBwMiwgcDM7CisgIHAxLnZhbHVlID0gMTsKKyAgcDIudmFsdWUgPSAyOworICBwMy52YWx1ZSA9IDM7CisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdFBhcmNlbGFibGVzLAorICAgICAgICAgICAgICAoc3RkOjphcnJheTxJbnRQYXJjZWxhYmxlLCAzPntwMSwgcDIsIHAzfSkpOworCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkQnl0ZXMsIE1ha2UyZEFycmF5PHVpbnQ4X3Q+KHsxLCAyLCAzfSkpOworCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkSW50cywgTWFrZTJkQXJyYXk8aW50MzJfdD4oezEsIDIsIDN9KSk7CisKKyAgLy8gTm90LW51bGxhYmxlCisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkQmluZGVycywKKyAgICAgICAgICAgICAgTWFrZTJkQXJyYXk8U3BBSUJpbmRlcj4oe2JpbmRlcjEsIGJpbmRlcjIsIGJpbmRlcjMsIGJpbmRlcjEsIGJpbmRlcjIsIGJpbmRlcjN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRQYXJjZWxhYmxlcywKKyAgICAgICAgICAgICAgTWFrZTJkQXJyYXk8SW50UGFyY2VsYWJsZT4oe3AxLCBwMiwgcDN9KSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25ka19wcmltaXRpdmVzX3Rlc3QuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcHJpbWl0aXZlc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODIzNTRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfcHJpbWl0aXZlc190ZXN0LmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U7Cit1c2luZyB0ZXN0aW5nOjpFcTsKKworc3RydWN0IEFpZGxUZXN0IDogdGVzdGluZzo6VGVzdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnNoYXJlZF9wdHI8VD4gZ2V0U2VydmljZSgpIHsKKyAgICBuZGs6OlNwQUlCaW5kZXIgYmluZGVyID0gbmRrOjpTcEFJQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKFQ6OmRlc2NyaXB0b3IpKTsKKyAgICByZXR1cm4gVDo6ZnJvbUJpbmRlcihiaW5kZXIpOworICB9Cit9OworCitURVNUX0YoQWlkbFRlc3QsIEludGVyZmFjZUV4Y2hhbmdlKSB7CisgIGF1dG8gc2VydmljZSA9IGdldFNlcnZpY2U8SVRlc3RTZXJ2aWNlPigpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXMgPSB7IkxhcnJ5IiwgIkN1cmx5IiwgIk1vZSJ9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SU5hbWVkQ2FsbGJhY2s+IGdvdDsKKyAgICBBU1NFUlRfVFJVRShzZXJ2aWNlLT5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWVzW2ldLCAmZ290KS5pc09rKCkpOworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgQVNTRVJUX1RSVUUoZ290LT5HZXROYW1lKCZuYW1lKS5pc09rKCkpOworICAgIEFTU0VSVF9USEFUKG5hbWUsIEVxKG5hbWVzW2ldKSk7CisgIH0KKyAgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4+IGdvdDsKKyAgICBBU1NFUlRfVFJVRShzZXJ2aWNlLT5HZXRJbnRlcmZhY2VBcnJheShuYW1lcywgJmdvdCkuaXNPaygpKTsKKworICAgIGJvb2wgdmVyaWZpZWQgPSBmYWxzZTsKKyAgICBBU1NFUlRfVFJVRShzZXJ2aWNlLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShnb3QsIG5hbWVzLCAmdmVyaWZpZWQpLmlzT2soKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZpZWQpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgIEFTU0VSVF9UUlVFKGdvdFtpXS0+R2V0TmFtZSgmbmFtZSkuaXNPaygpKTsKKyAgICAgIEFTU0VSVF9USEFUKG5hbWUsIEVxKG5hbWVzW2ldKSk7CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4gbmFtZXMgPSB7IkxhcnJ5Iiwgc3RkOjpudWxsb3B0LCAiTW9lIn07CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SU5hbWVkQ2FsbGJhY2s+Pj4gZ290OworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkobmFtZXMsICZnb3QpLmlzT2soKSk7CisgICAgYm9vbCB2ZXJpZmllZCA9IGZhbHNlOworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoZ290LCBuYW1lcywgJnZlcmlmaWVkKS5pc09rKCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmaWVkKTsKKyAgICBBU1NFUlRfVFJVRShnb3QuaGFzX3ZhbHVlKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChuYW1lc1tpXS5oYXNfdmFsdWUoKSkgeworICAgICAgICBBU1NFUlRfTkUoZ290LT5hdChpKS5nZXQoKSwgbnVsbHB0cik7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIEFTU0VSVF9UUlVFKGdvdC0+YXQoaSktPkdldE5hbWUoJm5hbWUpLmlzT2soKSk7CisgICAgICAgIEFTU0VSVF9USEFUKG5hbWUsIEVxKG5hbWVzW2ldLnZhbHVlKCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUShnb3QtPmF0KGkpLmdldCgpLCBudWxscHRyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+PiBuYW1lcyA9IHsiTGFycnkiLCBzdGQ6Om51bGxvcHQsICJNb2UifTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJTmFtZWRDYWxsYmFjaz4+PiBnb3Q7CisgICAgQVNTRVJUX1RSVUUoc2VydmljZS0+R2V0SW50ZXJmYWNlTGlzdChuYW1lcywgJmdvdCkuaXNPaygpKTsKKyAgICBib29sIHZlcmlmaWVkID0gZmFsc2U7CisgICAgQVNTRVJUX1RSVUUoc2VydmljZS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChnb3QsIG5hbWVzLCAmdmVyaWZpZWQpLmlzT2soKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZpZWQpOworICAgIEFTU0VSVF9UUlVFKGdvdC5oYXNfdmFsdWUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKG5hbWVzW2ldLmhhc192YWx1ZSgpKSB7CisgICAgICAgIEFTU0VSVF9ORShnb3QtPmF0KGkpLmdldCgpLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZ290LT5hdChpKS0+R2V0TmFtZSgmbmFtZSkuaXNPaygpKTsKKyAgICAgICAgQVNTRVJUX1RIQVQobmFtZSwgRXEobmFtZXNbaV0udmFsdWUoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKGdvdC0+YXQoaSkuZ2V0KCksIG51bGxwdHIpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfc3RyaW5nc190ZXN0LmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3N0cmluZ3NfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyM2Q3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3N0cmluZ3NfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KKwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTsKK3VzaW5nIHRlc3Rpbmc6OkVxOworCitzdHJ1Y3QgQWlkbFRlc3QgOiB0ZXN0aW5nOjpUZXN0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0ZDo6c2hhcmVkX3B0cjxUPiBnZXRTZXJ2aWNlKCkgeworICAgIG5kazo6U3BBSUJpbmRlciBiaW5kZXIgPSBuZGs6OlNwQUlCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoVDo6ZGVzY3JpcHRvcikpOworICAgIHJldHVybiBUOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIH0KKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBzZXJ2aWNlID0gZ2V0U2VydmljZTxJVGVzdFNlcnZpY2U+KCk7CisgICAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5nZXRCYWNrZW5kVHlwZSgmYmFja2VuZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLmdldERlc2NyaXB0aW9uKCk7CisgIH0KKyAgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4gc2VydmljZTsKKyAgQmFja2VuZFR5cGUgYmFja2VuZDsKK307CisKK1RFU1RfRihBaWRsVGVzdCwgcmVwZWF0VXRmOFN0cmluZykgeworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdXRmOF9pbnB1dHMgPSB7CisgICAgICBzdGQ6OnN0cmluZygiRGVsaXZlciB1cyBmcm9tIGV2aWwuIiksCisgICAgICBzdGQ6OnN0cmluZygpLAorICAgICAgc3RkOjpzdHJpbmcoIlwwXDAiLCAyKSwKKyAgICAgIC8vIFNpbWlsYXJseSwgdGhlIHV0ZjggZW5jb2RpbmdzIG9mIHRoZSBzbWFsbCBsZXR0ZXIgeWVlIGFuZCBldXJvIHNpZ24uCisgICAgICBzdGQ6OnN0cmluZygiXHhGMFx4OTBceDkwXHhCN1x4RTJceDgyXHhBQyIpLAorICAgICAgSVRlc3RTZXJ2aWNlOjpTVFJJTkdfVEVTVF9DT05TVEFOVF9VVEY4LAorICB9OworCisgIGZvciAoY29uc3QgYXV0byYgaW5wdXQgOiB1dGY4X2lucHV0cykgeworICAgIHN0ZDo6c3RyaW5nIHJlcGx5OworICAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmVwZWF0VXRmOENwcFN0cmluZyhpbnB1dCwgJnJlcGx5KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBBU1NFUlRfVEhBVChyZXBseSwgRXEoaW5wdXQpKTsKKyAgfQorCisgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IHJlcGx5OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhzdGQ6Om51bGxvcHQsICZyZXBseSk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICBBU1NFUlRfRkFMU0UocmVwbHkuaGFzX3ZhbHVlKCkpOworCisgIGZvciAoY29uc3QgYXV0byYgaW5wdXQgOiB1dGY4X2lucHV0cykgeworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IHJlcGx5OworICAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGlucHV0LCAmcmVwbHkpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9UUlVFKHJlcGx5Lmhhc192YWx1ZSgpKTsKKyAgICBBU1NFUlRfVEhBVCgqcmVwbHksIEVxKGlucHV0KSk7CisgIH0KK30KKworVEVTVF9GKEFpZGxUZXN0LCByZXZlcnNlVXRmOFN0cmluZ0FycmF5KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbnB1dCA9IHsiYSIsICIiLCAiXHhjM1x4YjgifTsKKyAgZGVjbHR5cGUoaW5wdXQpIHJlcGVhdGVkOworICBpZiAoYmFja2VuZCA9PSBCYWNrZW5kVHlwZTo6SkFWQSkgeworICAgIHJlcGVhdGVkID0gZGVjbHR5cGUoaW5wdXQpKGlucHV0LnNpemUoKSk7CisgIH0KKyAgZGVjbHR5cGUoaW5wdXQpIHJldmVyc2VkOworCisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmV2ZXJzZVV0ZjhDcHBTdHJpbmcoaW5wdXQsICZyZXBlYXRlZCwgJnJldmVyc2VkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLmdldERlc2NyaXB0aW9uKCk7CisgIEFTU0VSVF9USEFUKHJlcGVhdGVkLCBFcShpbnB1dCkpOworCisgIGRlY2x0eXBlKGlucHV0KSByZXZlcnNlZF9pbnB1dChpbnB1dCk7CisgIHN0ZDo6cmV2ZXJzZShyZXZlcnNlZF9pbnB1dC5iZWdpbigpLCByZXZlcnNlZF9pbnB1dC5lbmQoKSk7CisgIEFTU0VSVF9USEFUKHJldmVyc2VkLCBFcShyZXZlcnNlZF9pbnB1dCkpOworfQorCitzdHJ1Y3QgQWlkbFN0cmluZ0FycmF5VGVzdCA6IHB1YmxpYyBBaWRsVGVzdCB7CisgIHZvaWQgRG9UZXN0KDo6bmRrOjpTY29wZWRBU3RhdHVzIChJVGVzdFNlcnZpY2U6OipmdW5jKSgKKyAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYsCisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qLAorICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KikpIHsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5wdXQ7CisgICAgZGVjbHR5cGUoaW5wdXQpIHJlcGVhdGVkOworICAgIGRlY2x0eXBlKGlucHV0KSByZXZlcnNlZDsKKworICAgIGF1dG8gc3RhdHVzID0gKCpzZXJ2aWNlLipmdW5jKShpbnB1dCwgJnJlcGVhdGVkLCAmcmV2ZXJzZWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy5nZXREZXNjcmlwdGlvbigpOworCisgICAgaWYgKGZ1bmMgPT0gJklUZXN0U2VydmljZTo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0ICYmIGJhY2tlbmQgPT0gQmFja2VuZFR5cGU6OkpBVkEpIHsKKyAgICAgIC8vIEphdmEgY2Fubm90IGNsZWFyIHRoZSBpbnB1dCB2YXJpYWJsZSB0byByZXR1cm4gYSBudWxsIHZhbHVlLiBJdCBjYW4KKyAgICAgIC8vIG9ubHkgZXZlciBmaWxsIG91dCBhIGxpc3QuCisgICAgICBBU1NFUlRfVFJVRShyZXBlYXRlZC5oYXNfdmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9GQUxTRShyZXBlYXRlZC5oYXNfdmFsdWUoKSk7CisgICAgfQorCisgICAgQVNTRVJUX0ZBTFNFKHJldmVyc2VkLmhhc192YWx1ZSgpKTsKKworICAgIGlucHV0ID0gc3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+KCk7CisgICAgaW5wdXQtPnB1c2hfYmFjaygiRGVsaXZlciB1cyBmcm9tIGV2aWwuIik7CisgICAgaW5wdXQtPnB1c2hfYmFjayhzdGQ6Om51bGxvcHQpOworICAgIGlucHV0LT5wdXNoX2JhY2soIlx4RjBceDkwXHg5MFx4QjdceEUyXHg4Mlx4QUMiKTsKKworICAgIC8vIHVzYWJsZSBzaXplIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGZvciBKYXZhCisgICAgcmVwZWF0ZWQgPSBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4oaW5wdXQtPnNpemUoKSk7CisKKyAgICBzdGF0dXMgPSAoKnNlcnZpY2UuKmZ1bmMpKGlucHV0LCAmcmVwZWF0ZWQsICZyZXZlcnNlZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLmdldERlc2NyaXB0aW9uKCk7CisgICAgQVNTRVJUX1RSVUUocmV2ZXJzZWQuaGFzX3ZhbHVlKCkpOworICAgIEFTU0VSVF9UUlVFKHJlcGVhdGVkLmhhc192YWx1ZSgpKTsKKyAgICBBU1NFUlRfVEhBVChyZXZlcnNlZC0+c2l6ZSgpLCBFcShpbnB1dC0+c2l6ZSgpKSk7CisgICAgQVNTRVJUX1RIQVQocmVwZWF0ZWQtPnNpemUoKSwgRXEoaW5wdXQtPnNpemUoKSkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC0+c2l6ZSgpOyBpKyspIHsKKyAgICAgIGF1dG8gaW5wdXRfc3RyID0gKCppbnB1dClbaV07CisgICAgICBhdXRvIHJlcGVhdGVkX3N0ciA9ICgqcmVwZWF0ZWQpW2ldOworICAgICAgYXV0byByZXZlcnNlZF9zdHIgPSAoKnJldmVyc2VkKVsocmV2ZXJzZWQtPnNpemUoKSAtIDEpIC0gaV07CisgICAgICBpZiAoIWlucHV0X3N0cikgeworICAgICAgICBBU1NFUlRfRkFMU0UocmVwZWF0ZWRfc3RyLmhhc192YWx1ZSgpKTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKHJldmVyc2VkX3N0ci5oYXNfdmFsdWUoKSk7CisgICAgICAgIC8vIDMgbnVsbHB0cnMgdG8gc3RyaW5ncy4gIE5vIG5lZWQgdG8gY29tcGFyZSB2YWx1ZXMuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQVNTRVJUX1RSVUUocmVwZWF0ZWRfc3RyLmhhc192YWx1ZSgpKTsKKyAgICAgIEFTU0VSVF9UUlVFKHJldmVyc2VkX3N0ci5oYXNfdmFsdWUoKSk7CisKKyAgICAgIEFTU0VSVF9USEFUKCpyZXBlYXRlZF9zdHIsIEVxKCppbnB1dF9zdHIpKTsKKyAgICAgIEFTU0VSVF9USEFUKCpyZXZlcnNlZF9zdHIsIEVxKCppbnB1dF9zdHIpKTsKKyAgICB9CisgIH0KK307CisKK1RFU1RfRihBaWRsU3RyaW5nQXJyYXlUZXN0LCBudWxsYWJsZUxpc3QpIHsKKyAgRG9UZXN0KCZJVGVzdFNlcnZpY2U6OlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCk7Cit9CisKK1RFU1RfRihBaWRsU3RyaW5nQXJyYXlUZXN0LCBudWxsYWJsZUFycmF5KSB7CisgIERvVGVzdCgmSVRlc3RTZXJ2aWNlOjpSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmRrX3ZlcnNpb25lZF9pbnRlcmZhY2UuY3BwIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAKaW5kZXggOWQzNGI4Yy4uOTdkYTgzNCAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9uZGtfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAKQEAgLTY0LDggKzY0LDEyIEBACiAKIFRFU1RfRihWZXJzaW9uZWRJbnRlcmZhY2VUZXN0LCByZWFkRGF0YUNvcnJlY3RseUFmdGVyUGFyY2VsYWJsZVdpdGhOZXdGaWVsZCkgewogICBGb28gaW5Gb28sIGlub3V0Rm9vLCBvdXRGb287CisgIGlub3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CisgIG91dEZvby5pbnREZWZhdWx0NDIgPSAwOwogICBpbnQzMl90IHJldDsKICAgYXV0byBzdGF0dXMgPSB2ZXJzaW9uZWQtPmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGluRm9vLCAmaW5vdXRGb28sICZvdXRGb28sIDQzLCAmcmV0KTsKICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzLmdldERlc2NyaXB0aW9uKCk7CiAgIEVYUEVDVF9FUSg0MywgcmV0KTsKKyAgRVhQRUNUX0VRKDAsIGlub3V0Rm9vLmludERlZmF1bHQ0Mik7CisgIEVYUEVDVF9FUSgwLCBvdXRGb28uaW50RGVmYXVsdDQyKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25lc3RlZC5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X25lc3RlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2MzdiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbmVzdGVkLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImFpZGxfdGVzdF9jbGllbnQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwordXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U7Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDsKK3VzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwordXNpbmcgTmVzdGVkUmVzdWx0ID0gYW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdDsKK3VzaW5nIE5lc3RlZFN0YXR1cyA9IGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM7Cit1c2luZyBzdGQ6Om9wdGlvbmFsOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHRlc3Rpbmc6OkVxOwordXNpbmcgdGVzdGluZzo6T3B0aW9uYWw7CisKK1RFU1RfRihBaWRsVGVzdCwgTmVzdGVkU2VydmljZSkgeworICBzcDxJTmVzdGVkU2VydmljZT4gbmVzdGVkU2VydmljZTsKKyAgRVhQRUNUX0VRKGFuZHJvaWQ6Ok9LLCBhbmRyb2lkOjpnZXRTZXJ2aWNlKElOZXN0ZWRTZXJ2aWNlOjpkZXNjcmlwdG9yLCAmbmVzdGVkU2VydmljZSkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbmVzdGVkU2VydmljZSk7CisKKyAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcDsKKyAgcC5zdGF0dXMgPSBOZXN0ZWRTdGF0dXM6Ok9LOworICBOZXN0ZWRSZXN1bHQgcjsKKyAgLy8gT0sgLT4gTk9UX09LCisgIEVYUEVDVF9UUlVFKG5lc3RlZFNlcnZpY2UtPmZsaXBTdGF0dXMocCwgJnIpLmlzT2soKSk7CisgIEVYUEVDVF9FUShyLnN0YXR1cywgTmVzdGVkU3RhdHVzOjpOT1RfT0spOworCisgIC8vIE5PVF9PSyAtPiBPSyB3aXRoIGNhbGxiYWNrIG5lc3RlZCBpbnRlcmZhY2UKKyAgc3RydWN0IENhbGxiYWNrIDogSU5lc3RlZFNlcnZpY2U6OkJuQ2FsbGJhY2sgeworICAgIG9wdGlvbmFsPE5lc3RlZFN0YXR1cz4gcmVzdWx0OworICAgIFN0YXR1cyBkb25lKE5lc3RlZFN0YXR1cyBzdCkgb3ZlcnJpZGUgeworICAgICAgcmVzdWx0ID0gc3Q7CisgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKyAgfTsKKyAgc3A8Q2FsbGJhY2s+IGNiID0gbmV3IENhbGxiYWNrOworICBFWFBFQ1RfVFJVRShuZXN0ZWRTZXJ2aWNlLT5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKHIuc3RhdHVzLCBjYikuaXNPaygpKTsKKyAgRVhQRUNUX1RIQVQoY2ItPnJlc3VsdCwgT3B0aW9uYWwoTmVzdGVkU3RhdHVzOjpPSykpOworCisgIC8vIGFuZHJvaWQ6OmVudW1fcmFuZ2VzPD4KKyAgdmVjdG9yPE5lc3RlZFN0YXR1cz4gdmFsdWVze2FuZHJvaWQ6OmVudW1fcmFuZ2U8TmVzdGVkU3RhdHVzPigpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjplbnVtX3JhbmdlPE5lc3RlZFN0YXR1cz4oKS5lbmQoKX07CisgIEVYUEVDVF9FUSh2YWx1ZXMsIHZlY3RvcjxOZXN0ZWRTdGF0dXM+KHtOZXN0ZWRTdGF0dXM6Ok9LLCBOZXN0ZWRTdGF0dXM6Ok5PVF9PS30pKTsKKworICAvLyB0b1N0cmluZygpCisgIEVYUEVDVF9FUSh0b1N0cmluZyhOZXN0ZWRTdGF0dXM6Ok5PVF9PSyksICJOT1RfT0siKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbnVsbGFibGVzLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfbnVsbGFibGVzLmNwcAppbmRleCA5YTkzMWY4Li42Y2VkZjYzIDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X251bGxhYmxlcy5jcHAKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9udWxsYWJsZXMuY3BwCkBAIC05NSwxMCArOTUsOCBAQAogfQogCiBURVNUX0YoUmVwZWF0TnVsbGFibGVUZXN0LCBwYXJjZWxhYmxlKSB7Ci0gIGF1dG8gaW5wdXQgPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8U3RydWN0dXJlZFBhcmNlbGFibGU+KCk7Ci0gIGlucHV0LT5mID0gNDI7Ci0KLSAgc3RkOjpvcHRpb25hbDxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4gb3V0cHV0OworICBhdXRvIGlucHV0ID0gc3RkOjptYWtlX29wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+KCk7CisgIHN0ZDo6b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4gb3V0cHV0OwogICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShpbnB1dCwgJm91dHB1dCk7CiAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOwogICBBU1NFUlRfVFJVRShvdXRwdXQuaGFzX3ZhbHVlKCkpOwpAQCAtMTEwLDYgKzEwOCwyMCBAQAogICBBU1NFUlRfRkFMU0Uob3V0cHV0Lmhhc192YWx1ZSgpKTsKIH0KIAorVEVTVF9GKFJlcGVhdE51bGxhYmxlVGVzdCwgcGFyY2VsYWJsZUFycmF5KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+IGlucHV0OworICBpbnB1dC5wdXNoX2JhY2soSVRlc3RTZXJ2aWNlOjpFbXB0eSgpKTsKKyAgaW5wdXQucHVzaF9iYWNrKHN0ZDo6bnVsbG9wdCk7CisgIERvVGVzdCgmSVRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSwgc3RkOjptYWtlX29wdGlvbmFsKGlucHV0KSk7Cit9CisKK1RFU1RfRihSZXBlYXROdWxsYWJsZVRlc3QsIHBhcmNlbGFibGVMaXN0KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+IGlucHV0OworICBpbnB1dC5wdXNoX2JhY2soSVRlc3RTZXJ2aWNlOjpFbXB0eSgpKTsKKyAgaW5wdXQucHVzaF9iYWNrKHN0ZDo6bnVsbG9wdCk7CisgIERvVGVzdCgmSVRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0LCBzdGQ6Om1ha2Vfb3B0aW9uYWwoaW5wdXQpKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBudWxsQmluZGVyKSB7CiAgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXIobnVsbHB0cik7CiAKQEAgLTEyMSwxMCArMTMzLDggQEAKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJMaXN0V2l0aE51bGwpIHsKLSAgaWYgKCFjcHBfamF2YV90ZXN0cykgR1RFU1RfU0tJUCgpIDw8ICJTZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIENQUC9KYXZhLW9ubHkgdGVzdHMuIjsKLQogICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gaW5wdXR7bmV3IEJCaW5kZXIoKSwgbnVsbHB0cn07Ci0gIGF1dG8gc3RhdHVzID0gY3BwX2phdmFfdGVzdHMtPlRha2VzQW5JQmluZGVyTGlzdChpbnB1dCk7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKIAogICBpZiAoYmFja2VuZCA9PSBCYWNrZW5kVHlwZTo6SkFWQSkgewogICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1czsKQEAgLTE0MCwxMCArMTUwLDggQEAKIH0KIAogVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJMaXN0V2l0aG91dE51bGwpIHsKLSAgaWYgKCFjcHBfamF2YV90ZXN0cykgR1RFU1RfU0tJUCgpIDw8ICJTZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIENQUC9KYXZhLW9ubHkgdGVzdHMuIjsKLQogICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gaW5wdXR7bmV3IEJCaW5kZXIoKSwgbmV3IEJCaW5kZXIoKX07Ci0gIGF1dG8gc3RhdHVzID0gY3BwX2phdmFfdGVzdHMtPlRha2VzQW5JQmluZGVyTGlzdChpbnB1dCk7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CiB9CiAKQEAgLTE1MywxMyArMTYxLDQ3IEBACiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgYmluZGVyTGlzdFdpdGhOdWxsVG9Bbm5vdGF0ZWRNZXRob2QpIHsKLSAgaWYgKCFjcHBfamF2YV90ZXN0cykgR1RFU1RfU0tJUCgpIDw8ICJTZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIENQUC9KYXZhLW9ubHkgdGVzdHMuIjsKLQogICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gaW5wdXR7bmV3IEJCaW5kZXIoKSwgbnVsbHB0cn07Ci0gIGF1dG8gc3RhdHVzID0gY3BwX2phdmFfdGVzdHMtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOwogICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKIH0KIAorVEVTVF9GKEFpZGxUZXN0LCBiaW5kZXJBcnJheSkgeworICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gcmVwZWF0ZWQ7CisgIGlmIChiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBKSB7CisgICAgLy8gSmF2YSBjYW4gb25seSBtb2RpZnkgb3V0LWFyZ3VtZW50IGFycmF5cyBpbi1wbGFjZQorICAgIHJlcGVhdGVkLnJlc2l6ZSgyKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiByZXZlcnNlZDsKKyAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IGlucHV0e25ldyBCQmluZGVyKCksIG5ldyBCQmluZGVyKCl9OworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlJldmVyc2VJQmluZGVyQXJyYXkoaW5wdXQsICZyZXBlYXRlZCwgJnJldmVyc2VkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzOworCisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXBlYXRlZCkpOworICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihyZXZlcnNlZCksIHN0ZDo6ZW5kKHJldmVyc2VkKSk7CisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXZlcnNlZCkpOworfQorCitURVNUX0YoQWlkbFRlc3QsIG51bGxhYmxlQmluZGVyQXJyYXkpIHsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4+IHJlcGVhdGVkOworICBpZiAoYmFja2VuZCA9PSBCYWNrZW5kVHlwZTo6SkFWQSkgeworICAgIC8vIEphdmEgY2FuIG9ubHkgbW9kaWZ5IG91dC1hcmd1bWVudCBhcnJheXMgaW4tcGxhY2UKKyAgICByZXBlYXRlZCA9IHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PigpOworICAgIHJlcGVhdGVkLT5yZXNpemUoMik7CisgIH0KKworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+Pj4gcmV2ZXJzZWQ7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+PiBpbnB1dCA9IHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PntuZXcgQkJpbmRlcigpLCBudWxscHRyfTsKKyAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5wdXQsICZyZXBlYXRlZCwgJnJldmVyc2VkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSkgPDwgc3RhdHVzOworCisgIEVYUEVDVF9USEFUKGlucHV0LCBFcShyZXBlYXRlZCkpOworICBBU1NFUlRfVFJVRShyZXZlcnNlZCk7CisgIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKCpyZXZlcnNlZCksIHN0ZDo6ZW5kKCpyZXZlcnNlZCkpOworICBFWFBFQ1RfVEhBVChpbnB1dCwgRXEocmV2ZXJzZWQpKTsKK30KKwogVEVTVF9GKEFpZGxUZXN0LCBub25OdWxsQmluZGVyVG9Bbm5vdGF0ZWRNZXRob2QpIHsKICAgc3A8SUJpbmRlcj4gaW5wdXQgPSBuZXcgQkJpbmRlcigpOwogICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQU51bGxhYmxlSUJpbmRlcihpbnB1dCk7CkBAIC0xNjcsMTAgKzIwOSw4IEBACiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgYmluZGVyTGlzdFdpdGhvdXROdWxsVG9Bbm5vdGF0ZWRNZXRob2QpIHsKLSAgaWYgKCFjcHBfamF2YV90ZXN0cykgR1RFU1RfU0tJUCgpIDw8ICJTZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIENQUC9KYXZhLW9ubHkgdGVzdHMuIjsKLQogICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gaW5wdXR7bmV3IEJCaW5kZXIoKSwgbmV3IEJCaW5kZXIoKX07Ci0gIGF1dG8gc3RhdHVzID0gY3BwX2phdmFfdGVzdHMtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOwogICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9wYXJjZWxhYmxlcy5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3BhcmNlbGFibGVzLmNwcAppbmRleCA1ZDAwYWE4Li45OTA1MmJjIDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3BhcmNlbGFibGVzLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3BhcmNlbGFibGVzLmNwcApAQCAtMTQsMTEgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgogI2luY2x1ZGUgImFpZGxfdGVzdF9jbGllbnQuaCIKIAogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTI3LDYgKzI5LDkgQEAKIHVzaW5nIGFuZHJvaWQ6OklJbnRlcmZhY2U7CiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU7Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFkUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazsKQEAgLTM0LDYgKzM5LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6T3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmc7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6UGFyY2VsYWJsZUZvclRvU3RyaW5nOwordXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3Q7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6U2ltcGxlUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjsKQEAgLTQyLDExICs0OCwzNSBAQAogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6TXlFeHQyOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6TXlFeHRMaWtlOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uOwordXNpbmcgSW50UGFyY2VsYWJsZSA9IGFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU7Cit1c2luZyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgPQorICAgIGFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTsKK3VzaW5nIGFuZHJvaWQ6OkJCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpJQmluZGVyOwordXNpbmcgYW5kcm9pZDo6T0s7CiB1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIHVzaW5nIGFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjp2ZWN0b3I7CiAKK1RFU1RfRihBaWRsVGVzdCwgQmFkUGFyY2VsYWJsZSkgeworICBpZiAoIWNwcF9qYXZhX3Rlc3RzKSBHVEVTVF9TS0lQKCkgPDwgIlNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ1BQL0phdmEtb25seSB0ZXN0cy4iOworCisgIEJhZFBhcmNlbGFibGUgb3V0cHV0OworICB7CisgICAgQmFkUGFyY2VsYWJsZSBiYWQoLypiYWQ9Ki90cnVlLCAiQm9veWEiLCA0Mik7CisgICAgU3RhdHVzIHN0YXR1cyA9IGNwcF9qYXZhX3Rlc3RzLT5SZXBlYXRCYWRQYXJjZWxhYmxlKGJhZCwgJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBTdGF0dXM6OkV4Y2VwdGlvbjo6RVhfQkFEX1BBUkNFTEFCTEUpOworICB9CisgIHsKKyAgICBCYWRQYXJjZWxhYmxlIG5vdF9iYWQoLypiYWQ9Ki9mYWxzZSwgIkJvb3lhIiwgNDIpOworICAgIFN0YXR1cyBzdGF0dXMgPSBjcHBfamF2YV90ZXN0cy0+UmVwZWF0QmFkUGFyY2VsYWJsZShub3RfYmFkLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEobm90X2JhZCwgb3V0cHV0KTsKKyAgfQorfQorCiBURVNUX0YoQWlkbFRlc3QsIFJlcGVhdFNpbXBsZVBhcmNlbGFibGUpIHsKICAgaWYgKCFjcHBfamF2YV90ZXN0cykgR1RFU1RfU0tJUCgpIDw8ICJTZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIENQUC9KYXZhLW9ubHkgdGVzdHMuIjsKIApAQCAtMjk1LDYgKzMyNSwxMCBAQAogICBFWFBFQ1RfRVEocGFyY2VsYWJsZS5pbnQ2NF9tYXgsIElOVDY0X01BWCk7CiAgIEVYUEVDVF9FUShwYXJjZWxhYmxlLmhleEludDMyX25lZ18xLCAtMSk7CiAKKyAgZm9yIChzaXplX3QgbmR4ID0gMDsgbmR4IDwgcGFyY2VsYWJsZS5pbnQ4XzEuc2l6ZSgpOyBuZHgrKykgeworICAgIEVYUEVDVF9FUShwYXJjZWxhYmxlLmludDhfMVtuZHhdLCAxKSA8PCBuZHg7CisgIH0KKwogICBmb3IgKHNpemVfdCBuZHggPSAwOyBuZHggPCBwYXJjZWxhYmxlLmludDMyXzEuc2l6ZSgpOyBuZHgrKykgewogICAgIEVYUEVDVF9FUShwYXJjZWxhYmxlLmludDMyXzFbbmR4XSwgMSkgPDwgbmR4OwogICB9CkBAIC01MTYsMyArNTUwLDE0NSBAQAogCiAgIEVYUEVDVF9FUShleHBlY3RlZCwgcC50b1N0cmluZygpKTsKIH0KKworVEVTVF9GKEFpZGxUZXN0LCBSZXZlcnNlUmVjdXJzaXZlTGlzdCkgeworICBzdGQ6OnVuaXF1ZV9wdHI8UmVjdXJzaXZlTGlzdD4gaGVhZDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgYXV0byBub2RlID0gc3RkOjptYWtlX3VuaXF1ZTxSZWN1cnNpdmVMaXN0PigpOworICAgIG5vZGUtPnZhbHVlID0gaTsKKyAgICBub2RlLT5uZXh0ID0gc3RkOjptb3ZlKGhlYWQpOworICAgIGhlYWQgPSBzdGQ6Om1vdmUobm9kZSk7CisgIH0KKyAgLy8gaGVhZDogWzksIDgsIC4uLiAwXQorCisgIFJlY3Vyc2l2ZUxpc3QgcmV2ZXJzZWQ7CisgIGF1dG8gc3RhdHVzID0gc2VydmljZS0+UmV2ZXJzZUxpc3QoKmhlYWQsICZyZXZlcnNlZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpIDw8IHN0YXR1cy50b1N0cmluZzgoKTsKKworICAvLyByZXZlcnNlZCBzaG91bGQgYmUgWzAsIDEsIC4uIDldCisgIFJlY3Vyc2l2ZUxpc3QqIGN1ciA9ICZyZXZlcnNlZDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGksIGN1ci0+dmFsdWUpOworICAgIGN1ciA9IGN1ci0+bmV4dC5nZXQoKTsKKyAgfQorICBFWFBFQ1RfRVEobnVsbHB0ciwgY3VyKTsKK30KKworVEVTVF9GKEFpZGxUZXN0LCBGaXhlZFNpemVBcnJheSkgeworICBhbmRyb2lkOjpQYXJjZWwgcGFyY2VsOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBwOworICBwLmJ5dGVNYXRyaXhbMF1bMF0gPSAwOworICBwLmJ5dGVNYXRyaXhbMF1bMV0gPSAxOworICBwLmJ5dGVNYXRyaXhbMV1bMF0gPSAyOworICBwLmJ5dGVNYXRyaXhbMV1bMV0gPSAzOworICBwLmZsb2F0TWF0cml4WzBdWzBdID0gMC5mOworICBwLmZsb2F0TWF0cml4WzBdWzFdID0gMS5mOworICBwLmZsb2F0TWF0cml4WzFdWzBdID0gMi5mOworICBwLmZsb2F0TWF0cml4WzFdWzFdID0gMy5mOworICBFWFBFQ1RfRVEoT0ssIHAud3JpdGVUb1BhcmNlbCgmcGFyY2VsKSk7CisKKyAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKKworICBGaXhlZFNpemVBcnJheUV4YW1wbGUgcTsKKyAgRVhQRUNUX0VRKE9LLCBxLnJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpKTsKKyAgRVhQRUNUX0VRKHAsIHEpOworfQorCitURVNUX0YoQWlkbFRlc3QsIEZpeGVkU2l6ZUFycmF5V2l0aFZhbHVlc0F0TnVsbGFibGVGaWVsZHMpIHsKKyAgYW5kcm9pZDo6UGFyY2VsIHBhcmNlbDsKKworICBGaXhlZFNpemVBcnJheUV4YW1wbGUgcDsKKyAgcC5ib29sTnVsbGFibGVBcnJheSA9IHN0ZDo6YXJyYXk8Ym9vbCwgMj57dHJ1ZSwgZmFsc2V9OworICBwLmJ5dGVOdWxsYWJsZUFycmF5ID0gc3RkOjphcnJheTx1aW50OF90LCAyPns0MiwgMH07CisgIHAuc3RyaW5nTnVsbGFibGVBcnJheSA9IHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4sIDI+eyJoZWxsbyIsICJ3b3JsZCJ9OworCisgIHAuYm9vbE51bGxhYmxlTWF0cml4LmVtcGxhY2UoKTsKKyAgcC5ib29sTnVsbGFibGVNYXRyaXgtPmF0KDApID0gc3RkOjphcnJheTxib29sLCAyPnt0cnVlLCBmYWxzZX07CisgIHAuYnl0ZU51bGxhYmxlTWF0cml4LmVtcGxhY2UoKTsKKyAgcC5ieXRlTnVsbGFibGVNYXRyaXgtPmF0KDApID0gc3RkOjphcnJheTx1aW50OF90LCAyPns0MiwgMH07CisgIHAuc3RyaW5nTnVsbGFibGVNYXRyaXguZW1wbGFjZSgpOworICBwLnN0cmluZ051bGxhYmxlTWF0cml4LT5hdCgwKSA9IHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4sIDI+eyJoZWxsbyIsICJ3b3JsZCJ9OworCisgIEVYUEVDVF9FUShPSywgcC53cml0ZVRvUGFyY2VsKCZwYXJjZWwpKTsKKworICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworCisgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBxOworICBFWFBFQ1RfRVEoT0ssIHEucmVhZEZyb21QYXJjZWwoJnBhcmNlbCkpOworICBFWFBFQ1RfRVEocCwgcSk7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlPZkJ5dGVzU2hvdWxkQmVQYWNrZWQpIHsKKyAgYW5kcm9pZDo6UGFyY2VsIHBhcmNlbDsKKworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+IGJ5dGVfYXJyYXk7CisgIGJ5dGVfYXJyYXlbMF0gPSB7MSwgMiwgM307CisgIGJ5dGVfYXJyYXlbMV0gPSB7NCwgNSwgNn07CisgIEVYUEVDVF9FUShPSywgcGFyY2VsLndyaXRlRml4ZWRBcnJheShieXRlX2FycmF5KSk7CisKKyAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKKworICBpbnQzMl90IGxlbjsKKyAgRVhQRUNUX0VRKE9LLCBwYXJjZWwucmVhZEludDMyKCZsZW4pKTsKKyAgRVhQRUNUX0VRKDIsIGxlbik7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVfdmVjdG9yOworICBFWFBFQ1RfRVEoT0ssIHBhcmNlbC5yZWFkQnl0ZVZlY3RvcigmYnl0ZV92ZWN0b3IpKTsKKyAgRVhQRUNUX0VRKGJ5dGVfdmVjdG9yLCAoc3RkOjp2ZWN0b3I8dWludDhfdD57MSwgMiwgM30pKTsKKyAgRVhQRUNUX0VRKE9LLCBwYXJjZWwucmVhZEJ5dGVWZWN0b3IoJmJ5dGVfdmVjdG9yKSk7CisgIEVYUEVDVF9FUShieXRlX3ZlY3RvciwgKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ezQsIDUsIDZ9KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlLCB0eXBlbmFtZSBNZW1GbiwgdHlwZW5hbWUgSW5wdXQ+Cit2b2lkIENoZWNrUmVwZWF0KFNlcnZpY2Ugc2VydmljZSwgTWVtRm4gZm4sIElucHV0IGlucHV0KSB7CisgIElucHV0IG91dDEsIG91dDI7CisgIEVYUEVDVF9UUlVFKHN0ZDo6aW52b2tlKGZuLCBzZXJ2aWNlLCBpbnB1dCwgJm91dDEsICZvdXQyKS5pc09rKCkpOworICBFWFBFQ1RfRVEoaW5wdXQsIG91dDEpOworICBFWFBFQ1RfRVEoaW5wdXQsIG91dDIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6YXJyYXk8c3RkOjphcnJheTxULCAzPiwgMj4gTWFrZTJkQXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8VCwgMz4sIDI+IGFyciA9IHt9OworICBhdXRvIGl0ID0gc3RkOjpiZWdpbih2YWx1ZXMpOworICBmb3IgKGF1dG8mIHJvdyA6IGFycikgeworICAgIGZvciAoYXV0byYgZWwgOiByb3cpIHsKKyAgICAgIGlmIChpdCA9PSBzdGQ6OmVuZCh2YWx1ZXMpKSBicmVhazsKKyAgICAgIGVsID0gKml0Kys7CisgICAgfQorICB9CisgIHJldHVybiBhcnI7Cit9CisKK1RFU1RfRihBaWRsVGVzdCwgRml4ZWRTaXplQXJyYXlPdmVyQmluZGVyKSB7CisgIHNwPElSZXBlYXRGaXhlZFNpemVBcnJheT4gc2VydmljZTsKKyAgQVNTRVJUX0VRKE9LLCBnZXRTZXJ2aWNlKElSZXBlYXRGaXhlZFNpemVBcnJheTo6ZGVzY3JpcHRvciwgJnNlcnZpY2UpKTsKKworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRCeXRlcywgKHN0ZDo6YXJyYXk8dWludDhfdCwgMz57MSwgMiwgM30pKTsKKworICBDaGVja1JlcGVhdChzZXJ2aWNlLCAmSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRJbnRzLCAoc3RkOjphcnJheTxpbnQzMl90LCAzPnsxLCAyLCAzfSkpOworCisgIHNwPElCaW5kZXI+IGJpbmRlcjEgPSBuZXcgQkJpbmRlcigpOworICBzcDxJQmluZGVyPiBiaW5kZXIyID0gbmV3IEJCaW5kZXIoKTsKKyAgc3A8SUJpbmRlcj4gYmluZGVyMyA9IG5ldyBCQmluZGVyKCk7CisgIENoZWNrUmVwZWF0KHNlcnZpY2UsICZJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEJpbmRlcnMsCisgICAgICAgICAgICAgIChzdGQ6OmFycmF5PHNwPElCaW5kZXI+LCAzPntiaW5kZXIxLCBiaW5kZXIyLCBiaW5kZXIzfSkpOworCisgIEludFBhcmNlbGFibGUgcDEsIHAyLCBwMzsKKyAgcDEudmFsdWUgPSAxOworICBwMi52YWx1ZSA9IDI7CisgIHAzLnZhbHVlID0gMzsKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0UGFyY2VsYWJsZXMsCisgICAgICAgICAgICAgIChzdGQ6OmFycmF5PEludFBhcmNlbGFibGUsIDM+e3AxLCBwMiwgcDN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRCeXRlcywgTWFrZTJkQXJyYXk8dWludDhfdD4oezEsIDIsIDN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRJbnRzLCBNYWtlMmRBcnJheTxpbnQzMl90Pih7MSwgMiwgM30pKTsKKworICAvLyBOb3QtbnVsbGFibGUKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRCaW5kZXJzLAorICAgICAgICAgICAgICBNYWtlMmRBcnJheTxzcDxJQmluZGVyPj4oe2JpbmRlcjEsIGJpbmRlcjIsIGJpbmRlcjMsIGJpbmRlcjEsIGJpbmRlcjIsIGJpbmRlcjN9KSk7CisKKyAgQ2hlY2tSZXBlYXQoc2VydmljZSwgJklSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRQYXJjZWxhYmxlcywKKyAgICAgICAgICAgICAgTWFrZTJkQXJyYXk8SW50UGFyY2VsYWJsZT4oe3AxLCBwMiwgcDN9KSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9wcmltaXRpdmVzLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfcHJpbWl0aXZlcy5jcHAKaW5kZXggZjE1YjY3ZS4uZWZmNjdjNCAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9wcmltaXRpdmVzLmNwcAorKysgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3ByaW1pdGl2ZXMuY3BwCkBAIC0xOTYsNyArMTk2LDYyIEBACiAgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CiAgICAgaW5wdXQucHVzaF9iYWNrKElOYW1lZENhbGxiYWNrOjphc0JpbmRlcihnb3QpKTsKICAgfQotCisgIHsKKyAgICBzdGQ6OnZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+IGdvdDsKKyAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPkdldEludGVyZmFjZUFycmF5KG5hbWVzLCAmZ290KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBib29sIHZlcmlmaWVkID0gZmFsc2U7CisgICAgc3RhdHVzID0gc2VydmljZS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoZ290LCBuYW1lcywgJnZlcmlmaWVkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZmllZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIFN0cmluZzE2IG5hbWU7CisgICAgICBBU1NFUlRfVFJVRShnb3RbaV0tPkdldE5hbWUoJm5hbWUpLmlzT2soKSk7CisgICAgICBBU1NFUlRfVEhBVChuYW1lLCBFcShuYW1lc1tpXSkpOworICAgIH0KKyAgfQorICB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxTdHJpbmcxNj4+IG5hbWVzID0ge1N0cmluZzE2eyJMYXJyeSJ9LCBzdGQ6Om51bGxvcHQsIFN0cmluZzE2eyJNb2UifX07CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+PiBnb3Q7CisgICAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KG5hbWVzLCAmZ290KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBib29sIHZlcmlmaWVkID0gZmFsc2U7CisgICAgc3RhdHVzID0gc2VydmljZS0+VmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShnb3QsIG5hbWVzLCAmdmVyaWZpZWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmaWVkKTsKKyAgICBBU1NFUlRfVFJVRShnb3QuaGFzX3ZhbHVlKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBpZiAobmFtZXNbaV0uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgQVNTRVJUX05FKGdvdC0+YXQoaSkuZ2V0KCksIG51bGxwdHIpOworICAgICAgICBTdHJpbmcxNiBuYW1lOworICAgICAgICBBU1NFUlRfVFJVRShnb3QtPmF0KGkpLT5HZXROYW1lKCZuYW1lKS5pc09rKCkpOworICAgICAgICBBU1NFUlRfVEhBVChuYW1lLCBFcShuYW1lc1tpXS52YWx1ZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoZ290LT5hdChpKS5nZXQoKSwgbnVsbHB0cik7CisgICAgICB9CisgICAgfQorICB9CisgIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPFN0cmluZzE2Pj4gbmFtZXMgPSB7U3RyaW5nMTZ7IkxhcnJ5In0sIHN0ZDo6bnVsbG9wdCwgU3RyaW5nMTZ7Ik1vZSJ9fTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4+IGdvdDsKKyAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPkdldEludGVyZmFjZUxpc3QobmFtZXMsICZnb3QpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIGJvb2wgdmVyaWZpZWQgPSBmYWxzZTsKKyAgICBzdGF0dXMgPSBzZXJ2aWNlLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGdvdCwgbmFtZXMsICZ2ZXJpZmllZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZpZWQpOworICAgIEFTU0VSVF9UUlVFKGdvdC5oYXNfdmFsdWUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIGlmIChuYW1lc1tpXS5oYXNfdmFsdWUoKSkgeworICAgICAgICBBU1NFUlRfTkUoZ290LT5hdChpKS5nZXQoKSwgbnVsbHB0cik7CisgICAgICAgIFN0cmluZzE2IG5hbWU7CisgICAgICAgIEFTU0VSVF9UUlVFKGdvdC0+YXQoaSktPkdldE5hbWUoJm5hbWUpLmlzT2soKSk7CisgICAgICAgIEFTU0VSVF9USEFUKG5hbWUsIEVxKG5hbWVzW2ldLnZhbHVlKCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUShnb3QtPmF0KGkpLmdldCgpLCBudWxscHRyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KICAgaWYgKGNwcF9qYXZhX3Rlc3RzKSB7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IG91dHB1dDsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gcmV2ZXJzZWQ7CmRpZmYgLS1naXQgYS90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3NlcnZpY2VfZXhjZXB0aW9ucy5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3NlcnZpY2VfZXhjZXB0aW9ucy5jcHAKaW5kZXggZGYzYjI5Zi4uODlkYzE5YyAxMDA2NDQKLS0tIGEvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF9zZXJ2aWNlX2V4Y2VwdGlvbnMuY3BwCisrKyBiL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfc2VydmljZV9leGNlcHRpb25zLmNwcApAQCAtMjQsMTYgKzI0LDEyIEBACiB9CiAKIFRFU1RfRihBaWRsVGVzdCwgc2VydmljZVNwZWNpZmljRXhjZXB0aW9uKSB7Ci0gIGlmIChiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBKSB7Ci0gICAgLy8gVE9ETyhiLzE2OTcwNDQ4MCk6IGludmVzdGlnYXRlIHdoeSB0aGlzIGlzIHJldHVybmluZyAndW5leHBlY3RlZCBudWxsJwotICAgIEdURVNUX1NLSVAoKSA8PCAiQnJva2VuIGluIEphdmE/IGIvMTY5NzA0NDgwIjsKLSAgfQotCiAgIHVzaW5nIHRlc3Rpbmc6OkVxOwogCiAgIGZvciAoaW50MzJfdCBpID0gLTE7IGkgPCAyOyArK2kpIHsKICAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPlRocm93U2VydmljZUV4Y2VwdGlvbihpKTsKLSAgICBBU1NFUlRfVEhBVChzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBFcShhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfU0VSVklDRV9TUEVDSUZJQykpIDw8IHN0YXR1czsKLSAgICBBU1NFUlRfVEhBVChzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCksIEVxKGkpKSA8PCBzdGF0dXM7CisgICAgRVhQRUNUX1RIQVQoc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgRXEoYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX1NFUlZJQ0VfU1BFQ0lGSUMpKQorICAgICAgICA8PCBzdGF0dXMgPDwgIiBmb3IgIiA8PCBpOworICAgIEVYUEVDVF9USEFUKHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSwgRXEoaSkpIDw8IHN0YXR1cyA8PCAiIGZvciAiIDw8IGk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAgYi90ZXN0cy9haWRsX3Rlc3RfY2xpZW50X3ZlcnNpb25lZF9pbnRlcmZhY2UuY3BwCmluZGV4IGM0MmE0MWIuLjIyYTg4N2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FpZGxfdGVzdF9jbGllbnRfdmVyc2lvbmVkX2ludGVyZmFjZS5jcHAKKysrIGIvdGVzdHMvYWlkbF90ZXN0X2NsaWVudF92ZXJzaW9uZWRfaW50ZXJmYWNlLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQm5Gb29JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KQEAgLTI3LDYgKzI4LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OkJhelVuaW9uOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6Rm9vOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dmVyc2lvbmVkOjp0ZXN0czo6SUZvb0ludGVyZmFjZTsKK3VzaW5nIGFuZHJvaWQ6OmFpZGw6OnZlcnNpb25lZDo6dGVzdHM6OklGb29JbnRlcmZhY2VEZWxlZ2F0b3I7CiAKIGNsYXNzIFZlcnNpb25lZEludGVyZmFjZVRlc3QgOiBwdWJsaWMgQWlkbFRlc3QgewogIHB1YmxpYzoKQEAgLTc5LDggKzgxLDIyIEBACiAKIFRFU1RfRihWZXJzaW9uZWRJbnRlcmZhY2VUZXN0LCByZWFkRGF0YUNvcnJlY3RseUFmdGVyUGFyY2VsYWJsZVdpdGhOZXdGaWVsZCkgewogICBGb28gaW5Gb28sIGlub3V0Rm9vLCBvdXRGb287CisgIGlub3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CisgIG91dEZvby5pbnREZWZhdWx0NDIgPSAwOwogICBpbnQzMl90IHJldDsKICAgYXV0byBzdGF0dXMgPSB2ZXJzaW9uZWQtPmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KGluRm9vLCAmaW5vdXRGb28sICZvdXRGb28sIDQzLCAmcmV0KTsKICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CiAgIEVYUEVDVF9FUSg0MywgcmV0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIEVYUEVDVF9FUSgwLCBpbm91dEZvby5pbnREZWZhdWx0NDIpOworICBFWFBFQ1RfRVEoMCwgb3V0Rm9vLmludERlZmF1bHQ0Mik7Cit9CisKK1RFU1RfRihWZXJzaW9uZWRJbnRlcmZhY2VUZXN0LCBuZXdlckRlbGVnYXRvclJldHVybnNJbXBsVmVyc2lvbikgeworICBhdXRvIGRlbGVnYXRvciA9IHNwPElGb29JbnRlcmZhY2VEZWxlZ2F0b3I+OjptYWtlKHZlcnNpb25lZCk7CisgIEVYUEVDVF9FUSgxLCBkZWxlZ2F0b3ItPmdldEludGVyZmFjZVZlcnNpb24oKSk7Cit9CisKK1RFU1RfRihWZXJzaW9uZWRJbnRlcmZhY2VUZXN0LCBuZXdlckRlbGVnYXRvclJldHVybnNJbXBsSGFzaCkgeworICBhdXRvIGRlbGVnYXRvciA9IHNwPElGb29JbnRlcmZhY2VEZWxlZ2F0b3I+OjptYWtlKHZlcnNpb25lZCk7CisgIEVYUEVDVF9FUSgiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiIsIGRlbGVnYXRvci0+Z2V0SW50ZXJmYWNlSGFzaCgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FpZGxfdGVzdF9zZXJ2aWNlLmNwcCBiL3Rlc3RzL2FpZGxfdGVzdF9zZXJ2aWNlLmNwcAppbmRleCAyMmNkNDJiLi5mMDAwMzcyIDEwMDY0NAotLS0gYS90ZXN0cy9haWRsX3Rlc3Rfc2VydmljZS5jcHAKKysrIGIvdGVzdHMvYWlkbF90ZXN0X3NlcnZpY2UuY3BwCkBAIC01NCw5ICs1NCwxMyBAQAogI2luY2x1ZGUgImFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaCIKICNpbmNsdWRlICJhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5oIgogCisjaW5jbHVkZSAiYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaCIKKwogI2luY2x1ZGUgImFuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaCIKIAorI2luY2x1ZGUgImFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaCIKKwogLy8gVXNlZCBpbXBsaWNpdGx5LgogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiYWlkbF9uYXRpdmVfc2VydmljZSIKQEAgLTgzLDYgKzg3LDcgQEAKIAogLy8gR2VuZXJhdGVkIGNvZGU6CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGU7Cit1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFkUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCbkNwcEphdmFUZXN0czsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCbk5hbWVkQ2FsbGJhY2s7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6Qm5OZXdOYW1lOwpAQCAtOTcsNiArMTAyLDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lOwogdXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtOwordXNpbmcgYW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3Q7CiB1c2luZyBhbmRyb2lkOjphaWRsOjp0ZXN0czo6U2ltcGxlUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZTsKIHVzaW5nIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbjsKQEAgLTE3OCw2ICsxODQsMTEgQEAKICAgQ3BwSmF2YVRlc3RzKCkgPSBkZWZhdWx0OwogICB+Q3BwSmF2YVRlc3RzKCkgPSBkZWZhdWx0OwogCisgIFN0YXR1cyBSZXBlYXRCYWRQYXJjZWxhYmxlKGNvbnN0IEJhZFBhcmNlbGFibGUmIGlucHV0LCBCYWRQYXJjZWxhYmxlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCiAgIFN0YXR1cyBSZXBlYXRTaW1wbGVQYXJjZWxhYmxlKGNvbnN0IFNpbXBsZVBhcmNlbGFibGUmIGlucHV0LCBTaW1wbGVQYXJjZWxhYmxlKiByZXBlYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBhcmNlbGFibGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewogICAgIEFMT0dJKCJSZXBlYXRlZCBhIFNpbXBsZVBhcmNlbGFibGUgJXMiLCBpbnB1dC50b1N0cmluZygpLmNfc3RyKCkpOwpAQCAtMjQ5LDYgKzI2MCw3IEBACiAgIFN0YXR1cyBSZXZlcnNlRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCB2ZWN0b3I8dW5pcXVlX2ZkPiYgaW5wdXQsIHZlY3Rvcjx1bmlxdWVfZmQ+KiByZXBlYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjx1bmlxdWVfZmQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKICAgICBBTE9HSSgiUmV2ZXJzaW5nIGRlc2NyaXB0b3IgYXJyYXkgb2YgbGVuZ3RoICV6dSIsIGlucHV0LnNpemUoKSk7CisgICAgcmVwZWF0ZWQtPmNsZWFyKCk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogaW5wdXQpIHsKICAgICAgIHJlcGVhdGVkLT5wdXNoX2JhY2sodW5pcXVlX2ZkKGR1cChpdGVtLmdldCgpKSkpOwogICAgICAgX2FpZGxfcmV0dXJuLT5wdXNoX2JhY2sodW5pcXVlX2ZkKGR1cChpdGVtLmdldCgpKSkpOwpAQCAtMjU2LDI3ICsyNjgsNiBAQAogICAgIHN0ZDo6cmV2ZXJzZShfYWlkbF9yZXR1cm4tPmJlZ2luKCksIF9haWRsX3JldHVybi0+ZW5kKCkpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgIH0KLQotICBTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHZlY3RvcjxzcDxJQmluZGVyPj4mIGlucHV0KSBvdmVycmlkZSB7Ci0gICAgKHZvaWQpaW5wdXQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotICBTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCBvcHRpb25hbDx2ZWN0b3I8c3A8SUJpbmRlcj4+PiYgaW5wdXQpIHsKLSAgICAodm9pZClpbnB1dDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgKLSAgICAgIGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGVwLAotICAgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogZXAyKSB7Ci0gICAgZXAyLT5hID0gZXAuYTsKLSAgICBlcDItPmIgPSBlcC5iOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpNeUV4dD4gbXlFeHQ7Ci0gICAgZXAuZXh0LmdldFBhcmNlbGFibGUoJm15RXh0KTsKLSAgICBlcDItPmV4dC5zZXRQYXJjZWxhYmxlKG15RXh0KTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KIH07CiAKIGNsYXNzIE5hdGl2ZVNlcnZpY2UgOiBwdWJsaWMgQm5UZXN0U2VydmljZSB7CkBAIC00MzIsNiArNDIzLDkyIEBACiAgICAgcmV0dXJuIHN0YXR1czsKICAgfQogCisgIFN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCB2ZWN0b3I8U3RyaW5nMTY+JiBuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICB2ZWN0b3I8c3A8SU5hbWVkQ2FsbGJhY2s+PiBzZXJ2aWNlcyhuYW1lcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChhdXRvIHN0ID0gR2V0T3RoZXJUZXN0U2VydmljZShuYW1lc1tpXSwgJnNlcnZpY2VzW2ldKTsgIXN0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gc3Q7CisgICAgICB9CisgICAgfQorICAgICpfYWlkbF9yZXR1cm4gPSBzdGQ6Om1vdmUoc2VydmljZXMpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKworICBTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgdmVjdG9yPHNwPElOYW1lZENhbGxiYWNrPj4mIHNlcnZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPFN0cmluZzE2PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldCkgb3ZlcnJpZGUgeworICAgIGlmIChzZXJ2aWNlcy5zaXplKCkgPT0gbmFtZXMuc2l6ZSgpKSB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlcnZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChhdXRvIHN0ID0gVmVyaWZ5TmFtZShzZXJ2aWNlc1tpXSwgbmFtZXNbaV0sIF9haWRsX3JldCk7ICFzdC5pc09rKCkgfHwgISpfYWlkbF9yZXQpIHsKKyAgICAgICAgICByZXR1cm4gc3Q7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICpfYWlkbF9yZXQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAqX2FpZGxfcmV0ID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKworICBTdGF0dXMgR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCBvcHRpb25hbDx2ZWN0b3I8b3B0aW9uYWw8U3RyaW5nMTY+Pj4mIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDx2ZWN0b3I8c3A8SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldCkgb3ZlcnJpZGUgeworICAgIHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+IHNlcnZpY2VzOworICAgIGlmIChuYW1lcy5oYXNfdmFsdWUoKSkgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogKm5hbWVzKSB7CisgICAgICAgIGlmIChuYW1lLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgc3A8SU5hbWVkQ2FsbGJhY2s+IHJldDsKKyAgICAgICAgICBpZiAoYXV0byBzdCA9IEdldE90aGVyVGVzdFNlcnZpY2UoKm5hbWUsICZyZXQpOyAhc3QuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gc3Q7CisgICAgICAgICAgfQorICAgICAgICAgIHNlcnZpY2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUocmV0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VydmljZXMuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgKl9haWRsX3JldCA9IHN0ZDo6bW92ZShzZXJ2aWNlcyk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIFN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxTdHJpbmcxNj4+PiYgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldCkgb3ZlcnJpZGUgeworICAgIGlmIChzZXJ2aWNlcy5oYXNfdmFsdWUoKSAmJiBuYW1lcy5oYXNfdmFsdWUoKSkgeworICAgICAgaWYgKHNlcnZpY2VzLT5zaXplKCkgPT0gbmFtZXMtPnNpemUoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlcnZpY2VzLT5zaXplKCk7IGkrKykgeworICAgICAgICAgIGlmIChzZXJ2aWNlcy0+YXQoaSkuZ2V0KCkgJiYgbmFtZXMtPmF0KGkpLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBpZiAoYXV0byBzdCA9IFZlcmlmeU5hbWUoc2VydmljZXMtPmF0KGkpLCBuYW1lcy0+YXQoaSkudmFsdWUoKSwgX2FpZGxfcmV0KTsKKyAgICAgICAgICAgICAgICAhc3QuaXNPaygpIHx8ICEqX2FpZGxfcmV0KSB7CisgICAgICAgICAgICAgIHJldHVybiBzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VzLT5hdChpKS5nZXQoKSB8fCBuYW1lcy0+YXQoaSkuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgICpfYWlkbF9yZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9rIGlmIHNlcnZpY2U9bnVsbCAmJiBuYW1lPW51bGwKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKl9haWRsX3JldCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAqX2FpZGxfcmV0ID0gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICpfYWlkbF9yZXQgPSBzZXJ2aWNlcy5oYXNfdmFsdWUoKSA9PSBuYW1lcy5oYXNfdmFsdWUoKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIFN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IG9wdGlvbmFsPHZlY3RvcjxvcHRpb25hbDxTdHJpbmcxNj4+PiYgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsPHZlY3RvcjxzcDxJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkobmFtZXMsIF9haWRsX3JldCk7CisgIH0KKworICBTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCBvcHRpb25hbDx2ZWN0b3I8c3A8SU5hbWVkQ2FsbGJhY2s+Pj4mIHNlcnZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25hbDx2ZWN0b3I8b3B0aW9uYWw8U3RyaW5nMTY+Pj4mIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMsIF9haWRsX3JldCk7CisgIH0KKwogICBTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3QgdmVjdG9yPFN0cmluZzE2PiYgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8U3RyaW5nMTY+KiByZXBlYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxTdHJpbmcxNj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewpAQCAtNDkzLDggKzU3MCwyMCBAQAogICAgIHJldHVybiBSZXBlYXROdWxsYWJsZShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKICAgfQogCi0gIFN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgb3B0aW9uYWw8U3RydWN0dXJlZFBhcmNlbGFibGU+JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDxTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4qIF9haWRsX3JldHVybikgeworICBTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IG9wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDxJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFJlcGVhdE51bGxhYmxlKGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisKKyAgU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoCisgICAgICBjb25zdCBvcHRpb25hbDx2ZWN0b3I8b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsCisgICAgICBvcHRpb25hbDx2ZWN0b3I8b3B0aW9uYWw8SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFJlcGVhdE51bGxhYmxlKGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisKKyAgU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KAorICAgICAgY29uc3Qgb3B0aW9uYWw8dmVjdG9yPG9wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGlucHV0LAorICAgICAgb3B0aW9uYWw8dmVjdG9yPG9wdGlvbmFsPElUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgewogICAgIHJldHVybiBSZXBlYXROdWxsYWJsZShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKICAgfQogCkBAIC01MDYsNiArNTk1LDE0IEBACiAgICAgKHZvaWQpaW5wdXQ7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgfQorICBTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHZlY3RvcjxzcDxJQmluZGVyPj4mIGlucHV0KSBvdmVycmlkZSB7CisgICAgKHZvaWQpaW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICBTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCBvcHRpb25hbDx2ZWN0b3I8c3A8SUJpbmRlcj4+PiYgaW5wdXQpIHsKKyAgICAodm9pZClpbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CiAKICAgU3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RyaW5nJiB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKQEAgLTU4Niw2ICs2ODMsNTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICB9CiAKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgKKyAgICAgIGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGVwLAorICAgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogZXAyKSB7CisgICAgZXAyLT5hID0gZXAuYTsKKyAgICBlcDItPmIgPSBlcC5iOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpNeUV4dD4gbXlFeHQ7CisgICAgZXAuZXh0LmdldFBhcmNlbGFibGUoJm15RXh0KTsKKyAgICBlcDItPmV4dC5zZXRQYXJjZWxhYmxlKG15RXh0KTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMaXN0KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIGxpc3QsIFJlY3Vyc2l2ZUxpc3QqIHJldCkgb3ZlcnJpZGUgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWN1cnNpdmVMaXN0PiByZXZlcnNlZDsKKyAgICBjb25zdCBSZWN1cnNpdmVMaXN0KiBjdXIgPSAmbGlzdDsKKyAgICB3aGlsZSAoY3VyKSB7CisgICAgICBhdXRvIG5vZGUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlY3Vyc2l2ZUxpc3Q+KCk7CisgICAgICBub2RlLT52YWx1ZSA9IGN1ci0+dmFsdWU7CisgICAgICBub2RlLT5uZXh0ID0gc3RkOjptb3ZlKHJldmVyc2VkKTsKKyAgICAgIHJldmVyc2VkID0gc3RkOjptb3ZlKG5vZGUpOworICAgICAgY3VyID0gY3VyLT5uZXh0LmdldCgpOworICAgIH0KKyAgICAqcmV0ID0gc3RkOjptb3ZlKCpyZXZlcnNlZCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorCisgIFN0YXR1cyBSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IHZlY3RvcjxzcDxJQmluZGVyPj4mIGlucHV0LCB2ZWN0b3I8c3A8SUJpbmRlcj4+KiByZXBlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHNwPElCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKnJlcGVhdGVkID0gaW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGlucHV0OworICAgIHN0ZDo6cmV2ZXJzZShfYWlkbF9yZXR1cm4tPmJlZ2luKCksIF9haWRsX3JldHVybi0+ZW5kKCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKworICBTdGF0dXMgUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8dmVjdG9yPHNwPElCaW5kZXI+Pj4mIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dmVjdG9yPHNwPElCaW5kZXI+Pj4qIHJlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dmVjdG9yPHNwPElCaW5kZXI+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpyZXBlYXRlZCA9IGlucHV0OworICAgICpfYWlkbF9yZXR1cm4gPSBpbnB1dDsKKyAgICBpZiAoKl9haWRsX3JldHVybikgeworICAgICAgc3RkOjpyZXZlcnNlKCgqX2FpZGxfcmV0dXJuKS0+YmVnaW4oKSwgKCpfYWlkbF9yZXR1cm4pLT5lbmQoKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKwogICBTdGF0dXMgVW5pbXBsZW1lbnRlZE1ldGhvZChpbnQzMl90IC8qIGFyZyAqLywgaW50MzJfdCogLyogX2FpZGxfcmV0dXJuICovKSBvdmVycmlkZSB7CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5pbXBsZW1lbnRlZE1ldGhvZCBzaG91bGRuJ3QgYmUgY2FsbGVkIik7CiAgIH0KQEAgLTY3Myw2ICs4MTUsOTQgQEAKICAgfQogfTsKIAordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ7CitjbGFzcyBOZXN0ZWRTZXJ2aWNlIDogcHVibGljIEJuTmVzdGVkU2VydmljZSB7CisgcHVibGljOgorICBOZXN0ZWRTZXJ2aWNlKCkge30KKyAgdmlydHVhbCB+TmVzdGVkU2VydmljZSgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIFN0YXR1cyBmbGlwU3RhdHVzKGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiBwLCBJTmVzdGVkU2VydmljZTo6UmVzdWx0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAocC5zdGF0dXMgPT0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0spIHsKKyAgICAgIF9haWRsX3JldHVybi0+c3RhdHVzID0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6Tk9UX09LOworICAgIH0gZWxzZSB7CisgICAgICBfYWlkbF9yZXR1cm4tPnN0YXR1cyA9IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisgIHZpcnR1YWwgU3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGNiKSB7CisgICAgaWYgKHN0YXR1cyA9PSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSykgeworICAgICAgcmV0dXJuIGNiLT5kb25lKFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok5PVF9PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjYi0+ZG9uZShQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSyk7CisgICAgfQorICB9Cit9OworCit1c2luZyBhbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOworY2xhc3MgRml4ZWRTaXplQXJyYXlTZXJ2aWNlIDogcHVibGljIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheSB7CisgcHVibGljOgorICBGaXhlZFNpemVBcnJheVNlcnZpY2UoKSB7fQorICB2aXJ0dWFsIH5GaXhlZFNpemVBcnJheVNlcnZpY2UoKSA9IGRlZmF1bHQ7CisKKyAgU3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBvdXRfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqb3V0X3JlcGVhdGVkID0gaW5faW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGluX2lucHV0OworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKyAgU3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKm91dF9yZXBlYXRlZCA9IGluX2lucHV0OworICAgICpfYWlkbF9yZXR1cm4gPSBpbl9pbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisgIFN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3A8SUJpbmRlcj4sIDM+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzcDxJQmluZGVyPiwgMz4qIG91dF9yZXBlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzcDxJQmluZGVyPiwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpvdXRfcmVwZWF0ZWQgPSBpbl9pbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5faW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICBTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoCisgICAgICBjb25zdCBzdGQ6OmFycmF5PEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIGluX2lucHV0LAorICAgICAgc3RkOjphcnJheTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsCisgICAgICBzdGQ6OmFycmF5PEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpvdXRfcmVwZWF0ZWQgPSBpbl9pbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5faW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICBTdGF0dXMgUmVwZWF0MmRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogb3V0X3JlcGVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAqb3V0X3JlcGVhdGVkID0gaW5faW5wdXQ7CisgICAgKl9haWRsX3JldHVybiA9IGluX2lucHV0OworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgIH0KKyAgU3RhdHVzIFJlcGVhdDJkSW50cyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKm91dF9yZXBlYXRlZCA9IGluX2lucHV0OworICAgICpfYWlkbF9yZXR1cm4gPSBpbl9pbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9CisgIFN0YXR1cyBSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHNwPElCaW5kZXI+LCAzPiwgMj4mIGluX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzcDxJQmluZGVyPiwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHNwPElCaW5kZXI+LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICpvdXRfcmVwZWF0ZWQgPSBpbl9pbnB1dDsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5faW5wdXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgfQorICBTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcygKKyAgICAgIGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiYgaW5faW5wdXQsCisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgKm91dF9yZXBlYXRlZCA9IGluX2lucHV0OworICAgICpfYWlkbF9yZXR1cm4gPSBpbl9pbnB1dDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICB9Cit9OworCiBpbnQgUnVuKCkgewogICBhbmRyb2lkOjpzcDxOYXRpdmVTZXJ2aWNlPiBzZXJ2aWNlID0gbmV3IE5hdGl2ZVNlcnZpY2U7CiAgIHNwPExvb3Blcj4gbG9vcGVyKExvb3Blcjo6cHJlcGFyZSgwIC8qIG9wdHMgKi8pKTsKQEAgLTcxNCw2ICs5NDQsMjMgQEAKICAgICByZXR1cm4gLTE7CiAgIH0KIAorICBhbmRyb2lkOjpzcDxOZXN0ZWRTZXJ2aWNlPiBuZXN0ZWRTZXJ2aWNlID0gbmV3IE5lc3RlZFNlcnZpY2U7CisgIHN0YXR1cyA9CisgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZShuZXN0ZWRTZXJ2aWNlLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCksIG5lc3RlZFNlcnZpY2UpOworICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgQUxPR0UoIkZhaWxlZCB0byBhZGQgc2VydmljZSAlcyIsIFN0cmluZzgobmVzdGVkU2VydmljZS0+Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKS5jX3N0cigpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBhbmRyb2lkOjpzcDxGaXhlZFNpemVBcnJheVNlcnZpY2U+IGZpeGVkU2l6ZUFycmF5U2VydmljZSA9IG5ldyBGaXhlZFNpemVBcnJheVNlcnZpY2U7CisgIHN0YXR1cyA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKGZpeGVkU2l6ZUFycmF5U2VydmljZS0+Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZFNpemVBcnJheVNlcnZpY2UpOworICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgQUxPR0UoIkZhaWxlZCB0byBhZGQgc2VydmljZSAlcyIsCisgICAgICAgICAgU3RyaW5nOChmaXhlZFNpemVBcnJheVNlcnZpY2UtPmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkuY19zdHIoKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKICAgQUxPR0koIkVudGVyaW5nIGxvb3AiKTsKICAgd2hpbGUgKHRydWUpIHsKICAgICBjb25zdCBpbnQgcmVzdWx0ID0gbG9vcGVyLT5wb2xsQWxsKC0xIC8qIHRpbWVvdXRNaWxsaXMgKi8pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjZjM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmFpZGwKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheTsKKworQFJ1c3REZXJpdmUoUGFydGlhbEVxPXRydWUpCitwYXJjZWxhYmxlIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgICAgLy8gdG8gc2VlIGlmIE54TSBhcnJheSB3b3JrcworICAgIGludFsyXVszXSBpbnQyeDMgPSB7ezEsIDIsIDN9LCB7NCwgNSwgNn19OworCisgICAgYm9vbGVhblsyXSBib29sQXJyYXk7CisgICAgYnl0ZVsyXSBieXRlQXJyYXk7CisgICAgY2hhclsyXSBjaGFyQXJyYXk7CisgICAgaW50WzJdIGludEFycmF5OworICAgIGxvbmdbMl0gbG9uZ0FycmF5OworICAgIGZsb2F0WzJdIGZsb2F0QXJyYXk7CisgICAgZG91YmxlWzJdIGRvdWJsZUFycmF5OworICAgIEB1dGY4SW5DcHAgU3RyaW5nWzJdIHN0cmluZ0FycmF5ID0geyJoZWxsbyIsICJ3b3JsZCJ9OworICAgIEJ5dGVFbnVtWzJdIGJ5dGVFbnVtQXJyYXk7CisgICAgSW50RW51bVsyXSBpbnRFbnVtQXJyYXk7CisgICAgTG9uZ0VudW1bMl0gbG9uZ0VudW1BcnJheTsKKyAgICBJbnRQYXJjZWxhYmxlWzJdIHBhcmNlbGFibGVBcnJheTsKKyAgICAvLyBGb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgdGVzdC1mcmllbmRseSBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFzIG5vbi1udWxsLgorICAgIC8vIElCaW5kZXJbMl0gYmluZGVyQXJyYXk7CisgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JbMl0gcGZkQXJyYXk7CisgICAgLy8gSUVtcHR5SW50ZXJmYWNlWzJdIGludGVyZmFjZUFycmF5OworCisgICAgYm9vbGVhblsyXVsyXSBib29sTWF0cml4OworICAgIGJ5dGVbMl1bMl0gYnl0ZU1hdHJpeDsKKyAgICBjaGFyWzJdWzJdIGNoYXJNYXRyaXg7CisgICAgaW50WzJdWzJdIGludE1hdHJpeDsKKyAgICBsb25nWzJdWzJdIGxvbmdNYXRyaXg7CisgICAgZmxvYXRbMl1bMl0gZmxvYXRNYXRyaXg7CisgICAgZG91YmxlWzJdWzJdIGRvdWJsZU1hdHJpeDsKKyAgICBAdXRmOEluQ3BwIFN0cmluZ1syXVsyXSBzdHJpbmdNYXRyaXggPSB7eyJoZWxsbyIsICJ3b3JsZCJ9LCB7IkNpYW8iLCAibW9uZG8ifX07CisgICAgQnl0ZUVudW1bMl1bMl0gYnl0ZUVudW1NYXRyaXg7CisgICAgSW50RW51bVsyXVsyXSBpbnRFbnVtTWF0cml4OworICAgIExvbmdFbnVtWzJdWzJdIGxvbmdFbnVtTWF0cml4OworICAgIEludFBhcmNlbGFibGVbMl1bMl0gcGFyY2VsYWJsZU1hdHJpeDsKKyAgICAvLyBGb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgdGVzdC1mcmllbmRseSBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFzIG5vbi1udWxsLgorICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdWzJdIHBmZE1hdHJpeDsKKyAgICAvLyBJQmluZGVyWzJdWzJdIGJpbmRlck1hdHJpeDsKKyAgICAvLyBJRW1wdHlJbnRlcmZhY2VbMl1bMl0gaW50ZXJmYWNlTWF0cml4OworCisgICAgQG51bGxhYmxlIGJvb2xlYW5bMl0gYm9vbE51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIGJ5dGVbMl0gYnl0ZU51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIGNoYXJbMl0gY2hhck51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIGludFsyXSBpbnROdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBsb25nWzJdIGxvbmdOdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBmbG9hdFsyXSBmbG9hdE51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIGRvdWJsZVsyXSBkb3VibGVOdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBAdXRmOEluQ3BwIFN0cmluZ1syXSBzdHJpbmdOdWxsYWJsZUFycmF5ID0geyJoZWxsbyIsICJ3b3JsZCJ9OworICAgIEBudWxsYWJsZSBCeXRlRW51bVsyXSBieXRlRW51bU51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIEludEVudW1bMl0gaW50RW51bU51bGxhYmxlQXJyYXk7CisgICAgQG51bGxhYmxlIExvbmdFbnVtWzJdIGxvbmdFbnVtTnVsbGFibGVBcnJheTsKKyAgICBAbnVsbGFibGUgSUJpbmRlclsyXSBiaW5kZXJOdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBQYXJjZWxGaWxlRGVzY3JpcHRvclsyXSBwZmROdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBJbnRQYXJjZWxhYmxlWzJdIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OworICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2VbMl0gaW50ZXJmYWNlTnVsbGFibGVBcnJheTsKKworICAgIEBudWxsYWJsZSBib29sZWFuWzJdWzJdIGJvb2xOdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgYnl0ZVsyXVsyXSBieXRlTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIGNoYXJbMl1bMl0gY2hhck51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBpbnRbMl1bMl0gaW50TnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIGxvbmdbMl1bMl0gbG9uZ051bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBmbG9hdFsyXVsyXSBmbG9hdE51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBkb3VibGVbMl1bMl0gZG91YmxlTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIEB1dGY4SW5DcHAgU3RyaW5nWzJdWzJdIHN0cmluZ051bGxhYmxlTWF0cml4ID0geworICAgICAgICAgICAgeyJoZWxsbyIsICJ3b3JsZCJ9LCB7IkNpYW8iLCAibW9uZG8ifX07CisgICAgQG51bGxhYmxlIEJ5dGVFbnVtWzJdWzJdIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIEludEVudW1bMl1bMl0gaW50RW51bU51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBMb25nRW51bVsyXVsyXSBsb25nRW51bU51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBJQmluZGVyWzJdWzJdIGJpbmRlck51bGxhYmxlTWF0cml4OworICAgIEBudWxsYWJsZSBQYXJjZWxGaWxlRGVzY3JpcHRvclsyXVsyXSBwZmROdWxsYWJsZU1hdHJpeDsKKyAgICBAbnVsbGFibGUgSW50UGFyY2VsYWJsZVsyXVsyXSBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXg7CisgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZVsyXVsyXSBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeDsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHZhbHVlPXsib3V0LWFycmF5In0pCisgICAgaW50ZXJmYWNlIElSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgICAgICAgIGJ5dGVbM10gUmVwZWF0Qnl0ZXMoaW4gYnl0ZVszXSBpbnB1dCwgb3V0IGJ5dGVbM10gcmVwZWF0ZWQpOworICAgICAgICBpbnRbM10gUmVwZWF0SW50cyhpbiBpbnRbM10gaW5wdXQsIG91dCBpbnRbM10gcmVwZWF0ZWQpOworICAgICAgICBJQmluZGVyWzNdIFJlcGVhdEJpbmRlcnMoaW4gSUJpbmRlclszXSBpbnB1dCwgb3V0IElCaW5kZXJbM10gcmVwZWF0ZWQpOworICAgICAgICBJbnRQYXJjZWxhYmxlWzNdIFJlcGVhdFBhcmNlbGFibGVzKAorICAgICAgICAgICAgICAgIGluIEludFBhcmNlbGFibGVbM10gaW5wdXQsIG91dCBJbnRQYXJjZWxhYmxlWzNdIHJlcGVhdGVkKTsKKworICAgICAgICBieXRlWzJdWzNdIFJlcGVhdDJkQnl0ZXMoaW4gYnl0ZVsyXVszXSBpbnB1dCwgb3V0IGJ5dGVbMl1bM10gcmVwZWF0ZWQpOworICAgICAgICBpbnRbMl1bM10gUmVwZWF0MmRJbnRzKGluIGludFsyXVszXSBpbnB1dCwgb3V0IGludFsyXVszXSByZXBlYXRlZCk7CisgICAgICAgIElCaW5kZXJbMl1bM10gUmVwZWF0MmRCaW5kZXJzKGluIElCaW5kZXJbMl1bM10gaW5wdXQsIG91dCBJQmluZGVyWzJdWzNdIHJlcGVhdGVkKTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVsyXVszXSBSZXBlYXQyZFBhcmNlbGFibGVzKAorICAgICAgICAgICAgICAgIGluIEludFBhcmNlbGFibGVbMl1bM10gaW5wdXQsIG91dCBJbnRQYXJjZWxhYmxlWzJdWzNdIHJlcGVhdGVkKTsKKyAgICB9CisKKyAgICBlbnVtIEJ5dGVFbnVtIHsgQSB9CisKKyAgICBAQmFja2luZyh0eXBlPSJpbnQiKSBlbnVtIEludEVudW0geyBBIH0KKworICAgIEBCYWNraW5nKHR5cGU9ImxvbmciKSBlbnVtIExvbmdFbnVtIHsgQSB9CisKKyAgICBASmF2YURlcml2ZShlcXVhbHM9dHJ1ZSkKKyAgICBAUnVzdERlcml2ZShDbG9uZT10cnVlLCBDb3B5PXRydWUsIFBhcnRpYWxFcT10cnVlKQorICAgIHBhcmNlbGFibGUgSW50UGFyY2VsYWJsZSB7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUVtcHR5SW50ZXJmYWNlIHt9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmFpZGwgYi90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmFpZGwKaW5kZXggNTg2Y2UzNC4uMDY2ODg0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5haWRsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuYWlkbApAQCAtMTEsNCArMTEsOCBAQAogICAgICAgICAgICAgaW4gRGF0YSBkYXRhVmFsdWUsIEBudWxsYWJsZSBJQmluZGVyIGJpbmRlclZhbHVlLAogICAgICAgICAgICAgaW5vdXQgQG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZFZhbHVlLAogICAgICAgICAgICAgaW5vdXQgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRBcnJheSk7CisKKyAgICBpbnRlcmZhY2UgSVN1YiB7CisgICAgICAgIHZvaWQgTG9nKGludCB2YWx1ZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmFpZGwgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTVkYjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmFpZGwKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworCitAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17Imlub3V0LXBhcmFtZXRlciIsICJvdXQtYXJyYXkifSkKK3BhcmNlbGFibGUgQXJyYXlPZkludGVyZmFjZXMgeworICAgIGludGVyZmFjZSBJRW1wdHlJbnRlcmZhY2Uge30KKworICAgIGludGVyZmFjZSBJTXlJbnRlcmZhY2UgeworICAgICAgICBAbnVsbGFibGUgSUVtcHR5SW50ZXJmYWNlW10gbWV0aG9kV2l0aEludGVyZmFjZXMoSUVtcHR5SW50ZXJmYWNlIGlmYWNlLAorICAgICAgICAgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsCisgICAgICAgICAgICAgICAgaW4gSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXlfaW4sIG91dCBJRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9vdXQsCisgICAgICAgICAgICAgICAgaW5vdXQgSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXlfaW5vdXQsCisgICAgICAgICAgICAgICAgaW4gQG51bGxhYmxlIElFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLAorICAgICAgICAgICAgICAgIG91dCBAbnVsbGFibGUgSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LAorICAgICAgICAgICAgICAgIGlub3V0IEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgfQorCisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgcGFyY2VsYWJsZSBNeVBhcmNlbGFibGUgeworICAgICAgICBJRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2U7CisgICAgICAgIElFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5OworICAgICAgICBAbnVsbGFibGUgSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXk7CisgICAgfQorCisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgdW5pb24gTXlVbmlvbiB7CisgICAgICAgIElFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICAgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICAgICAgSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXk7CisgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQmFkUGFyY2VsYWJsZS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhZFBhcmNlbGFibGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM2ZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhZFBhcmNlbGFibGUuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisKK3BhcmNlbGFibGUgQmFkUGFyY2VsYWJsZSBjcHBfaGVhZGVyICJ0ZXN0cy9iYWRfcGFyY2VsYWJsZS5oIjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUxOTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5haWRsCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5Mb25nRW51bTsKKworcGFyY2VsYWJsZSBGaXhlZFNpemUgeworICAgIEBGaXhlZFNpemUKKyAgICBwYXJjZWxhYmxlIEZpeGVkUGFyY2VsYWJsZSB7CisgICAgICAgIGJvb2xlYW4gYm9vbGVhblZhbHVlOworICAgICAgICBieXRlIGJ5dGVWYWx1ZTsKKyAgICAgICAgY2hhciBjaGFyVmFsdWU7CisgICAgICAgIGludCBpbnRWYWx1ZTsKKyAgICAgICAgbG9uZyBsb25nVmFsdWU7CisgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKyAgICAgICAgTG9uZ0VudW0gZW51bVZhbHVlID0gTG9uZ0VudW0uRk9POworICAgICAgICBGaXhlZFVuaW9uIHBhcmNlbGFibGVWYWx1ZTsKKyAgICB9CisKKyAgICBARml4ZWRTaXplCisgICAgdW5pb24gRml4ZWRVbmlvbiB7CisgICAgICAgIGJvb2xlYW4gYm9vbGVhblZhbHVlID0gZmFsc2U7CisgICAgICAgIGJ5dGUgYnl0ZVZhbHVlOworICAgICAgICBjaGFyIGNoYXJWYWx1ZTsKKyAgICAgICAgaW50IGludFZhbHVlOworICAgICAgICBsb25nIGxvbmdWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBMb25nRW51bSBlbnVtVmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lDcHBKYXZhVGVzdHMuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JQ3BwSmF2YVRlc3RzLmFpZGwKaW5kZXggYjBkYTUzYS4uMjQzZDExMCAxMDA2NDQKLS0tIGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lDcHBKYXZhVGVzdHMuYWlkbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSUNwcEphdmFUZXN0cy5haWRsCkBAIC0xNiwxNiArMTYsMTggQEAKIAogcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CiAKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuQmFkUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5TaW1wbGVQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb247Ci1pbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwogCiAvLyBUZXN0cyB0aGF0IGFyZSBvbmx5IHN1cHBvcnRlZCBieSB0aGUgQysrL0phdmEgYmFja2VuZHMsIG5vdCBOREsvUnVzdAogaW50ZXJmYWNlIElDcHBKYXZhVGVzdHMgeworICAgIEJhZFBhcmNlbGFibGUgUmVwZWF0QmFkUGFyY2VsYWJsZShpbiBCYWRQYXJjZWxhYmxlIGlucHV0KTsKKwogICAgIFNpbXBsZVBhcmNlbGFibGUgUmVwZWF0U2ltcGxlUGFyY2VsYWJsZShpbiBTaW1wbGVQYXJjZWxhYmxlIGlucHV0LCBvdXQgU2ltcGxlUGFyY2VsYWJsZSByZXBlYXQpOwogICAgIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxpbnQsIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBJbnRFbnVtPiBSZXBlYXRHZW5lcmljUGFyY2VsYWJsZSgKICAgICAgICAgICAgIGluIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxpbnQsIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBJbnRFbnVtPiBpbnB1dCwKQEAgLTQzLDkgKzQ1LDQgQEAKICAgICBGaWxlRGVzY3JpcHRvciBSZXBlYXRGaWxlRGVzY3JpcHRvcihpbiBGaWxlRGVzY3JpcHRvciByZWFkKTsKICAgICBGaWxlRGVzY3JpcHRvcltdIFJldmVyc2VGaWxlRGVzY3JpcHRvckFycmF5KAogICAgICAgICAgICAgaW4gRmlsZURlc2NyaXB0b3JbXSBpbnB1dCwgb3V0IEZpbGVEZXNjcmlwdG9yW10gcmVwZWF0ZWQpOwotCi0gICAgdm9pZCBUYWtlc0FuSUJpbmRlckxpc3QoaW4gTGlzdDxJQmluZGVyPiBpbnB1dCk7Ci0gICAgdm9pZCBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGluIEBudWxsYWJsZSBMaXN0PElCaW5kZXI+IGlucHV0KTsKLQotICAgIHZvaWQgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoaW4gRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIG91dCBFeHRlbmRhYmxlUGFyY2VsYWJsZSBlcDIpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5haWRsCmluZGV4IDE5MTRhNGMuLmY4ZTE2OGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuYWlkbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmFpZGwKQEAgLTIzLDEyICsyMywzMCBAQAogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuSW50RW51bTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW07CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGU7CiAKKy8qKgorICogaW50ZXJmYWNlIGNvbW1lbnQKKyAqLwogQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJpbm91dC1wYXJhbWV0ZXIiLCAibWl4ZWQtb25ld2F5IiwgIm91dC1hcnJheSJ9KQogQFNlbnNpdGl2ZURhdGEKK0BKYXZhRGVmYXVsdAorQEphdmFEZWxlZ2F0b3IKIGludGVyZmFjZSBJVGVzdFNlcnZpY2UgewogICAgIC8vIFRlc3QgdGhhdCBjb25zdGFudHMgYXJlIGFjY2Vzc2libGUKKworICAgIC8qKgorICAgICAqIGV4dHJhIGRvYyBjb21tZW50CisgICAgICovCisgICAgLy8gZXh0cmEgbGluZSBjb21tZW50CisgICAgLyoKKyAgICAgKiBleHRyYSByZWd1bGFyIGNvbW1lbnQKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBjb25zdCBjb21tZW50CisgICAgICovCiAgICAgY29uc3QgaW50IFRFU1RfQ09OU1RBTlQgPSA0MjsKICAgICBjb25zdCBpbnQgVEVTVF9DT05TVEFOVDIgPSAtNDI7CiAgICAgY29uc3QgaW50IFRFU1RfQ09OU1RBTlQzID0gKzQyOwpAQCAtOTgsOCArMTE2LDE4IEBACiAgICAgTG9uZ0VudW1bXSBSZXZlcnNlTG9uZ0VudW0oaW4gTG9uZ0VudW1bXSBpbnB1dCwgb3V0IExvbmdFbnVtW10gcmVwZWF0ZWQpOwogCiAgICAgLy8gVGVzdCB0aGF0IGNsaWVudHMgY2FuIHNlbmQgYW5kIHJlY2VpdmUgQmluZGVycy4KLSAgICBJTmFtZWRDYWxsYmFjayBHZXRPdGhlclRlc3RTZXJ2aWNlKFN0cmluZyBuYW1lKTsKKyAgICBAUHJvcGFnYXRlQWxsb3dCbG9ja2luZyBJTmFtZWRDYWxsYmFjayBHZXRPdGhlclRlc3RTZXJ2aWNlKFN0cmluZyBuYW1lKTsKICAgICBib29sZWFuIFZlcmlmeU5hbWUoSU5hbWVkQ2FsbGJhY2sgc2VydmljZSwgU3RyaW5nIG5hbWUpOworICAgIElOYW1lZENhbGxiYWNrW10gR2V0SW50ZXJmYWNlQXJyYXkoaW4gU3RyaW5nW10gbmFtZXMpOworICAgIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoaW4gSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgaW4gU3RyaW5nW10gbmFtZXMpOworICAgIEBudWxsYWJsZSBJTmFtZWRDYWxsYmFja1tdIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoCisgICAgICAgICAgICBpbiBAbnVsbGFibGUgU3RyaW5nW10gbmFtZXMpOworICAgIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgICAgIGluIEBudWxsYWJsZSBJTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzLCBpbiBAbnVsbGFibGUgU3RyaW5nW10gbmFtZXMpOworCisgICAgQG51bGxhYmxlIExpc3Q8SU5hbWVkQ2FsbGJhY2s+IEdldEludGVyZmFjZUxpc3QoaW4gQG51bGxhYmxlIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoaW4gQG51bGxhYmxlIExpc3Q8SU5hbWVkQ2FsbGJhY2s+IHNlcnZpY2VzLAorICAgICAgICAgICAgaW4gQG51bGxhYmxlIFN0cmluZ1tdIG5hbWVzKTsKIAogICAgIC8vIFRlc3QgdGhhdCBMaXN0PFQ+IHR5cGVzIHdvcmsgY29ycmVjdGx5LgogICAgIExpc3Q8U3RyaW5nPiBSZXZlcnNlU3RyaW5nTGlzdChpbiBMaXN0PFN0cmluZz4gaW5wdXQsIG91dCBMaXN0PFN0cmluZz4gcmVwZWF0ZWQpOwpAQCAtMTE5LDExICsxNDcsMjAgQEAKICAgICBAbnVsbGFibGUgU3RyaW5nIFJlcGVhdE51bGxhYmxlU3RyaW5nKGluIEBudWxsYWJsZSBTdHJpbmcgaW5wdXQpOwogICAgIEBudWxsYWJsZSBMaXN0PFN0cmluZz4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KAogICAgICAgICAgICAgaW4gQG51bGxhYmxlIExpc3Q8U3RyaW5nPiBpbnB1dCk7Ci0gICAgQG51bGxhYmxlIFN0cnVjdHVyZWRQYXJjZWxhYmxlIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgKLSAgICAgICAgICAgIGluIEBudWxsYWJsZSBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBpbnB1dCk7CisKKyAgICAvLyBTbWFsbCBlbXB0eSBwYXJjZWxhYmxlIGZvciBudWxsYWJpbGl0eSBjaGVjaworICAgIEBKYXZhRGVyaXZlKGVxdWFscz10cnVlKQorICAgIEBSdXN0RGVyaXZlKENsb25lPXRydWUsIFBhcnRpYWxFcT10cnVlKQorICAgIHBhcmNlbGFibGUgRW1wdHkge30KKyAgICBAbnVsbGFibGUgRW1wdHkgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGluIEBudWxsYWJsZSBFbXB0eSBpbnB1dCk7CisgICAgQG51bGxhYmxlIEVtcHR5W10gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW4gQG51bGxhYmxlIEVtcHR5W10gaW5wdXQpOworICAgIEBudWxsYWJsZSBMaXN0PEVtcHR5PiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KAorICAgICAgICAgICAgaW4gQG51bGxhYmxlIExpc3Q8RW1wdHk+IGlucHV0KTsKIAogICAgIHZvaWQgVGFrZXNBbklCaW5kZXIoaW4gSUJpbmRlciBpbnB1dCk7CiAgICAgdm9pZCBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoaW4gQG51bGxhYmxlIElCaW5kZXIgaW5wdXQpOworICAgIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KGluIExpc3Q8SUJpbmRlcj4gaW5wdXQpOworICAgIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbiBAbnVsbGFibGUgTGlzdDxJQmluZGVyPiBpbnB1dCk7CiAKICAgICAvLyBUZXN0IHV0ZjggZGVjb2RpbmcgZnJvbSB1dGYxNiB3aXJlIGZvcm1hdAogICAgIEB1dGY4SW5DcHAgU3RyaW5nIFJlcGVhdFV0ZjhDcHBTdHJpbmcoQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4pOwpAQCAtMTQzLDEyICsxODAsMjMgQEAKICAgICAgICAgICAgIGluIEBudWxsYWJsZSBAdXRmOEluQ3BwIExpc3Q8U3RyaW5nPiBpbnB1dCwKICAgICAgICAgICAgIG91dCBAbnVsbGFibGUgQHV0ZjhJbkNwcCBMaXN0PFN0cmluZz4gcmVwZWF0ZWQpOwogCisgICAgLyoqCisgICAgICogY29tbWVudCBiZWZvcmUgYW5ub3RhdGlvbgorICAgICAqLwogICAgIEBudWxsYWJsZSBJTmFtZWRDYWxsYmFjayBHZXRDYWxsYmFjayhib29sZWFuIHJldHVybl9udWxsKTsKIAogICAgIC8vIFNpbmNlIHRoaXMgcGFyYWNlbGFibGUgaGFzIGNsZWFybHkgZGVmaW5lZCBkZWZhdWx0IHZhbHVlcywgaXQgd291bGQgYmUKICAgICAvLyBpbmVmZmljaWVudCB0byB1c2UgYW4gSVBDIHRvIGZpbGwgaXQgb3V0IGluIHByYWN0aWNlLgogICAgIHZvaWQgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKGlub3V0IFN0cnVjdHVyZWRQYXJjZWxhYmxlIHBhcmNlbCk7CiAKKyAgICB2b2lkIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGluIEV4dGVuZGFibGVQYXJjZWxhYmxlIGVwLCBvdXQgRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyKTsKKworICAgIFJlY3Vyc2l2ZUxpc3QgUmV2ZXJzZUxpc3QoaW4gUmVjdXJzaXZlTGlzdCBsaXN0KTsKKworICAgIElCaW5kZXJbXSBSZXZlcnNlSUJpbmRlckFycmF5KGluIElCaW5kZXJbXSBpbnB1dCwgb3V0IElCaW5kZXJbXSByZXBlYXRlZCk7CisgICAgQG51bGxhYmxlIElCaW5kZXJbXSBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoCisgICAgICAgICAgICBpbiBAbnVsbGFibGUgSUJpbmRlcltdIGlucHV0LCBvdXQgQG51bGxhYmxlIElCaW5kZXJbXSByZXBlYXRlZCk7CisKICAgICAvLyBBbGwgdGhlc2UgY29uc3RhbnQgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIGVxdWFsIHRvIDEKICAgICBjb25zdCBpbnQgQTEgPSAofigtMSkpID09IDA7CiAgICAgY29uc3QgaW50IEEyID0gfn4oMSA8PCAzMSkgPT0gKDEgPDwgMzEpOwpAQCAtMjE1LDQgKzI2MywzMCBAQAogICAgIEBudWxsYWJsZSBJQmluZGVyIEdldENwcEphdmFUZXN0cygpOwogCiAgICAgQmFja2VuZFR5cGUgZ2V0QmFja2VuZFR5cGUoKTsKKworICAgIHBhcmNlbGFibGUgQ29tcGlsZXJDaGVja3MgeworICAgICAgICAvLyBJQmluZGVyCisgICAgICAgIElCaW5kZXIgYmluZGVyOworICAgICAgICBAbnVsbGFibGUgSUJpbmRlciBudWxsYWJsZV9iaW5kZXI7CisgICAgICAgIElCaW5kZXJbXSBiaW5kZXJfYXJyYXk7CisgICAgICAgIEBudWxsYWJsZSBJQmluZGVyW10gbnVsbGFibGVfYmluZGVyX2FycmF5OworICAgICAgICBMaXN0PElCaW5kZXI+IGJpbmRlcl9saXN0OworICAgICAgICBAbnVsbGFibGUgTGlzdDxJQmluZGVyPiBudWxsYWJsZV9iaW5kZXJfbGlzdDsKKworICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQ7CisgICAgICAgIEBudWxsYWJsZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBudWxsYWJsZV9wZmQ7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcGZkX2FycmF5OworICAgICAgICBAbnVsbGFibGUgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBudWxsYWJsZV9wZmRfYXJyYXk7CisgICAgICAgIExpc3Q8UGFyY2VsRmlsZURlc2NyaXB0b3I+IHBmZF9saXN0OworICAgICAgICBAbnVsbGFibGUgTGlzdDxQYXJjZWxGaWxlRGVzY3JpcHRvcj4gbnVsbGFibGVfcGZkX2xpc3Q7CisKKyAgICAgICAgLy8gcGFyY2VsYWJsZQorICAgICAgICBFbXB0eSBwYXJjZWw7CisgICAgICAgIEBudWxsYWJsZSBFbXB0eSBudWxsYWJsZV9wYXJjZWw7CisgICAgICAgIEVtcHR5W10gcGFyY2VsX2FycmF5OworICAgICAgICBAbnVsbGFibGUgRW1wdHlbXSBudWxsYWJsZV9wYXJjZWxfYXJyYXk7CisgICAgICAgIExpc3Q8RW1wdHk+IHBhcmNlbF9saXN0OworICAgICAgICBAbnVsbGFibGUgTGlzdDxFbXB0eT4gbnVsbGFibGVfcGFyY2VsX2xpc3Q7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiYTJhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmFpZGwKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworCitAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17Imlub3V0LXBhcmFtZXRlciIsICJvdXQtbnVsbGFibGUifSkKK3BhcmNlbGFibGUgTGlzdE9mSW50ZXJmYWNlcyB7CisgICAgaW50ZXJmYWNlIElFbXB0eUludGVyZmFjZSB7fQorCisgICAgaW50ZXJmYWNlIElNeUludGVyZmFjZSB7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PElFbXB0eUludGVyZmFjZT4gbWV0aG9kV2l0aEludGVyZmFjZXMoSUVtcHR5SW50ZXJmYWNlIGlmYWNlLAorICAgICAgICAgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsCisgICAgICAgICAgICAgICAgaW4gTGlzdDxJRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW4sIG91dCBMaXN0PElFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9vdXQsCisgICAgICAgICAgICAgICAgaW5vdXQgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW5vdXQsCisgICAgICAgICAgICAgICAgaW4gQG51bGxhYmxlIExpc3Q8SUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2luLAorICAgICAgICAgICAgICAgIG91dCBAbnVsbGFibGUgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LAorICAgICAgICAgICAgICAgIGlub3V0IEBudWxsYWJsZSBMaXN0PElFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgICAgfQorCisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgcGFyY2VsYWJsZSBNeVBhcmNlbGFibGUgeworICAgICAgICBJRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgICAgIEBudWxsYWJsZSBJRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2U7CisgICAgICAgIExpc3Q8SUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0OworICAgICAgICBAbnVsbGFibGUgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Q7CisgICAgfQorCisgICAgQEphdmFEZXJpdmUodG9TdHJpbmc9dHJ1ZSwgZXF1YWxzPXRydWUpCisgICAgdW5pb24gTXlVbmlvbiB7CisgICAgICAgIElFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICAgICAgQG51bGxhYmxlIElFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICAgICAgTGlzdDxJRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3Q7CisgICAgICAgIEBudWxsYWJsZSBMaXN0PElFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYxMGQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisKK3BhcmNlbGFibGUgUmVjdXJzaXZlTGlzdCB7CisgICAgaW50IHZhbHVlOworICAgIEBudWxsYWJsZShoZWFwPXRydWUpIFJlY3Vyc2l2ZUxpc3QgbmV4dDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKaW5kZXggZGY2NmNkMy4uNDFmY2RmYiAxMDA2NDQKLS0tIGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwKQEAgLTcxLDcgKzcxLDIyIEBACiAKICAgICBAbnVsbGFibGUgSUJpbmRlciBpYmluZGVyOwogCisgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBzZW5kIGFuIGVtcHR5IHBhcmNlbGFibGUKKyAgICBASmF2YURlcml2ZSh0b1N0cmluZz10cnVlLCBlcXVhbHM9dHJ1ZSkKKyAgICBAUnVzdERlcml2ZShDbG9uZT10cnVlLCBQYXJ0aWFsRXE9dHJ1ZSkKKyAgICBwYXJjZWxhYmxlIEVtcHR5IHt9CisKKyAgICBFbXB0eSBlbXB0eTsKKwogICAgIC8vIENvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gMQorICAgIGJ5dGVbXSBpbnQ4XzEgPSB7CisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMHhmZnU4ICsgMSA9PSAwLAorICAgICAgICAgICAgMjU1dTggKyAxID09IDAsCisgICAgICAgICAgICAweDgwdTggPT0gLTEyOCwKKyAgICAgICAgICAgIC8vIHU4IHR5cGUgaXMgcmVpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCB0eXBlCisgICAgICAgICAgICAweDgwdTggLyAyID09IC0weDQwdTgsCisgICAgfTsKICAgICBpbnRbXSBpbnQzMl8xID0gewogICAgICAgICAgICAgKH4oLTEpKSA9PSAwLAogICAgICAgICAgICAgfn4oMSA8PCAzMSkgPT0gKDEgPDwgMzEpLApkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL21hcC9JTWFwVGVzdC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL21hcC9JTWFwVGVzdC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTg4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbWFwL0lNYXBUZXN0LmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLm1hcDsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5tYXAuQmFyOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5tYXAuSUVtcHR5OworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5tYXAuSW50RW51bTsKKworaW50ZXJmYWNlIElNYXBUZXN0IHsKKyAgICBNYXA8U3RyaW5nLCBJbnRFbnVtW10+IHJlcGVhdEludEVudW1BcnJheU1hcCgKKyAgICAgICAgICAgIGluIE1hcDxTdHJpbmcsIEludEVudW1bXT4gaW5wdXQsIG91dCBNYXA8U3RyaW5nLCBJbnRFbnVtW10+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgaW50W10+IHJlcGVhdEludEFycmF5TWFwKAorICAgICAgICAgICAgaW4gTWFwPFN0cmluZywgaW50W10+IGlucHV0LCBvdXQgTWFwPFN0cmluZywgaW50W10+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgQmFyPiByZXBlYXRCYXJNYXAoaW4gTWFwPFN0cmluZywgQmFyPiBpbnB1dCwgb3V0IE1hcDxTdHJpbmcsIEJhcj4gb3V0cHV0KTsKKyAgICBNYXA8U3RyaW5nLCBCYXJbXT4gcmVwZWF0QmFyQXJyYXlNYXAoCisgICAgICAgICAgICBpbiBNYXA8U3RyaW5nLCBCYXJbXT4gaW5wdXQsIG91dCBNYXA8U3RyaW5nLCBCYXJbXT4gb3V0cHV0KTsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcGVhdFN0cmluZ01hcCgKKyAgICAgICAgICAgIGluIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5wdXQsIG91dCBNYXA8U3RyaW5nLCBTdHJpbmc+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IHJlcGVhdFN0cmluZ0FycmF5TWFwKAorICAgICAgICAgICAgaW4gTWFwPFN0cmluZywgU3RyaW5nW10+IGlucHV0LCBvdXQgTWFwPFN0cmluZywgU3RyaW5nW10+IG91dHB1dCk7CisgICAgTWFwPFN0cmluZywgSUVtcHR5PiByZXBlYXRJbnRlcmZhY2VNYXAoCisgICAgICAgICAgICBpbiBNYXA8U3RyaW5nLCBJRW1wdHk+IGlucHV0LCBvdXQgTWFwPFN0cmluZywgSUVtcHR5PiBvdXRwdXQpOworICAgIE1hcDxTdHJpbmcsIElCaW5kZXI+IHJlcGVhdEliaW5kZXJNYXAoCisgICAgICAgICAgICBpbiBNYXA8U3RyaW5nLCBJQmluZGVyPiBpbnB1dCwgb3V0IE1hcDxTdHJpbmcsIElCaW5kZXI+IG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZkYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkOworCitwYXJjZWxhYmxlIERlZXBseU5lc3RlZCB7CisgICAgcGFyY2VsYWJsZSBBIHsKKyAgICAgICAgLy8gQ2FuIHJlZmVyZW5jZSBkZWVwbHkgbmVzdGVkIHR5cGUgb2YgYSBzaWJsaW5nIHR5cGUuCisgICAgICAgIEIuQy5ELkUgZSA9IEIuQy5ELkUuT0s7CisgICAgfQorICAgIHBhcmNlbGFibGUgQiB7CisgICAgICAgIHBhcmNlbGFibGUgQyB7CisgICAgICAgICAgICBwYXJjZWxhYmxlIEQgeworICAgICAgICAgICAgICAgIGVudW0gRSB7IE9LIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjNmNWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQ7CisKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkOworCitpbnRlcmZhY2UgSU5lc3RlZFNlcnZpY2UgeworICAgIEBSdXN0RGVyaXZlKFBhcnRpYWxFcT10cnVlKQorICAgIHBhcmNlbGFibGUgUmVzdWx0IHsKKyAgICAgICAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzIHN0YXR1cyA9IFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5PSzsKKyAgICB9CisKKyAgICBSZXN1bHQgZmxpcFN0YXR1cyhpbiBQYXJjZWxhYmxlV2l0aE5lc3RlZCBwKTsKKworICAgIGludGVyZmFjZSBJQ2FsbGJhY2sgeworICAgICAgICB2b2lkIGRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzIHN0YXR1cyk7CisgICAgfQorICAgIHZvaWQgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMgc3RhdHVzLCBJQ2FsbGJhY2sgY2IpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2ZhMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZDsKKworcGFyY2VsYWJsZSBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgICAgZW51bSBTdGF0dXMgeyBPSywgTk9UX09LIH0KKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDZlOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uOworCitpbnRlcmZhY2UgSVByb3RlY3RlZCB7CisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJSRUFEX1BIT05FX1NUQVRFIikgdm9pZCBQZXJtaXNzaW9uUHJvdGVjdGVkKCk7CisKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oYWxsT2Y9eyJJTlRFUk5FVCIsICJWSUJSQVRFIn0pIHZvaWQgTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpOworCisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFueU9mPXsiSU5URVJORVQiLCAiVklCUkFURSJ9KSB2b2lkIE11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuYWlkbCBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE2NjQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5haWRsCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbjsKKworQEVuZm9yY2VQZXJtaXNzaW9uKCJBQ0NFU1NfRklORV9MT0NBVElPTiIpCitpbnRlcmZhY2UgSVByb3RlY3RlZEludGVyZmFjZSB7CisgICAgdm9pZCBNZXRob2QxKCk7CisKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oIklOVEVSTkVUIikgdm9pZCBNZXRob2QyKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmFpZGwgYi90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2NzBhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL3BsYXRmb3JtL0lQcm90ZWN0ZWQuYWlkbApAQCAtMCwwICsxLDggQEAKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2U7CisKK2ludGVyZmFjZSBJUHJvdGVjdGVkIHsKKyAgICBARW5mb3JjZVBlcm1pc3Npb24oYWxsT2Y9eyJJTlRFUk5FVCIsICJWSUJSQVRFIn0pCisgICAgdm9pZCBQcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb24oaW4gQXR0cmlidXRpb25Tb3VyY2Ugc291cmNlKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2JhZF9wYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2JhZF9wYXJjZWxhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmNhNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYmFkX3BhcmNlbGFibGUuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGVzdHMvYmFkX3BhcmNlbGFibGUuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0JhZFBhcmNlbGFibGU6OkJhZFBhcmNlbGFibGUoYm9vbCBiYWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQzMl90IG51bWJlcikKKyAgICA6IGJhZF8oYmFkKSwgbmFtZV8obmFtZS5jX3N0cigpLCBuYW1lLmxlbmd0aCgpKSwgbnVtYmVyXyhudW1iZXIpIHt9CisKK3N0YXR1c190IEJhZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKyAgaWYgKGF1dG8gc3RhdHVzID0gcGFyY2VsLT53cml0ZUJvb2woYmFkXyk7IHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgaWYgKGF1dG8gc3RhdHVzID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KG5hbWVfKTsgc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICBpZiAoYXV0byBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobnVtYmVyXyk7IHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgLy8gQkFEISB3cml0ZSBzdXBlcmZsdW91cyBkYXRhCisgIGlmIChiYWRfKSBwYXJjZWwtPndyaXRlSW50MzIoNDIpOworICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEJhZFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CisgIGlmIChhdXRvIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJmJhZF8pOyBzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgIGlmIChhdXRvIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZuYW1lXyk7IHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgaWYgKGF1dG8gc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm51bWJlcl8pOyBzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgIHJldHVybiBPSzsKK30KKworc3RkOjpzdHJpbmcgQmFkUGFyY2VsYWJsZTo6dG9TdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBTdHJpbmdQcmludGYoIkJhZFBhcmNlbGFibGV7YmFkPSVkLG5hbWU9JXMsbnVtYmVyPSVkfSIsIGJhZF8sIFN0cmluZzgobmFtZV8pLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvYmFkX3BhcmNlbGFibGUuaCBiL3Rlc3RzL2JhZF9wYXJjZWxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjYzliZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2JhZF9wYXJjZWxhYmxlLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK2NsYXNzIEJhZFBhcmNlbGFibGUgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgcHVibGljOgorICBCYWRQYXJjZWxhYmxlKCkgPSBkZWZhdWx0OworICBCYWRQYXJjZWxhYmxlKGJvb2wgYmFkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50MzJfdCBudW1iZXIpOworICB2aXJ0dWFsIH5CYWRQYXJjZWxhYmxlKCkgPSBkZWZhdWx0OworCisgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJhZFBhcmNlbGFibGUmIGxocywgY29uc3QgQmFkUGFyY2VsYWJsZSYgcmhzKSB7CisgICAgcmV0dXJuIChsaHMuYmFkXyA9PSByaHMuYmFkXykgJiYgKGxocy5uYW1lXyA9PSByaHMubmFtZV8pICYmIChsaHMubnVtYmVyXyA9PSByaHMubnVtYmVyXyk7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCYWRQYXJjZWxhYmxlJiBsaHMsIGNvbnN0IEJhZFBhcmNlbGFibGUmIHJocykgeworICAgIHJldHVybiAhKGxocyA9PSByaHMpOworICB9CisKKyBwcml2YXRlOgorICBib29sIGJhZF87CisgIFN0cmluZzE2IG5hbWVfOworICBpbnQzMl90IG51bWJlcl8gPSAwOworfTsgIC8vIGNsYXNzIEJhZFBhcmNlbGFibGUKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9jaGFyX3NlcV9sZWFrIGIvdGVzdHMvY29ycHVzL2NoYXJfc2VxX2xlYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OGQ2ZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2NoYXJfc2VxX2xlYWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0xZW51bSBGe1V9cGFyY2VsYWJsZSBle0NoYXJTZXF1ZW5jZSBlO30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9jb25zdF9vdmVyZmxvdyBiL3Rlc3RzL2NvcnB1cy9jb25zdF9vdmVyZmxvdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YTQzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvY29uc3Rfb3ZlcmZsb3cKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi2WZW51bSBve3A9LSBzLHpwPS0gZmFsc2UgLHMsVSxVLHMscyxzVSxzLFQsdGVTLHMsVSxVLGJ5dCxVLFUscyxzLHNVLHMsVSx0ZVMscyxVLFUsYnl0LHN9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2NvbnN0X3ZhbHVlX2JpbmFyeV9leHAgYi90ZXN0cy9jb3JwdXMvY29uc3RfdmFsdWVfYmluYXJ5X2V4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1ZjhkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvY29uc3RfdmFsdWVfYmluYXJ5X2V4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLaxpbnRlcmZhY2UgYXtjb25zdCBpbnQgTz00NTkxMDE2MzYzJjc7fWVudW0gRntwfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9kb3VibGVfaW5jbHVkZSBiL3Rlc3RzL2NvcnB1cy9kb3VibGVfaW5jbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlNGEzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvZG91YmxlX2luY2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi07aW1wb3J0IGQ7aW1wb3J0IGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2R1cGxpY2F0ZWRfaW1wb3J0cyBiL3Rlc3RzL2NvcnB1cy9kdXBsaWNhdGVkX2ltcG9ydHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MDczYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2R1cGxpY2F0ZWRfaW1wb3J0cworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTtpbXBvcnQgZDtpbXBvcnQgZDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9lbnVtX2ludmFsaWRfdW5hcnkgYi90ZXN0cy9jb3JwdXMvZW51bV9pbnZhbGlkX3VuYXJ5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTJmNTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9lbnVtX2ludmFsaWRfdW5hcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi3/ZW51bSBve3I9KyIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9lbnVtX25hbWVkX2J5dGUgYi90ZXN0cy9jb3JwdXMvZW51bV9uYW1lZF9ieXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2YzYWQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9lbnVtX25hbWVkX2J5dGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi09IGltcG9ydCBzO2VudW0gYnl0ZXtwfWVudW0gc3twfSBlbnVtIG96e3AyfXBhcmNlbGFibGUgZXtlIG95O296IHk7fSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZW51bV9zdHJpbmcgYi90ZXN0cy9jb3JwdXMvZW51bV9zdHJpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWUxMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2VudW1fc3RyaW5nCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIGVudW0gb3twPSKnIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvZXhhbXBsZV9jcHAgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2NWRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NvcnB1cy9leGFtcGxlX2NwcApAQCAtMCwwICsxIEBACithaWRsXCAtLWxhbmc9Y3BwXCB0ZXN0cy9JRm9vLmFpZGxcIC0tb3V0XCAuXCAtLWhlYWRlcl9vdXRcIC5cIHRlc3RzL0lGb28uYWlkbFwgaW50ZXJmYWNlIElGb28geyBjb25zdCBpbnQgYSA9IDMgKyAzOyB2b2lkIGRvRm9vKCk7IH0HClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2V4YW1wbGVfZW5mb3JjZSBiL3Rlc3RzL2NvcnB1cy9leGFtcGxlX2VuZm9yY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNTU4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NvcnB1cy9leGFtcGxlX2VuZm9yY2UKQEAgLTAsMCArMSBAQAorYWlkbFwgLS1sYW5nPWphdmFcIHRlc3RzL0lGb28uYWlkbFwgLS1vdXRcIC5cIC0taGVhZGVyX291dFwgLlwgdGVzdHMvSUZvby5haWRsXCBpbnRlcmZhY2UgSUZvbyB7ICBARW5mb3JjZSgicGVybWlzc2lvbiA9IEFCQyB8fCBwZXJtaXNzaW9uPURFRiIpIHZvaWQgZG9Gb28oKTsgfQUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9leGFtcGxlX2phdmEgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGY2YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9qYXZhCkBAIC0wLDAgKzEgQEAKK2FpZGxcIC0tbGFuZz1qYXZhXCB0ZXN0cy9JRm9vLmFpZGxcIC0tb3V0XCAuXCAtLWhlYWRlcl9vdXRcIC5cIHRlc3RzL0lGb28uYWlkbFwgaW50ZXJmYWNlIElGb28geyBjb25zdCBpbnQgYSA9IDMgKyAzOyB2b2lkIGRvRm9vKCk7IH0FClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2V4YW1wbGVfbmRrIGIvdGVzdHMvY29ycHVzL2V4YW1wbGVfbmRrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDhjMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9uZGsKQEAgLTAsMCArMSBAQAorYWlkbFwgLS1sYW5nPW5ka1wgdGVzdHMvSUZvby5haWRsXCAtLW91dFwgLlwgLS1oZWFkZXJfb3V0XCAuXCB0ZXN0cy9JRm9vLmFpZGxcIGludGVyZmFjZSBJRm9vIHsgY29uc3QgaW50IGEgPSAzICsgMzsgdm9pZCBkb0ZvbygpOyB9BwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9leGFtcGxlX3J1c3QgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9ydXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTJiODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JwdXMvZXhhbXBsZV9ydXN0CkBAIC0wLDAgKzEgQEAKK2FpZGxcIC0tbGFuZz1ydXN0XCB0ZXN0cy9JRm9vLmFpZGxcIC0tb3V0XCAuXCAtLWhlYWRlcl9vdXRcIC5cIHRlc3RzL0lGb28uYWlkbFwgaW50ZXJmYWNlIElGb28geyBjb25zdCBpbnQgYSA9IDMgKyAzOyB2b2lkIGRvRm9vKCk7IH0FClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2ZhaWxzX29ubHlfaW5famF2YSBiL3Rlc3RzL2NvcnB1cy9mYWlsc19vbmx5X2luX2phdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MGE2NTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2ZhaWxzX29ubHlfaW5famF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSZlbnVtIGx7cH1wYXJjZWxhYmxlIGV7TWFwIHkwO30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2liaW5kZXJfYXJyYXkgYi90ZXN0cy9jb3JwdXMvaWJpbmRlcl9hcnJheQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZTQxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvaWJpbmRlcl9hcnJheQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSBlbnVtIEZ7cH1wYXJjZWxhYmxlIGV7SUJpbmRlcltdeTt9CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvaW52YWxpZF9iaW5hcnlfb3BfdHlwZXMgYi90ZXN0cy9jb3JwdXMvaW52YWxpZF9iaW5hcnlfb3BfdHlwZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZmI4MTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2ludmFsaWRfYmluYXJ5X29wX3R5cGVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotJmVudW0gbHtwfXBhcmNlbGFibGUgZXtNYXAgeT0uMCYwO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvaW52YWxpZF90eXBlX2FmdGVyX3ZhbGlkX3R5cGUgYi90ZXN0cy9jb3JwdXMvaW52YWxpZF90eXBlX2FmdGVyX3ZhbGlkX3R5cGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDljZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL2ludmFsaWRfdHlwZV9hZnRlcl92YWxpZF90eXBlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIHBhcmNlbGFibGUgbXt9dApkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL2phdmFfbWFwIGIvdGVzdHMvY29ycHVzL2phdmFfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzViOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JwdXMvamF2YV9tYXAKQEAgLTAsMCArMSBAQAorYWlkbFwgLS1sYW5nPWphdmFcIHRlc3RzL0lGb28uYWlkbFwgLS1vdXRcIC5cIC0taGVhZGVyX291dFwgLlwgdGVzdHMvSUZvby5haWRsXCBpbnRlcmZhY2UgSUZvbyB7IGJvb2xlYW4gZ2V0RmRzKG91dCBNYXA8U3RyaW5nLEZpbGVEZXNjcmlwdG9yPiBmZHMpOyB9BQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9sYXJnZV9zaGlmdF9vdmVyZmxvdyBiL3Rlc3RzL2NvcnB1cy9sYXJnZV9zaGlmdF9vdmVyZmxvdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNGZmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvbGFyZ2Vfc2hpZnRfb3ZlcmZsb3cKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gIGVudW0gbHtwfXBhcmNlbGFibGUgZXtNYXAgeT0zNjw8LTM5MjIzMzEyNTY8PDIyMzcyMDMzMTA7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL21hcF9sZWFrIGIvdGVzdHMvY29ycHVzL21hcF9sZWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWNjNjcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9tYXBfbGVhaworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXFwYXJjZWxhYmxlIGF7TWFwIGU7fWVudW0gbntwfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL25ka19maWxlX2Rlc2NyaXB0b3IgYi90ZXN0cy9jb3JwdXMvbmRrX2ZpbGVfZGVzY3JpcHRvcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2OWRhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvbmRrX2ZpbGVfZGVzY3JpcHRvcgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSZlbnVtIEZ7cH1wYXJjZWxhYmxlIGV7RmlsZURlc2NyaXB0b3IgZTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL25lZ2F0aXZlX2xlZnRfc2hpZnQgYi90ZXN0cy9jb3JwdXMvbmVnYXRpdmVfbGVmdF9zaGlmdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkZThiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvbmVnYXRpdmVfbGVmdF9zaGlmdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8gZW51bSBvIHtwPTEyN0w+Pi0xPj4yPjMwPi04MT4+MD40PjI2TD4+LTE+LTI+PjEtOD4xLTMwPj4xPj4tN0w+Pi0xPj4tMj4+MD4+LTI+PjEtOD4+LTMwPj4tMj4+MS04MD4+LTc+PjZMPj4tMT4+MD40PjI2TD4+LTE+LTI+PjEtOD4+LTM+Pi0zMD4+LTI+PjI+PjE+PjEtOD4+LTMwPj4tMj4+MS04MD4+LTc+PjZMPj4tMT4+MD40PjJMPj4tMT4tMj4+MS04Pj4tMz4+LTMwPj4tMj4+Mj4+NDI+PjE+PjEtOD4+LTMwPj4tMj4+MS04MD4+LTc+PjZMPj4tMTc+PjZMPj4tMT4+LTE+PjA+ND4yNkw+Pi0xPi0yPj4xLTg+Pi0zMD4+MT4+LTdMPj4tMT4+LTI+PjA+Pi0yPj4xLTg+Pi0zMD4+LTI+PjEtODA+Pi03Pj42TD4+LTE+PjA+ND4yNkw+Pi0xPi0yPj4xLTg+Pi0zPj4tMzA+Pi0yPj4yPj4xPj4xLTg+Pi0zMD4+LTI+PjEtODA+Pi03Pj42TD4+LTE+PjA+ND4yTD4+LTE+LTI+PjEtOD4+LTM+Pi0zMD4+LTI+PjI+PjEtODA+Pi03Pj42TD4+LTE+PjA+ND4yNkw+Pi0xPi0yPj4xLTg+Pi0zPj4tMzE+PjA+ND4yNkw+Pi0xPi04MD4+LTc+PjZMPj4tMT4+MD40PjI2TD4+LTE+LTI+PjEtMz4+LTM+Pi0zMD4+LTI+PjEtODA+Pi0xLTgwPj4tNz4+Nkw+Pi0xPj4wPjQ+MjZMPj4tMT4tMj4+MX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvbm9uZ2VuZXJpY19saXN0IGIvdGVzdHMvY29ycHVzL25vbmdlbmVyaWNfbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlOWU5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvbm9uZ2VuZXJpY19saXN0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotsmVudW0gRnt0fXBhcmNlbGFibGUgZXtMaXN0IGU7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9udWxsYWJsZV9wYXJjZWxhYmxlX2FycmF5IGIvdGVzdHMvY29ycHVzL251bGxhYmxlX3BhcmNlbGFibGVfYXJyYXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Y2IwYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL251bGxhYmxlX3BhcmNlbGFibGVfYXJyYXkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0pZW51bSBye3J9cGFyY2VsYWJsZSBle0BudWxsYWJsZSBlW11lO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvbnVsbGFibGVfcGZkX2FycmF5IGIvdGVzdHMvY29ycHVzL251bGxhYmxlX3BmZF9hcnJheQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4ZGRkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvbnVsbGFibGVfcGZkX2FycmF5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIGVudW0gRntwfXBhcmNlbGFibGUgZXtAbnVsbGFibGUgUGFyY2VsRmlsZURlc2NyaXB0b3JbXXk7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9vdGhlcl9zdHJpbmdfb3BlcmF0aW9uIGIvdGVzdHMvY29ycHVzL290aGVyX3N0cmluZ19vcGVyYXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNGZjYzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL290aGVyX3N0cmluZ19vcGVyYXRpb24KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvcGFyY2VsYWJsZV9ob2xkZXJfYXJyYXkgYi90ZXN0cy9jb3JwdXMvcGFyY2VsYWJsZV9ob2xkZXJfYXJyYXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjg2NmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL3BhcmNlbGFibGVfaG9sZGVyX2FycmF5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot1mVudW0gRm97cHJwfXBhcmNlbGFibGUgZXsgUGFyY2VsYWJsZUhvbGRlciBbXW87fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcnB1cy9zaGlmdF9sZWZ0X2d0X2xlYWRpbmdfemVyb3MgYi90ZXN0cy9jb3JwdXMvc2hpZnRfbGVmdF9ndF9sZWFkaW5nX3plcm9zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDJjZjIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9zaGlmdF9sZWZ0X2d0X2xlYWRpbmdfemVyb3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gZW51bSBvIHtwPTA2TD4+LTI+Pi0yTD4+MC0yPj4tOC0yPj4wLTIxPj4wLTI+Pi04LTI+PjAtMj4+LTY+Pi05TD4+MC0yPj4tNj4+LTJMPj4wPjF9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL3NoaWZ0X292ZXJmbG93IGIvdGVzdHMvY29ycHVzL3NoaWZ0X292ZXJmbG93CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDdhMjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcnB1cy9zaGlmdF9vdmVyZmxvdworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLdZlbnVtIG97eD00PDw5Mn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvc2hpZnRfcmlnaHRfNjQgYi90ZXN0cy9jb3JwdXMvc2hpZnRfcmlnaHRfNjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODBkNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL3NoaWZ0X3JpZ2h0XzY0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLyBlbnVtIG8ge3A9MTc1Nkw+Pi0xPj4xPj4tND4yNkw+PjE+Pi00PjI2Pj4tMT4+MT4+LTEwMC0xPj4xPj4tND4yNj4+LTE+PjE+Pi0xMDA+ND4+MjY2Pj4tMT4+MT4+LTE+PjE+LTItOD4+LTI+Pi0xPj4xPj4tMT4+LTdMPj4xMT4+LTI+PjA+Pi0yOD4+LTMwPj4tMj4+MS04MD4+LTc+MzA+Pi03PDU2TD4+LTE+PjE+Pi00PjI0Pj4tLjE+PjE+Pi0xMDAtMT4+MT4+LTQ+MjY+Pi0xPj4xPj4tMjY+Pi0xPj4xPj4tND4yNj4+LTE+PjE+Pi0xMDAtMT4+MT4+LTQ+MjY+Pi0xPj4xPj4tMTAwPjQ+PjI2TD4+MD4+LTI+PjAwNjQ+MjZMPj4tMX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvc2hpZnRfemVyb19sZWZ0XzMyIGIvdGVzdHMvY29ycHVzL3NoaWZ0X3plcm9fbGVmdF8zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmMTJmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvc2hpZnRfemVyb19sZWZ0XzMyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIGVudW0gb3twPTA+Pi0zMn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JwdXMvdHlwZV9wYXJhbV9sZWFrIGIvdGVzdHMvY29ycHVzL3R5cGVfcGFyYW1fbGVhawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlYjY4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JwdXMvdHlwZV9wYXJhbV9sZWFrCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotO3BhcmNlbGFibGUgcDxnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29ycHVzL3V0Zjhfbm9uX3N0cmluZyBiL3Rlc3RzL2NvcnB1cy91dGY4X25vbl9zdHJpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTRlM2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29ycHVzL3V0Zjhfbm9uX3N0cmluZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVVlbnVtIG97cn1wYXJjZWxhYmxlIGV7QHV0ZjhJbkNwcCBieXRlW115O30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmNwcCBiL3Rlc3RzL2Zha2VfaW9fZGVsZWdhdGUuY3BwCmluZGV4IGE5OWEyMGEuLjZiZDI5ODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2Zha2VfaW9fZGVsZWdhdGUuY3BwCisrKyBiL3Rlc3RzL2Zha2VfaW9fZGVsZWdhdGUuY3BwCkBAIC01NywxNiArNTcsNiBAQAogICByZXR1cm4gY29udGVudHM7CiB9CiAKLXVuaXF1ZV9wdHI8TGluZVJlYWRlcj4gRmFrZUlvRGVsZWdhdGU6OkdldExpbmVSZWFkZXIoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIGNvbnN0IHsKLSAgdW5pcXVlX3B0cjxMaW5lUmVhZGVyPiByZXQ7Ci0gIGNvbnN0IGF1dG8mIGl0ID0gZmlsZV9jb250ZW50c18uZmluZChDbGVhblBhdGgoZmlsZV9wYXRoKSk7Ci0gIGlmIChpdCAhPSBmaWxlX2NvbnRlbnRzXy5jZW5kKCkpIHsKLSAgICByZXQgPSBMaW5lUmVhZGVyOjpSZWFkRnJvbU1lbW9yeShpdC0+c2Vjb25kKTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCiBib29sIEZha2VJb0RlbGVnYXRlOjpGaWxlSXNSZWFkYWJsZShjb25zdCBzdHJpbmcmIHBhdGgpIGNvbnN0IHsKICAgcmV0dXJuIGZpbGVfY29udGVudHNfLmZpbmQoQ2xlYW5QYXRoKHBhdGgpKSAhPSBmaWxlX2NvbnRlbnRzXy5lbmQoKTsKIH0KQEAgLTc2LDE1ICs2NiwxMCBAQAogICBpZiAoYnJva2VuX2ZpbGVzXy5jb3VudChmaWxlX3BhdGgpID4gMCkgewogICAgIHJldHVybiB1bmlxdWVfcHRyPENvZGVXcml0ZXI+KG5ldyBCcm9rZW5Db2RlV3JpdGVyKTsKICAgfQotICByZW1vdmVkX2ZpbGVzXy5lcmFzZShmaWxlX3BhdGgpOwogICB3cml0dGVuX2ZpbGVfY29udGVudHNfW2ZpbGVfcGF0aF0gPSAiIjsKICAgcmV0dXJuIENvZGVXcml0ZXI6OkZvclN0cmluZygmd3JpdHRlbl9maWxlX2NvbnRlbnRzX1tmaWxlX3BhdGhdKTsKIH0KIAotdm9pZCBGYWtlSW9EZWxlZ2F0ZTo6UmVtb3ZlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSBjb25zdCB7Ci0gIHJlbW92ZWRfZmlsZXNfLmluc2VydChmaWxlX3BhdGgpOwotfQotCiB2b2lkIEZha2VJb0RlbGVnYXRlOjpTZXRGaWxlQ29udGVudHMoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKSB7CiAgIGZpbGVfY29udGVudHNfW2ZpbGVuYW1lXSA9IGNvbnRlbnRzOwpAQCAtMTYwLDIzICsxNDUsNiBAQAogICByZXR1cm4gd3JpdHRlbl9maWxlX2NvbnRlbnRzXzsKIH0KIAotYm9vbCBGYWtlSW9EZWxlZ2F0ZTo6UGF0aFdhc1JlbW92ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgaWYgKHJlbW92ZWRfZmlsZXNfLmNvdW50KHBhdGgpID4gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RyaW5nIEZha2VJb0RlbGVnYXRlOjpDbGVhblBhdGgoY29uc3Qgc3RyaW5nJiBwYXRoKSBjb25zdCB7Ci0gIHN0cmluZyBjbGVhbl9wYXRoID0gcGF0aDsKLSAgd2hpbGUgKGNsZWFuX3BhdGgubGVuZ3RoKCkgPj0gMiAmJgotICAgICAgICAgY2xlYW5fcGF0aFswXSA9PSAnLicgJiYKLSAgICAgICAgIGNsZWFuX3BhdGhbMV0gPT0gT1NfUEFUSF9TRVBBUkFUT1IpIHsKLSAgICBjbGVhbl9wYXRoID0gY2xlYW5fcGF0aC5zdWJzdHIoMik7Ci0gIH0KLSAgcmV0dXJuIGNsZWFuX3BhdGg7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0CiB9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Zha2VfaW9fZGVsZWdhdGUuaCBiL3Rlc3RzL2Zha2VfaW9fZGVsZWdhdGUuaAppbmRleCA2ZjI0Njc4Li44MWQ2Zjg5IDEwMDY0NAotLS0gYS90ZXN0cy9mYWtlX2lvX2RlbGVnYXRlLmgKKysrIGIvdGVzdHMvZmFrZV9pb19kZWxlZ2F0ZS5oCkBAIC00MiwxMiArNDIsOSBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IEdldEZpbGVDb250ZW50cygKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcHBlbmRfY29udGVudF9zdWZmaXggPSAiIikgY29uc3Qgb3ZlcnJpZGU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMaW5lUmVhZGVyPiBHZXRMaW5lUmVhZGVyKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgRmlsZUlzUmVhZGFibGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q29kZVdyaXRlcj4gR2V0Q29kZVdyaXRlcigKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFJlbW92ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IExpc3RGaWxlcyhjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSBjb25zdCBvdmVycmlkZTsKIAogICAvLyBNZXRob2RzIGFkZGVkIHRvIGZhY2lsaXRhdGUgdGVzdGluZy4KQEAgLTY1LDEyICs2Miw3IEBACiAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIElucHV0RmlsZXMoKSBjb25zdDsKICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgT3V0cHV0RmlsZXMoKSBjb25zdDsKIAotICBib29sIFBhdGhXYXNSZW1vdmVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKLQogIHByaXZhdGU6Ci0gIC8vIFJlbW92ZSBsZWFkaW5nICIuLyIgZnJvbSB8cGF0aHwuCi0gIHN0ZDo6c3RyaW5nIENsZWFuUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7Ci0KICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBmaWxlX2NvbnRlbnRzXzsKICAgLy8gTm9ybWFsbHksIHdyaXRpbmcgdG8gZmlsZXMgbGVhdmVzIHRoZSBJb0RlbGVnYXRlIHVuY2hhbmdlZCwgc28KICAgLy8gR2V0Q29kZVdyaXRlciBpcyBhIGNvbnN0IG1ldGhvZC4gIEhvd2V2ZXIsIGZvciB0ZXN0cywgd2UgYnJlYWsgdGhpcwpAQCAtODAsNyArNzIsNiBAQAogICAvLyBXZSBub3JtYWxseSBqdXN0IHdyaXRlIHRvIHN0cmluZ3MgaW4gfHdyaXR0ZW5fZmlsZV9jb250ZW50c198IGJ1dCBmb3IKICAgLy8gZmlsZXMgaW4gdGhpcyBsaXN0LCB3ZSBzaW11bGF0ZSBJL08gZXJyb3JzLgogICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gYnJva2VuX2ZpbGVzXzsKLSAgbXV0YWJsZSBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcmVtb3ZlZF9maWxlc187CiB9OyAgLy8gY2xhc3MgRmFrZUlvRGVsZWdhdGUKIAogfSAgLy8gbmFtZXNwYWNlIHRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhNDI0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTQ1NiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmaW50MngzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJvb2xBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZieXRlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmY2hhckFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludEFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmxvbmdBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZmbG9hdEFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmRvdWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnN0cmluZ0FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJ5dGVFbnVtQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmaW50RW51bUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmxvbmdFbnVtQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmcGFyY2VsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJvb2xNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmYnl0ZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZjaGFyTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludE1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZsb25nTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmZsb2F0TWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmRvdWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZzdHJpbmdNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmYnl0ZUVudW1NYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmaW50RW51bU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZsb25nRW51bU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZwYXJjZWxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJvb2xOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJ5dGVOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmNoYXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludE51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmbG9uZ051bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmZmxvYXROdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmRvdWJsZU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmc3RyaW5nTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZieXRlRW51bU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmaW50RW51bU51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmbG9uZ0VudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJpbmRlck51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmcGZkTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZwYXJjZWxhYmxlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZpbnRlcmZhY2VOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJvb2xOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZieXRlTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmY2hhck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmxvbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGaXhlZEFycmF5KCZmbG9hdE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmRvdWJsZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJnN0cmluZ051bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmaW50RW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmYmluZGVyTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmcGZkTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkRml4ZWRBcnJheSgmcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEZpeGVkQXJyYXkoJmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGludDJ4Myk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYm9vbEFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShieXRlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGNoYXJBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50QXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGxvbmdBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZmxvYXRBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZG91YmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KHN0cmluZ0FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShieXRlRW51bUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShpbnRFbnVtQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGxvbmdFbnVtQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KHBhcmNlbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYm9vbE1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYnl0ZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoY2hhck1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50TWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShsb25nTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShmbG9hdE1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZG91YmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShzdHJpbmdNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJ5dGVFbnVtTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShpbnRFbnVtTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShsb25nRW51bU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkocGFyY2VsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYm9vbE51bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJ5dGVOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShjaGFyTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50TnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkobG9uZ051bGxhYmxlQXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGZsb2F0TnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZG91YmxlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoc3RyaW5nTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkobG9uZ0VudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShwZmROdWxsYWJsZUFycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShwYXJjZWxhYmxlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50ZXJmYWNlTnVsbGFibGVBcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoYm9vbE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShieXRlTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGNoYXJOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoaW50TnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGxvbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZmxvYXROdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkoZG91YmxlTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KHN0cmluZ051bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShpbnRFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGaXhlZEFycmF5KGJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShwZmROdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUZpeGVkQXJyYXkocGFyY2VsYWJsZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRml4ZWRBcnJheShpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX05FU1RFRF9JTlRFUkZBQ0UoRml4ZWRTaXplQXJyYXlFeGFtcGxlLCBSZXBlYXRGaXhlZFNpemVBcnJheSwgImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5IikKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworCitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXkoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PihfYWlkbF9pbXBsKXsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUZpeGVkQXJyYXkoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZXMsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdEJ5dGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXRJbnRzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRJbnRzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXRCaW5kZXJzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRCaW5kZXJzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUZpeGVkQXJyYXkoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsYWJsZXMsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdFBhcmNlbGFibGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZEJ5dGVzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXQyZEJ5dGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkSW50cyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdDJkSW50cywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0MmRJbnRzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkQmluZGVycyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdDJkQmluZGVycywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0MmRCaW5kZXJzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXQyZFBhcmNlbGFibGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKKworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5KCkKK3sKKyAgOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrQ29tcGlsYXRpb25Vbml0KHRoaXMpOworfQorCis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXRCeXRlczoKKyAgeworICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4gaW5faW5wdXQ7CisgICAgc3RkOjphcnJheTx1aW50OF90LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTx1aW50OF90LCAzPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEJ5dGVzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkob3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5SZXBlYXRGaXhlZFNpemVBcnJheTo6VFJBTlNBQ1RJT05fUmVwZWF0SW50czoKKyAgeworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4gaW5faW5wdXQ7CisgICAgc3RkOjphcnJheTxpbnQzMl90LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTxpbnQzMl90LCAzPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEludHMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXRCaW5kZXJzOgorICB7CisgICAgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+IGluX2lucHV0OworICAgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZEZpeGVkQXJyYXkoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0QmluZGVycyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbGFibGVzOgorICB7CisgICAgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+IGluX2lucHV0OworICAgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZEZpeGVkQXJyYXkoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0UGFyY2VsYWJsZXMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlRml4ZWRBcnJheShvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblJlcGVhdEZpeGVkU2l6ZUFycmF5OjpUUkFOU0FDVElPTl9SZXBlYXQyZEJ5dGVzOgorICB7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiBpbl9pbnB1dDsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZEZpeGVkQXJyYXkoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0MmRCeXRlcyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdDJkSW50czoKKyAgeworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4gaW5faW5wdXQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiBvdXRfcmVwZWF0ZWQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdDJkSW50cyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdDJkQmluZGVyczoKKyAgeworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiBpbl9pbnB1dDsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4gb3V0X3JlcGVhdGVkOworICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRGaXhlZEFycmF5KCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdDJkQmluZGVycyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVGaXhlZEFycmF5KG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlRSQU5TQUNUSU9OX1JlcGVhdDJkUGFyY2VsYWJsZXM6CisgIHsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4gaW5faW5wdXQ7CisgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkRml4ZWRBcnJheSgmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXQyZFBhcmNlbGFibGVzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZUZpeGVkQXJyYXkob3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMih2YWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX05FU1RFRF9JTlRFUkZBQ0UoRml4ZWRTaXplQXJyYXlFeGFtcGxlLCBFbXB0eUludGVyZmFjZSwgImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlIikKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworCitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwRW1wdHlJbnRlcmZhY2U6OkJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPihfYWlkbF9pbXBsKXsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKKworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCbkVtcHR5SW50ZXJmYWNlOjpCbkVtcHR5SW50ZXJmYWNlKCkKK3sKKyAgOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrQ29tcGlsYXRpb25Vbml0KHRoaXMpOworfQorCis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDBlMTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQm5GaXhlZFNpemVBcnJheUV4YW1wbGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0JuRml4ZWRTaXplQXJyYXlFeGFtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0JuRml4ZWRTaXplQXJyYXlFeGFtcGxlLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CcEZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQnBGaXhlZFNpemVBcnJheUV4YW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQnBGaXhlZFNpemVBcnJheUV4YW1wbGUuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2MGEzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCkBAIC0wLDAgKzEsNDE4IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaW5kZXIvRW51bXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxGaWxlRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKK2NsYXNzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICBjbGFzcyBJbnRQYXJjZWxhYmxlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSAhPSBzdGQ6OnRpZShyaHMudmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpIDwgc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPD0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPT0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSA+IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpID49IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorCisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZSIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkludFBhcmNlbGFibGV7IjsKKyAgICAgIG9zIDw8ICJ2YWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyh2YWx1ZSk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSW50UGFyY2VsYWJsZQorICBjbGFzcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmVwZWF0Rml4ZWRTaXplQXJyYXkpCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0QmluZGVycyhjb25zdCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkSW50cyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICB9OyAgLy8gY2xhc3MgSVJlcGVhdEZpeGVkU2l6ZUFycmF5CisKKyAgY2xhc3MgSVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdCA6IHB1YmxpYyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Qnl0ZXMoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAzPiYgLyppbnB1dCovLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiAvKnJlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgLyppbnB1dCovLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiAvKnJlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+JiAvKmlucHV0Ki8sIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiYgLyppbnB1dCovLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIC8qcmVwZWF0ZWQqLywgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIC8qaW5wdXQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogLypyZXBlYXRlZCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgLyppbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiAvKnJlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkQmluZGVycyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+LCAzPiwgMj4mIC8qaW5wdXQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiAvKnJlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIC8qaW5wdXQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiAvKnJlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdAorICBjbGFzcyBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5KGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBSZXBlYXRGaXhlZFNpemVBcnJheSgpID0gZGVmYXVsdDsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0QmluZGVycyhjb25zdCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkSW50cyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+JiBpbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5CisgIGNsYXNzIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZXMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50cyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRCaW5kZXJzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbGFibGVzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkQnl0ZXMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0MmRJbnRzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkQmluZGVycyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKKyAgICBleHBsaWNpdCBCblJlcGVhdEZpeGVkU2l6ZUFycmF5KCk7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKKyAgfTsgIC8vIGNsYXNzIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkKKworICBjbGFzcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWxlZ2F0b3IgOiBwdWJsaWMgQm5SZXBlYXRGaXhlZFNpemVBcnJheSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEJ5dGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4mIGlucHV0LCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEludHMoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0QmluZGVycyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbnB1dCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiByZXBlYXRlZCwgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0UGFyY2VsYWJsZXMoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0MmRCeXRlcyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiByZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdDJkSW50cyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiYgaW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdDJkQmluZGVycyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGlucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIHJlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXQyZFBhcmNlbGFibGVzKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVsZWdhdG9yCisgIGVudW0gY2xhc3MgQnl0ZUVudW0gOiBpbnQ4X3QgeworICAgIEEgPSAwLAorICB9OworICBlbnVtIGNsYXNzIEludEVudW0gOiBpbnQzMl90IHsKKyAgICBBID0gMCwKKyAgfTsKKyAgZW51bSBjbGFzcyBMb25nRW51bSA6IGludDY0X3QgeworICAgIEEgPSAwTCwKKyAgfTsKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEVtcHR5SW50ZXJmYWNlKQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdAorICBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgfTsgIC8vIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UKKyAgY2xhc3MgQm5FbXB0eUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElFbXB0eUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQm5FbXB0eUludGVyZmFjZSgpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yIDogcHVibGljIEJuRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUVtcHR5SW50ZXJmYWNlPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJRW1wdHlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yCisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4gaW50MngzID0ge3t7ezEsIDIsIDN9fSwge3s0LCA1LCA2fX19fTsKKyAgc3RkOjphcnJheTxib29sLCAyPiBib29sQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+IGJ5dGVBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8Y2hhcjE2X3QsIDI+IGNoYXJBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8aW50MzJfdCwgMj4gaW50QXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PGludDY0X3QsIDI+IGxvbmdBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8ZmxvYXQsIDI+IGZsb2F0QXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PGRvdWJsZSwgMj4gZG91YmxlQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6c3RkOjpzdHJpbmcsIDI+IHN0cmluZ0FycmF5ID0ge3siaGVsbG8iLCAid29ybGQifX07CisgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSwgMj4gYnl0ZUVudW1BcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiBpbnRFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0sIDI+IGxvbmdFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMj4gcGFyY2VsYWJsZUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGJvb2wsIDI+LCAyPiBib29sTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+LCAyPiBieXRlTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGNoYXIxNl90LCAyPiwgMj4gY2hhck1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAyPiwgMj4gaW50TWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDY0X3QsIDI+LCAyPiBsb25nTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGZsb2F0LCAyPiwgMj4gZmxvYXRNYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiwgMj4gZG91YmxlTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6c3RkOjpzdHJpbmcsIDI+LCAyPiBzdHJpbmdNYXRyaXggPSB7e3t7ImhlbGxvIiwgIndvcmxkIn19LCB7eyJDaWFvIiwgIm1vbmRvIn19fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtLCAyPiwgMj4gYnl0ZUVudW1NYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiwgMj4gaW50RW51bU1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtLCAyPiwgMj4gbG9uZ0VudW1NYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAyPiwgMj4gcGFyY2VsYWJsZU1hdHJpeCA9IHt7fX07CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PGJvb2wsIDI+PiBib29sTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8dWludDhfdCwgMj4+IGJ5dGVOdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxjaGFyMTZfdCwgMj4+IGNoYXJOdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxpbnQzMl90LCAyPj4gaW50TnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8aW50NjRfdCwgMj4+IGxvbmdOdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxmbG9hdCwgMj4+IGZsb2F0TnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8ZG91YmxlLCAyPj4gZG91YmxlTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+LCAyPj4gc3RyaW5nTnVsbGFibGVBcnJheSA9IHt7eyJoZWxsbyIsICJ3b3JsZCJ9fX07CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+PiBieXRlRW51bU51bGxhYmxlQXJyYXk7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMj4+IGludEVudW1OdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtLCAyPj4gbG9uZ0VudW1OdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDI+PiBiaW5kZXJOdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+LCAyPj4gcGZkTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZT4sIDI+PiBwYXJjZWxhYmxlTnVsbGFibGVBcnJheTsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZT4sIDI+PiBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGJvb2wsIDI+LCAyPj4gYm9vbE51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+LCAyPj4gYnl0ZU51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGNoYXIxNl90LCAyPiwgMj4+IGNoYXJOdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAyPiwgMj4+IGludE51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGludDY0X3QsIDI+LCAyPj4gbG9uZ051bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGZsb2F0LCAyPiwgMj4+IGZsb2F0TnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiwgMj4+IGRvdWJsZU51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiwgMj4sIDI+PiBzdHJpbmdOdWxsYWJsZU1hdHJpeCA9IHt7e3t7ImhlbGxvIiwgIndvcmxkIn19LCB7eyJDaWFvIiwgIm1vbmRvIn19fX19OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+LCAyPj4gYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW0sIDI+LCAyPj4gaW50RW51bU51bGxhYmxlTWF0cml4OworICA6OnN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0sIDI+LCAyPj4gbG9uZ0VudW1OdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDI+LCAyPj4gYmluZGVyTnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiwgMj4sIDI+PiBwZmROdWxsYWJsZU1hdHJpeDsKKyAgOjpzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlPiwgMj4sIDI+PiBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXg7CisgIDo6c3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZT4sIDI+LCAyPj4gaW50ZXJmYWNlTnVsbGFibGVNYXRyaXg7CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSAhPSBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSA8IHN0ZDo6dGllKHJocy5pbnQyeDMsIHJocy5ib29sQXJyYXksIHJocy5ieXRlQXJyYXksIHJocy5jaGFyQXJyYXksIHJocy5pbnRBcnJheSwgcmhzLmxvbmdBcnJheSwgcmhzLmZsb2F0QXJyYXksIHJocy5kb3VibGVBcnJheSwgcmhzLnN0cmluZ0FycmF5LCByaHMuYnl0ZUVudW1BcnJheSwgcmhzLmludEVudW1BcnJheSwgcmhzLmxvbmdFbnVtQXJyYXksIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5ib29sTWF0cml4LCByaHMuYnl0ZU1hdHJpeCwgcmhzLmNoYXJNYXRyaXgsIHJocy5pbnRNYXRyaXgsIHJocy5sb25nTWF0cml4LCByaHMuZmxvYXRNYXRyaXgsIHJocy5kb3VibGVNYXRyaXgsIHJocy5zdHJpbmdNYXRyaXgsIHJocy5ieXRlRW51bU1hdHJpeCwgcmhzLmludEVudW1NYXRyaXgsIHJocy5sb25nRW51bU1hdHJpeCwgcmhzLnBhcmNlbGFibGVNYXRyaXgsIHJocy5ib29sTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVOdWxsYWJsZUFycmF5LCByaHMuY2hhck51bGxhYmxlQXJyYXksIHJocy5pbnROdWxsYWJsZUFycmF5LCByaHMubG9uZ051bGxhYmxlQXJyYXksIHJocy5mbG9hdE51bGxhYmxlQXJyYXksIHJocy5kb3VibGVOdWxsYWJsZUFycmF5LCByaHMuc3RyaW5nTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVFbnVtTnVsbGFibGVBcnJheSwgcmhzLmludEVudW1OdWxsYWJsZUFycmF5LCByaHMubG9uZ0VudW1OdWxsYWJsZUFycmF5LCByaHMuYmluZGVyTnVsbGFibGVBcnJheSwgcmhzLnBmZE51bGxhYmxlQXJyYXksIHJocy5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgcmhzLmludGVyZmFjZU51bGxhYmxlQXJyYXksIHJocy5ib29sTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlTnVsbGFibGVNYXRyaXgsIHJocy5jaGFyTnVsbGFibGVNYXRyaXgsIHJocy5pbnROdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmZsb2F0TnVsbGFibGVNYXRyaXgsIHJocy5kb3VibGVOdWxsYWJsZU1hdHJpeCwgcmhzLnN0cmluZ051bGxhYmxlTWF0cml4LCByaHMuYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmludEVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5iaW5kZXJOdWxsYWJsZU1hdHJpeCwgcmhzLnBmZE51bGxhYmxlTWF0cml4LCByaHMucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCByaHMuaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSA8PSBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPT0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPiBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPj0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKworICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZSIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRml4ZWRTaXplQXJyYXlFeGFtcGxleyI7CisgICAgb3MgPDwgImludDJ4MzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQyeDMpOworICAgIG9zIDw8ICIsIGJvb2xBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sQXJyYXkpOworICAgIG9zIDw8ICIsIGJ5dGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlQXJyYXkpOworICAgIG9zIDw8ICIsIGNoYXJBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyQXJyYXkpOworICAgIG9zIDw8ICIsIGludEFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEFycmF5KTsKKyAgICBvcyA8PCAiLCBsb25nQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ0FycmF5KTsKKyAgICBvcyA8PCAiLCBmbG9hdEFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0QXJyYXkpOworICAgIG9zIDw8ICIsIGRvdWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdBcnJheSk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1BcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtQXJyYXkpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJvb2xNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbE1hdHJpeCk7CisgICAgb3MgPDwgIiwgYnl0ZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBjaGFyTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJNYXRyaXgpOworICAgIG9zIDw8ICIsIGludE1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRNYXRyaXgpOworICAgIG9zIDw8ICIsIGxvbmdNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ01hdHJpeCk7CisgICAgb3MgPDwgIiwgZmxvYXRNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXRNYXRyaXgpOworICAgIG9zIDw8ICIsIGRvdWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIHN0cmluZ01hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEVudW1NYXRyaXgpOworICAgIG9zIDw8ICIsIGxvbmdFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBwYXJjZWxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJvb2xOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgY2hhck51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hhck51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGludE51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50TnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ051bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ051bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGZsb2F0TnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmbG9hdE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGRvdWJsZU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgc3RyaW5nTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlRW51bU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ0VudW1OdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgYmluZGVyTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBwZmROdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludGVyZmFjZU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJvb2xOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGNoYXJOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGludE51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludE51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ051bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBmbG9hdE51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0TnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGRvdWJsZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJpbmRlck51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBwZmROdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwZmROdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBGaXhlZFNpemVBcnJheUV4YW1wbGUKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0gdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtOjpBOgorICAgIHJldHVybiAiQSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDE+IGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0+ID0geworICA6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtOjpBLAorfTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtIHZhbCkgeworICBzd2l0Y2godmFsKSB7CisgIGNhc2UgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtOjpBOgorICAgIHJldHVybiAiQSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW0sIDE+IGVudW1fdmFsdWVzPDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bT4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bTo6QSwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0gdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtOjpBOgorICAgIHJldHVybiAiQSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDY0X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtLCAxPiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtPiA9IHsKKyAgOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bTo6QSwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktY3BwLXNvdXJjZS9nZW4vdGltZXN0YW1wCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWNwcC1zb3VyY2UvZ2VuL3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4Y2M2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheTsKK3B1YmxpYyBjbGFzcyBGaXhlZFNpemVBcnJheUV4YW1wbGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgLy8gdG8gc2VlIGlmIE54TSBhcnJheSB3b3JrcworICBwdWJsaWMgaW50W11bXSBpbnQyeDMgPSB7ezEsIDIsIDN9LCB7NCwgNSwgNn19OworICBwdWJsaWMgYm9vbGVhbltdIGJvb2xBcnJheTsKKyAgcHVibGljIGJ5dGVbXSBieXRlQXJyYXk7CisgIHB1YmxpYyBjaGFyW10gY2hhckFycmF5OworICBwdWJsaWMgaW50W10gaW50QXJyYXk7CisgIHB1YmxpYyBsb25nW10gbG9uZ0FycmF5OworICBwdWJsaWMgZmxvYXRbXSBmbG9hdEFycmF5OworICBwdWJsaWMgZG91YmxlW10gZG91YmxlQXJyYXk7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gc3RyaW5nQXJyYXkgPSB7ImhlbGxvIiwgIndvcmxkIn07CisgIHB1YmxpYyBieXRlW10gYnl0ZUVudW1BcnJheTsKKyAgcHVibGljIGludFtdIGludEVudW1BcnJheTsKKyAgcHVibGljIGxvbmdbXSBsb25nRW51bUFycmF5OworICBwdWJsaWMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcGFyY2VsYWJsZUFycmF5OworICAvLyBGb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgdGVzdC1mcmllbmRseSBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFzIG5vbi1udWxsLgorICAvLyBJQmluZGVyWzJdIGJpbmRlckFycmF5OworICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvclsyXSBwZmRBcnJheTsKKyAgLy8gSUVtcHR5SW50ZXJmYWNlWzJdIGludGVyZmFjZUFycmF5OworICBwdWJsaWMgYm9vbGVhbltdW10gYm9vbE1hdHJpeDsKKyAgcHVibGljIGJ5dGVbXVtdIGJ5dGVNYXRyaXg7CisgIHB1YmxpYyBjaGFyW11bXSBjaGFyTWF0cml4OworICBwdWJsaWMgaW50W11bXSBpbnRNYXRyaXg7CisgIHB1YmxpYyBsb25nW11bXSBsb25nTWF0cml4OworICBwdWJsaWMgZmxvYXRbXVtdIGZsb2F0TWF0cml4OworICBwdWJsaWMgZG91YmxlW11bXSBkb3VibGVNYXRyaXg7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW11bXSBzdHJpbmdNYXRyaXggPSB7eyJoZWxsbyIsICJ3b3JsZCJ9LCB7IkNpYW8iLCAibW9uZG8ifX07CisgIHB1YmxpYyBieXRlW11bXSBieXRlRW51bU1hdHJpeDsKKyAgcHVibGljIGludFtdW10gaW50RW51bU1hdHJpeDsKKyAgcHVibGljIGxvbmdbXVtdIGxvbmdFbnVtTWF0cml4OworICBwdWJsaWMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW11bXSBwYXJjZWxhYmxlTWF0cml4OworICAvLyBGb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgdGVzdC1mcmllbmRseSBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFzIG5vbi1udWxsLgorICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvclsyXVsyXSBwZmRNYXRyaXg7CisgIC8vIElCaW5kZXJbMl1bMl0gYmluZGVyTWF0cml4OworICAvLyBJRW1wdHlJbnRlcmZhY2VbMl1bMl0gaW50ZXJmYWNlTWF0cml4OworICBwdWJsaWMgYm9vbGVhbltdIGJvb2xOdWxsYWJsZUFycmF5OworICBwdWJsaWMgYnl0ZVtdIGJ5dGVOdWxsYWJsZUFycmF5OworICBwdWJsaWMgY2hhcltdIGNoYXJOdWxsYWJsZUFycmF5OworICBwdWJsaWMgaW50W10gaW50TnVsbGFibGVBcnJheTsKKyAgcHVibGljIGxvbmdbXSBsb25nTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGZsb2F0W10gZmxvYXROdWxsYWJsZUFycmF5OworICBwdWJsaWMgZG91YmxlW10gZG91YmxlTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBzdHJpbmdOdWxsYWJsZUFycmF5ID0geyJoZWxsbyIsICJ3b3JsZCJ9OworICBwdWJsaWMgYnl0ZVtdIGJ5dGVFbnVtTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGludFtdIGludEVudW1OdWxsYWJsZUFycmF5OworICBwdWJsaWMgbG9uZ1tdIGxvbmdFbnVtTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIGJpbmRlck51bGxhYmxlQXJyYXk7CisgIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcGZkTnVsbGFibGVBcnJheTsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OworICBwdWJsaWMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2VbXSBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OworICBwdWJsaWMgYm9vbGVhbltdW10gYm9vbE51bGxhYmxlTWF0cml4OworICBwdWJsaWMgYnl0ZVtdW10gYnl0ZU51bGxhYmxlTWF0cml4OworICBwdWJsaWMgY2hhcltdW10gY2hhck51bGxhYmxlTWF0cml4OworICBwdWJsaWMgaW50W11bXSBpbnROdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGxvbmdbXVtdIGxvbmdOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGZsb2F0W11bXSBmbG9hdE51bGxhYmxlTWF0cml4OworICBwdWJsaWMgZG91YmxlW11bXSBkb3VibGVOdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXVtdIHN0cmluZ051bGxhYmxlTWF0cml4ID0ge3siaGVsbG8iLCAid29ybGQifSwgeyJDaWFvIiwgIm1vbmRvIn19OworICBwdWJsaWMgYnl0ZVtdW10gYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGludFtdW10gaW50RW51bU51bGxhYmxlTWF0cml4OworICBwdWJsaWMgbG9uZ1tdW10gbG9uZ0VudW1OdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdW10gYmluZGVyTnVsbGFibGVNYXRyaXg7CisgIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW11bXSBwZmROdWxsYWJsZU1hdHJpeDsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OworICBwdWJsaWMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2VbXVtdIGludGVyZmFjZU51bGxhYmxlTWF0cml4OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEZpeGVkU2l6ZUFycmF5RXhhbXBsZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGaXhlZFNpemVBcnJheUV4YW1wbGU+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaXhlZFNpemVBcnJheUV4YW1wbGUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSBfYWlkbF9vdXQgPSBuZXcgRml4ZWRTaXplQXJyYXlFeGFtcGxlKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaXhlZFNpemVBcnJheUV4YW1wbGVbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVBcnJheUV4YW1wbGVbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShpbnQyeDMsIDAsIDIsIDMpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYm9vbEFycmF5LCAwLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShjaGFyQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50QXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkobG9uZ0FycmF5LCAwLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGZsb2F0QXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoZG91YmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoc3RyaW5nQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYnl0ZUVudW1BcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShpbnRFbnVtQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkobG9uZ0VudW1BcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShwYXJjZWxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYm9vbE1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShieXRlTWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGNoYXJNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50TWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGxvbmdNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoZmxvYXRNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoZG91YmxlTWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KHN0cmluZ01hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShieXRlRW51bU1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShpbnRFbnVtTWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGxvbmdFbnVtTWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KHBhcmNlbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYm9vbE51bGxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYnl0ZU51bGxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoY2hhck51bGxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50TnVsbGFibGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShsb25nTnVsbGFibGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShmbG9hdE51bGxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoZG91YmxlTnVsbGFibGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShzdHJpbmdOdWxsYWJsZUFycmF5LCAwLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVFbnVtTnVsbGFibGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShpbnRFbnVtTnVsbGFibGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShsb25nRW51bU51bGxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYmluZGVyTnVsbGFibGVBcnJheSwgMCwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShwZmROdWxsYWJsZUFycmF5LCAwLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCAwLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGludGVyZmFjZU51bGxhYmxlQXJyYXksIDAsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYm9vbE51bGxhYmxlTWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGJ5dGVOdWxsYWJsZU1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShjaGFyTnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50TnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkobG9uZ051bGxhYmxlTWF0cml4LCAwLCAyLCAyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVGaXhlZEFycmF5KGZsb2F0TnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoZG91YmxlTnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoc3RyaW5nTnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShpbnRFbnVtTnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkobG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShiaW5kZXJOdWxsYWJsZU1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShwZmROdWxsYWJsZU1hdHJpeCwgMCwgMiwgMik7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlRml4ZWRBcnJheShwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUZpeGVkQXJyYXkoaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgsIDAsIDIsIDIpOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50MngzID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoaW50W11bXS5jbGFzcywgMiwgMyk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYm9vbEFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYm9vbGVhbltdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBieXRlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGNoYXJBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGNoYXJbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50QXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShpbnRbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgbG9uZ0FycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBmbG9hdEFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoZmxvYXRbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZG91YmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShkb3VibGVbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgc3RyaW5nQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJ5dGVFbnVtQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludEVudW1BcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGludFtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBsb25nRW51bUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBwYXJjZWxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXS5jbGFzcywgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlLkNSRUFUT1IsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJvb2xNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShib29sZWFuW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYnl0ZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjaGFyTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoY2hhcltdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludE1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGludFtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGxvbmdNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShsb25nW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZmxvYXRNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShmbG9hdFtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGRvdWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGRvdWJsZVtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHN0cmluZ01hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGphdmEubGFuZy5TdHJpbmdbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBieXRlRW51bU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnRFbnVtTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoaW50W11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgbG9uZ0VudW1NYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShsb25nW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgcGFyY2VsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBib29sTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJvb2xlYW5bXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYnl0ZU51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShieXRlW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGNoYXJOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoY2hhcltdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnROdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoaW50W10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGxvbmdOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBmbG9hdE51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShmbG9hdFtdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBkb3VibGVOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoZG91YmxlW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHN0cmluZ051bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShqYXZhLmxhbmcuU3RyaW5nW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJ5dGVFbnVtTnVsbGFibGVBcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50RW51bU51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShpbnRbXS5jbGFzcywgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgbG9uZ0VudW1OdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkobG9uZ1tdLmNsYXNzLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBiaW5kZXJOdWxsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5vcy5JQmluZGVyW10uY2xhc3MsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHBmZE51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10uY2xhc3MsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgcGFyY2VsYWJsZU51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXS5jbGFzcywgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlLkNSRUFUT1IsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludGVyZmFjZU51bGxhYmxlQXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYm9vbE51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYm9vbGVhbltdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGJ5dGVOdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjaGFyTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShjaGFyW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50TnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShpbnRbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBsb25nTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShsb25nW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZmxvYXROdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGZsb2F0W11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgZG91YmxlTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShkb3VibGVbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBzdHJpbmdOdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGphdmEubGFuZy5TdHJpbmdbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBieXRlRW51bU51bGxhYmxlTWF0cml4ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUZpeGVkQXJyYXkoYnl0ZVtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGludEVudW1OdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGludFtdW10uY2xhc3MsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGxvbmdFbnVtTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShsb25nW11bXS5jbGFzcywgMiwgMik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYmluZGVyTnVsbGFibGVNYXRyaXggPSBfYWlkbF9wYXJjZWwuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXVtdLmNsYXNzLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBwZmROdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXVtdLmNsYXNzLCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IsIDIsIDIpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAyLCAyKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCA9IF9haWRsX3BhcmNlbC5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlW11bXS5jbGFzcywgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UsIDIsIDIpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBhcmNlbGFibGVBcnJheSk7CisgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwYXJjZWxhYmxlTWF0cml4KTsKKyAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBmZE51bGxhYmxlQXJyYXkpOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGZkTnVsbGFibGVNYXRyaXgpOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsYWJsZU51bGxhYmxlTWF0cml4KTsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaWYgKF92IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBmb3IgKE9iamVjdCBvIDogKE9iamVjdFtdKSBfdikgeworICAgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG8pOworICAgICAgfQorICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgICBpZiAoX3YgaW5zdGFuY2VvZiBhbmRyb2lkLm9zLlBhcmNlbGFibGUpIHsKKyAgICAgIHJldHVybiAoKGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgX3YpLmRlc2NyaWJlQ29udGVudHMoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHVibGljIGludGVyZmFjZSBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJUmVwZWF0Rml4ZWRTaXplQXJyYXkuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXBlYXRCeXRlcyhieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXBlYXRJbnRzKGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXBlYXRCaW5kZXJzKGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBSZXBlYXRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZVtdW10gUmVwZWF0MmRCeXRlcyhieXRlW11bXSBpbnB1dCwgYnl0ZVtdW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W11bXSBSZXBlYXQyZEludHMoaW50W11bXSBpbnB1dCwgaW50W11bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIFJlcGVhdDJkQmluZGVycyhhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gUmVwZWF0MmRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIGlucHV0LCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKyAgICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5CisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5IGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgICB7CisgICAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5KSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSlpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkuU3R1Yi5Qcm94eShvYmopOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZXM6CisgICAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUZpeGVkQXJyYXkoYnl0ZVtdLmNsYXNzLCAzKTsKKyAgICAgICAgICAgIGJ5dGVbXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGJ5dGVbM107CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgYnl0ZVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdEJ5dGVzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEludHM6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50W10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShpbnRbXS5jbGFzcywgMyk7CisgICAgICAgICAgICBpbnRbXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGludFszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXRJbnRzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEJpbmRlcnM6CisgICAgICAgICAgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXS5jbGFzcywgMyk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQub3MuSUJpbmRlclszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXRCaW5kZXJzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbGFibGVzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUZpeGVkQXJyYXkoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAzKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIF9hcmcxOworICAgICAgICAgICAgX2FyZzEgPSBuZXcgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlWzNdOworICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdFBhcmNlbGFibGVzKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlRml4ZWRBcnJheShfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdDJkQnl0ZXM6CisgICAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdW10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShieXRlW11bXS5jbGFzcywgMiwgMyk7CisgICAgICAgICAgICBieXRlW11bXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGJ5dGVbMl1bM107CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgYnl0ZVtdW10gX3Jlc3VsdCA9IHRoaXMuUmVwZWF0MmRCeXRlcyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXQyZEludHM6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50W11bXSBfYXJnMDsKKyAgICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVGaXhlZEFycmF5KGludFtdW10uY2xhc3MsIDIsIDMpOworICAgICAgICAgICAgaW50W11bXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGludFsyXVszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBpbnRbXVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdDJkSW50cyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnM6CisgICAgICAgICAgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW11bXSBfYXJnMDsKKyAgICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdW10uY2xhc3MsIDIsIDMpOworICAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW11bXSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQub3MuSUJpbmRlclsyXVszXTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdDJkQmluZGVycyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUuQ1JFQVRPUiwgMiwgMyk7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIF9hcmcxOworICAgICAgICAgICAgX2FyZzEgPSBuZXcgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlWzJdWzNdOworICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gX3Jlc3VsdCA9IHRoaXMuUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnMCwgX2FyZzEpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVGaXhlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUZpeGVkQXJyYXkoX2FyZzEsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSwgMiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkKKyAgICAgIHsKKyAgICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgICAgeworICAgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXBlYXRCeXRlcyhieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGJ5dGVbXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRCeXRlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXS5jbGFzcywgMyk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEZpeGVkQXJyYXkocmVwZWF0ZWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmVwZWF0SW50cyhpbnRbXSBpbnB1dCwgaW50W10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBpbnRbXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRJbnRzLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZUZpeGVkQXJyYXkoaW50W10uY2xhc3MsIDMpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRGaXhlZEFycmF5KHJlcGVhdGVkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJlcGVhdEJpbmRlcnMoYW5kcm9pZC5vcy5JQmluZGVyW10gaW5wdXQsIGFuZHJvaWQub3MuSUJpbmRlcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCwgMCwgMyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdLmNsYXNzLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBSZXBlYXRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxhYmxlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdLmNsYXNzLCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGUuQ1JFQVRPUiwgMyk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEZpeGVkQXJyYXkocmVwZWF0ZWQsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXVtdIFJlcGVhdDJkQnl0ZXMoYnl0ZVtdW10gaW5wdXQsIGJ5dGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYnl0ZVtdW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCwgMCwgMiwgMyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0MmRCeXRlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGJ5dGVbXVtdLmNsYXNzLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXVtdIFJlcGVhdDJkSW50cyhpbnRbXVtdIGlucHV0LCBpbnRbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgaW50W11bXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAyLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXQyZEludHMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlRml4ZWRBcnJheShpbnRbXVtdLmNsYXNzLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIFJlcGVhdDJkQmluZGVycyhhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyW11bXSBfcmVzdWx0OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVGaXhlZEFycmF5KGlucHV0LCAwLCAyLCAzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlRml4ZWRBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXVtdLmNsYXNzLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIFJlcGVhdDJkUGFyY2VsYWJsZXMoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW11bXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW11bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlRml4ZWRBcnJheShpbnB1dCwgMCwgMiwgMyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0MmRQYXJjZWxhYmxlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVGaXhlZEFycmF5KGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10uY2xhc3MsIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZS5DUkVBVE9SLCAyLCAzKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkRml4ZWRBcnJheShyZXBlYXRlZCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlLkNSRUFUT1IpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdEludHMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxKTsKKyAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIpOworICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxhYmxlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMpOworICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXQyZEJ5dGVzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNCk7CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdDJkSW50cyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUpOworICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXQyZEJpbmRlcnMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2KTsKKyAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0MmRQYXJjZWxhYmxlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDcpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkZml4ZWRzaXplYXJyYXkkRml4ZWRTaXplQXJyYXlFeGFtcGxlJElSZXBlYXRGaXhlZFNpemVBcnJheSIucmVwbGFjZSgnJCcsICcuJyk7CisgICAgcHVibGljIGJ5dGVbXSBSZXBlYXRCeXRlcyhieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBpbnRbXSBSZXBlYXRJbnRzKGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXBlYXRCaW5kZXJzKGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBSZXBlYXRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXSBpbnB1dCwgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYnl0ZVtdW10gUmVwZWF0MmRCeXRlcyhieXRlW11bXSBpbnB1dCwgYnl0ZVtdW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgaW50W11bXSBSZXBlYXQyZEludHMoaW50W11bXSBpbnB1dCwgaW50W11bXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIFJlcGVhdDJkQmluZGVycyhhbmRyb2lkLm9zLklCaW5kZXJbXVtdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZVtdW10gUmVwZWF0MmRQYXJjZWxhYmxlcyhhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIGlucHV0LCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEJ5dGVFbnVtIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQSA9IDA7CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEludEVudW0geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEgPSAwOworICB9CisgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBMb25nRW51bSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEEgPSAwTDsKKyAgfQorICBwdWJsaWMgc3RhdGljIGNsYXNzIEludFBhcmNlbGFibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgeworICAgIHB1YmxpYyBpbnQgdmFsdWUgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8SW50UGFyY2VsYWJsZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxJbnRQYXJjZWxhYmxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEludFBhcmNlbGFibGUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBfYWlkbF9vdXQgPSBuZXcgSW50UGFyY2VsYWJsZSgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEludFBhcmNlbGFibGVbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IEludFBhcmNlbGFibGVbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQodmFsdWUpOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICB2YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEludFBhcmNlbGFibGUpKSByZXR1cm4gZmFsc2U7CisgICAgICBJbnRQYXJjZWxhYmxlIHRoYXQgPSAoSW50UGFyY2VsYWJsZSlvdGhlcjsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyh2YWx1ZSwgdGhhdC52YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5kZWVwSGFzaENvZGUoamF2YS51dGlsLkFycmF5cy5hc0xpc3QodmFsdWUpLnRvQXJyYXkoKSk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorICB9CisgIHB1YmxpYyBpbnRlcmZhY2UgSUVtcHR5SW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCisgIHsKKyAgICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUVtcHR5SW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZQorICAgIHsKKyAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHN0dWIgYXQgYXR0YWNoIGl0IHRvIHRoZSBpbnRlcmZhY2UuICovCisgICAgICBwdWJsaWMgU3R1YigpCisgICAgICB7CisgICAgICAgIHRoaXMuYXR0YWNoSW50ZXJmYWNlKHRoaXMsIERFU0NSSVBUT1IpOworICAgICAgfQorICAgICAgLyoqCisgICAgICAgKiBDYXN0IGFuIElCaW5kZXIgb2JqZWN0IGludG8gYW4gYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UgaW50ZXJmYWNlLAorICAgICAgICogZ2VuZXJhdGluZyBhIHByb3h5IGlmIG5lZWRlZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSkpKSB7CisgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UpaWluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JRW1wdHlJbnRlcmZhY2UKKyAgICAgIHsKKyAgICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgICAgeworICAgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkZml4ZWRzaXplYXJyYXkkRml4ZWRTaXplQXJyYXlFeGFtcGxlJElFbXB0eUludGVyZmFjZSIucmVwbGFjZSgnJCcsICcuJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ2YmRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1qYXZhLXNvdXJjZS9nZW4vdGltZXN0YW1wCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjZGNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTM1MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7Citjb25zdCBjaGFyKiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50MngzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZieXRlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hhckFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZmbG9hdEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJ5dGVFbnVtQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50RW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdFbnVtQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjaGFyTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludE1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZsb25nTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZsb2F0TWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzdHJpbmdNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZUVudW1NYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50RW51bU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZsb25nRW51bU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYm9vbE51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZieXRlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmNoYXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmaW50TnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmZmxvYXROdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmZG91YmxlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ051bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZieXRlRW51bU51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmJpbmRlck51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZwZmROdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZU51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpbnRlcmZhY2VOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYm9vbE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmY2hhck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmaW50TnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZsb25nTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZmbG9hdE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmZG91YmxlTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZpbnRFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZsb25nRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmYmluZGVyTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZwZmROdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludDJ4Myk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNoYXJBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludEFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXRBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlRW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50RW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0VudW1BcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY2hhck1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludE1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBmbG9hdE1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ01hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVFbnVtTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50RW51bU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdFbnVtTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbE51bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGJ5dGVOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBjaGFyTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaW50TnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ051bGxhYmxlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGZsb2F0TnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0VudW1OdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBwZmROdWxsYWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgYm9vbE51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGNoYXJOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgaW50TnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXROdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ051bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBwZmROdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfZml4ZWRzaXplYXJyYXlfRml4ZWRTaXplQXJyYXlFeGFtcGxlX0lSZXBlYXRGaXhlZFNpemVBcnJheV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5Pig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKlJlcGVhdEJ5dGVzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTx1aW50OF90LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0Qnl0ZXMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEgLypSZXBlYXRJbnRzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PGludDMyX3QsIDM+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTxpbnQzMl90LCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PGludDMyX3QsIDM+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0SW50cyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMiAvKlJlcGVhdEJpbmRlcnMqLyk6IHsKKyAgICAgIHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4gb3V0X3JlcGVhdGVkOworICAgICAgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRCaW5kZXJzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzIC8qUmVwZWF0UGFyY2VsYWJsZXMqLyk6IHsKKyAgICAgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRQYXJjZWxhYmxlcyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNCAvKlJlcGVhdDJkQnl0ZXMqLyk6IHsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gaW5faW5wdXQ7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXQyZEJ5dGVzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1IC8qUmVwZWF0MmRJbnRzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0MmRJbnRzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2IC8qUmVwZWF0MmRCaW5kZXJzKi8pOiB7CisgICAgICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0MmRCaW5kZXJzKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3IC8qUmVwZWF0MmRQYXJjZWxhYmxlcyovKTogeworICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IGluX2lucHV0OworICAgICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+IG91dF9yZXBlYXRlZDsKKyAgICAgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdDJkUGFyY2VsYWJsZXMoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfZml4ZWRzaXplYXJyYXlfRml4ZWRTaXplQXJyYXlFeGFtcGxlX0lSZXBlYXRGaXhlZFNpemVBcnJheV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF9maXhlZHNpemVhcnJheV9GaXhlZFNpemVBcnJheUV4YW1wbGVfSVJlcGVhdEZpeGVkU2l6ZUFycmF5X29uVHJhbnNhY3QpOworCitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXkoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5Ojp+QnBSZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0Qnl0ZXMoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qUmVwZWF0Qnl0ZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRCeXRlcyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxIC8qUmVwZWF0SW50cyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdEludHMoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMiAvKlJlcGVhdEJpbmRlcnMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRCaW5kZXJzKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzIC8qUmVwZWF0UGFyY2VsYWJsZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRQYXJjZWxhYmxlcyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0IC8qUmVwZWF0MmRCeXRlcyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkQnl0ZXMoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5OjpSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1IC8qUmVwZWF0MmRJbnRzKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElSZXBlYXRGaXhlZFNpemVBcnJheTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0MmRJbnRzKGluX2lucHV0LCBvdXRfcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheTo6UmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNiAvKlJlcGVhdDJkQmluZGVycyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkQmluZGVycyhpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwUmVwZWF0Rml4ZWRTaXplQXJyYXk6OlJlcGVhdDJkUGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3IC8qUmVwZWF0MmRQYXJjZWxhYmxlcyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdDJkUGFyY2VsYWJsZXMoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCblJlcGVhdEZpeGVkU2l6ZUFycmF5CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXkoKSB7fQorRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCblJlcGVhdEZpeGVkU2l6ZUFycmF5Ojp+Qm5SZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9Cis6Om5kazo6U3BBSUJpbmRlciBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF9maXhlZHNpemVhcnJheV9GaXhlZFNpemVBcnJheUV4YW1wbGVfSVJlcGVhdEZpeGVkU2l6ZUFycmF5X2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElSZXBlYXRGaXhlZFNpemVBcnJheQorY29uc3QgY2hhciogRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkiOworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OklSZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTo6fklSZXBlYXRGaXhlZFNpemVBcnJheSgpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF9maXhlZHNpemVhcnJheV9GaXhlZFNpemVBcnJheUV4YW1wbGVfSVJlcGVhdEZpeGVkU2l6ZUFycmF5X2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXBlYXRGaXhlZFNpemVBcnJheT4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcFJlcGVhdEZpeGVkU2l6ZUFycmF5PihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiYgaW5zdGFuY2UpIHsKKyAgcmV0dXJuIEFQYXJjZWxfd3JpdGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpbnN0YW5jZSA/IGluc3RhbmNlLT5hc0JpbmRlcigpLmdldCgpIDogbnVsbHB0cik7Cit9CitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5Ojpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheT4mIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElSZXBlYXRGaXhlZFNpemVBcnJheTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheTo6ZGVmYXVsdF9pbXBsID0gbnVsbHB0cjsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdDo6UmVwZWF0Qnl0ZXMoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAzPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdDo6UmVwZWF0SW50cyhjb25zdCBzdGQ6OmFycmF5PGludDMyX3QsIDM+JiAvKmluX2lucHV0Ki8sIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0OjpSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiAvKmluX2lucHV0Ki8sIHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OlJlcGVhdFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OlJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdDo6UmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIC8qaW5faW5wdXQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogLypvdXRfcmVwZWF0ZWQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OlJlcGVhdDJkQmluZGVycyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiogLypvdXRfcmVwZWF0ZWQqLywgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0OjpSZXBlYXQyZFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiYgLyppbl9pbnB1dCovLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIC8qb3V0X3JlcGVhdGVkKi8sIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0Ojppc1JlbW90ZSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworY29uc3QgY2hhciogRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSW50UGFyY2VsYWJsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmdmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgdmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5IHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICAodm9pZClfYWlkbF9iaW5kZXI7CisgICh2b2lkKV9haWRsX2NvZGU7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2VfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfZml4ZWRzaXplYXJyYXlfRml4ZWRTaXplQXJyYXlFeGFtcGxlX0lFbXB0eUludGVyZmFjZV9vblRyYW5zYWN0KTsKKworRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCcEVtcHR5SW50ZXJmYWNlOjpCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6QnBFbXB0eUludGVyZmFjZTo6fkJwRW1wdHlJbnRlcmZhY2UoKSB7fQorCisvLyBTb3VyY2UgZm9yIEJuRW1wdHlJbnRlcmZhY2UKK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpIHt9CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJuRW1wdHlJbnRlcmZhY2U6On5CbkVtcHR5SW50ZXJmYWNlKCkge30KKzo6bmRrOjpTcEFJQmluZGVyIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qm5FbXB0eUludGVyZmFjZTo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSUVtcHR5SW50ZXJmYWNlCitjb25zdCBjaGFyKiBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSI7CitGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlKCkge30KK0ZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjp+SUVtcHR5SW50ZXJmYWNlKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX2ZpeGVkc2l6ZWFycmF5X0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV9JRW1wdHlJbnRlcmZhY2VfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKKyAgaWYgKGludGVyZmFjZSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SUVtcHR5SW50ZXJmYWNlPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJwRW1wdHlJbnRlcmZhY2U+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemVBcnJheUV4YW1wbGU6OklFbXB0eUludGVyZmFjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpIHsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOworICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7CisgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICAqaW5zdGFuY2UgPSBJRW1wdHlJbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlFbXB0eUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlPiYgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGw7Cit9CitzdGQ6OnNoYXJlZF9wdHI8Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+IEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNwQUlCaW5kZXIgRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2VEZWZhdWx0Ojphc0JpbmRlcigpIHsKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKCk7Cit9Citib29sIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SUVtcHR5SW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSBmaXhlZHNpemVhcnJheQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0MzQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQm5GaXhlZFNpemVBcnJheUV4YW1wbGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvQm5GaXhlZFNpemVBcnJheUV4YW1wbGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CcEZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9CcEZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWNmMjkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaApAQCAtMCwwICsxLDQwMyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitjbGFzcyBGaXhlZFNpemVBcnJheUV4YW1wbGUgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBjbGFzcyBJbnRQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSAhPSBzdGQ6OnRpZShyaHMudmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpIDwgc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPD0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSkgPT0gc3RkOjp0aWUocmhzLnZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEludFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlKSA+IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUpID49IHN0ZDo6dGllKHJocy52YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkludFBhcmNlbGFibGV7IjsKKyAgICAgIG9zIDw8ICJ2YWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyh2YWx1ZSk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OworICBjbGFzcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICAgIElSZXBlYXRGaXhlZFNpemVBcnJheSgpOworICAgIHZpcnR1YWwgfklSZXBlYXRGaXhlZFNpemVBcnJheSgpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRCeXRlcyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50cyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0QmluZGVycyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsYWJsZXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkQnl0ZXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdDJkSW50cyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0MmRCaW5kZXJzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXQyZFBhcmNlbGFibGVzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDc7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4mIGdldERlZmF1bHRJbXBsKCk7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIF9haWRsX3JldHVybikgPSAwOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElSZXBlYXRGaXhlZFNpemVBcnJheT4gZGVmYXVsdF9pbXBsOworICB9OworICBjbGFzcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0IDogcHVibGljIElSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgIHB1YmxpYzoKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlcyhjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTx1aW50OF90LCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludHMoY29uc3Qgc3RkOjphcnJheTxpbnQzMl90LCAzPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsYWJsZXMoY29uc3Qgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8dWludDhfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRJbnRzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50MzJfdCwgMz4sIDI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRCaW5kZXJzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4sIDI+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0MmRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4sIDI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworICB9OworICBjbGFzcyBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8SVJlcGVhdEZpeGVkU2l6ZUFycmF5PiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5KGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHZpcnR1YWwgfkJwUmVwZWF0Rml4ZWRTaXplQXJyYXkoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50cyhjb25zdCBzdGQ6OmFycmF5PGludDMyX3QsIDM+JiBpbl9pbnB1dCwgc3RkOjphcnJheTxpbnQzMl90LCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PGludDMyX3QsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRQYXJjZWxhYmxlcyhjb25zdCBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4mIGluX2lucHV0LCBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMz4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdDJkQnl0ZXMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTx1aW50OF90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEludHMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAzPiwgMj4qIG91dF9yZXBlYXRlZCwgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZEJpbmRlcnMoY29uc3Qgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6bmRrOjpTcEFJQmluZGVyLCAzPiwgMj4mIGluX2lucHV0LCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNwQUlCaW5kZXIsIDM+LCAyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXQyZFBhcmNlbGFibGVzKGNvbnN0IHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiYgaW5faW5wdXQsIHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGUsIDM+LCAyPiogb3V0X3JlcGVhdGVkLCBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRQYXJjZWxhYmxlLCAzPiwgMj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJUmVwZWF0Rml4ZWRTaXplQXJyYXk+IHsKKyAgcHVibGljOgorICAgIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkoKTsKKyAgICB2aXJ0dWFsIH5CblJlcGVhdEZpeGVkU2l6ZUFycmF5KCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgZW51bSBjbGFzcyBCeXRlRW51bSA6IGludDhfdCB7CisgICAgQSA9IDAsCisgIH07CisKKyAgZW51bSBjbGFzcyBJbnRFbnVtIDogaW50MzJfdCB7CisgICAgQSA9IDAsCisgIH07CisKKyAgZW51bSBjbGFzcyBMb25nRW51bSA6IGludDY0X3QgeworICAgIEEgPSAwTCwKKyAgfTsKKworICBjbGFzcyBJRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICAgIElFbXB0eUludGVyZmFjZSgpOworICAgIHZpcnR1YWwgfklFbXB0eUludGVyZmFjZSgpOworCisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpOworCisgIH07CisgIGNsYXNzIEJuRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIEJuRW1wdHlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5CbkVtcHR5SW50ZXJmYWNlKCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDM+LCAyPiBpbnQyeDMgPSB7e3t7MSwgMiwgM319LCB7ezQsIDUsIDZ9fX19OworICBzdGQ6OmFycmF5PGJvb2wsIDI+IGJvb2xBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8dWludDhfdCwgMj4gYnl0ZUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxjaGFyMTZfdCwgMj4gY2hhckFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxpbnQzMl90LCAyPiBpbnRBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8aW50NjRfdCwgMj4gbG9uZ0FycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxmbG9hdCwgMj4gZmxvYXRBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiBkb3VibGVBcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjpzdHJpbmcsIDI+IHN0cmluZ0FycmF5ID0ge3siaGVsbG8iLCAid29ybGQifX07CisgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSwgMj4gYnl0ZUVudW1BcnJheSA9IHt7fX07CisgIHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiBpbnRFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0sIDI+IGxvbmdFbnVtQXJyYXkgPSB7e319OworICBzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMj4gcGFyY2VsYWJsZUFycmF5ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGJvb2wsIDI+LCAyPiBib29sTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+LCAyPiBieXRlTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGNoYXIxNl90LCAyPiwgMj4gY2hhck1hdHJpeCA9IHt7fX07CisgIHN0ZDo6YXJyYXk8c3RkOjphcnJheTxpbnQzMl90LCAyPiwgMj4gaW50TWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludDY0X3QsIDI+LCAyPiBsb25nTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGZsb2F0LCAyPiwgMj4gZmxvYXRNYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiwgMj4gZG91YmxlTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PHN0ZDo6c3RyaW5nLCAyPiwgMj4gc3RyaW5nTWF0cml4ID0ge3t7eyJoZWxsbyIsICJ3b3JsZCJ9fSwge3siQ2lhbyIsICJtb25kbyJ9fX19OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSwgMj4sIDI+IGJ5dGVFbnVtTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMj4sIDI+IGludEVudW1NYXRyaXggPSB7e319OworICBzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMj4sIDI+IGxvbmdFbnVtTWF0cml4ID0ge3t9fTsKKyAgc3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZSwgMj4sIDI+IHBhcmNlbGFibGVNYXRyaXggPSB7e319OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8Ym9vbCwgMj4+IGJvb2xOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8dWludDhfdCwgMj4+IGJ5dGVOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8Y2hhcjE2X3QsIDI+PiBjaGFyTnVsbGFibGVBcnJheTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PGludDMyX3QsIDI+PiBpbnROdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8aW50NjRfdCwgMj4+IGxvbmdOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8ZmxvYXQsIDI+PiBmbG9hdE51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxkb3VibGUsIDI+PiBkb3VibGVOdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4sIDI+PiBzdHJpbmdOdWxsYWJsZUFycmF5ID0ge3t7ImhlbGxvIiwgIndvcmxkIn19fTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+PiBieXRlRW51bU51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW0sIDI+PiBpbnRFbnVtTnVsbGFibGVBcnJheTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0sIDI+PiBsb25nRW51bU51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMj4+IGJpbmRlck51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IsIDI+PiBwZmROdWxsYWJsZUFycmF5OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludFBhcmNlbGFibGU+LCAyPj4gcGFyY2VsYWJsZU51bGxhYmxlQXJyYXk7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+LCAyPj4gaW50ZXJmYWNlTnVsbGFibGVBcnJheTsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8Ym9vbCwgMj4sIDI+PiBib29sTnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+LCAyPj4gYnl0ZU51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxjaGFyMTZfdCwgMj4sIDI+PiBjaGFyTnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGludDMyX3QsIDI+LCAyPj4gaW50TnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PGludDY0X3QsIDI+LCAyPj4gbG9uZ051bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxmbG9hdCwgMj4sIDI+PiBmbG9hdE51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxkb3VibGUsIDI+LCAyPj4gZG91YmxlTnVsbGFibGVNYXRyaXg7CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+LCAyPiwgMj4+IHN0cmluZ051bGxhYmxlTWF0cml4ID0ge3t7e3siaGVsbG8iLCAid29ybGQifX0sIHt7IkNpYW8iLCAibW9uZG8ifX19fX07CisgIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTxzdGQ6OmFycmF5PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDI+LCAyPj4gYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJbnRFbnVtLCAyPiwgMj4+IGludEVudW1OdWxsYWJsZU1hdHJpeDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMj4sIDI+PiBsb25nRW51bU51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTw6Om5kazo6U3BBSUJpbmRlciwgMj4sIDI+PiBiaW5kZXJOdWxsYWJsZU1hdHJpeDsKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yLCAyPiwgMj4+IHBmZE51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50UGFyY2VsYWJsZT4sIDI+LCAyPj4gcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8c3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpJRW1wdHlJbnRlcmZhY2U+LCAyPiwgMj4+IGludGVyZmFjZU51bGxhYmxlTWF0cml4OworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSAhPSBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSA8IHN0ZDo6dGllKHJocy5pbnQyeDMsIHJocy5ib29sQXJyYXksIHJocy5ieXRlQXJyYXksIHJocy5jaGFyQXJyYXksIHJocy5pbnRBcnJheSwgcmhzLmxvbmdBcnJheSwgcmhzLmZsb2F0QXJyYXksIHJocy5kb3VibGVBcnJheSwgcmhzLnN0cmluZ0FycmF5LCByaHMuYnl0ZUVudW1BcnJheSwgcmhzLmludEVudW1BcnJheSwgcmhzLmxvbmdFbnVtQXJyYXksIHJocy5wYXJjZWxhYmxlQXJyYXksIHJocy5ib29sTWF0cml4LCByaHMuYnl0ZU1hdHJpeCwgcmhzLmNoYXJNYXRyaXgsIHJocy5pbnRNYXRyaXgsIHJocy5sb25nTWF0cml4LCByaHMuZmxvYXRNYXRyaXgsIHJocy5kb3VibGVNYXRyaXgsIHJocy5zdHJpbmdNYXRyaXgsIHJocy5ieXRlRW51bU1hdHJpeCwgcmhzLmludEVudW1NYXRyaXgsIHJocy5sb25nRW51bU1hdHJpeCwgcmhzLnBhcmNlbGFibGVNYXRyaXgsIHJocy5ib29sTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVOdWxsYWJsZUFycmF5LCByaHMuY2hhck51bGxhYmxlQXJyYXksIHJocy5pbnROdWxsYWJsZUFycmF5LCByaHMubG9uZ051bGxhYmxlQXJyYXksIHJocy5mbG9hdE51bGxhYmxlQXJyYXksIHJocy5kb3VibGVOdWxsYWJsZUFycmF5LCByaHMuc3RyaW5nTnVsbGFibGVBcnJheSwgcmhzLmJ5dGVFbnVtTnVsbGFibGVBcnJheSwgcmhzLmludEVudW1OdWxsYWJsZUFycmF5LCByaHMubG9uZ0VudW1OdWxsYWJsZUFycmF5LCByaHMuYmluZGVyTnVsbGFibGVBcnJheSwgcmhzLnBmZE51bGxhYmxlQXJyYXksIHJocy5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgcmhzLmludGVyZmFjZU51bGxhYmxlQXJyYXksIHJocy5ib29sTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlTnVsbGFibGVNYXRyaXgsIHJocy5jaGFyTnVsbGFibGVNYXRyaXgsIHJocy5pbnROdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmZsb2F0TnVsbGFibGVNYXRyaXgsIHJocy5kb3VibGVOdWxsYWJsZU1hdHJpeCwgcmhzLnN0cmluZ051bGxhYmxlTWF0cml4LCByaHMuYnl0ZUVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmludEVudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5iaW5kZXJOdWxsYWJsZU1hdHJpeCwgcmhzLnBmZE51bGxhYmxlTWF0cml4LCByaHMucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCByaHMuaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRml4ZWRTaXplQXJyYXlFeGFtcGxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoaW50MngzLCBib29sQXJyYXksIGJ5dGVBcnJheSwgY2hhckFycmF5LCBpbnRBcnJheSwgbG9uZ0FycmF5LCBmbG9hdEFycmF5LCBkb3VibGVBcnJheSwgc3RyaW5nQXJyYXksIGJ5dGVFbnVtQXJyYXksIGludEVudW1BcnJheSwgbG9uZ0VudW1BcnJheSwgcGFyY2VsYWJsZUFycmF5LCBib29sTWF0cml4LCBieXRlTWF0cml4LCBjaGFyTWF0cml4LCBpbnRNYXRyaXgsIGxvbmdNYXRyaXgsIGZsb2F0TWF0cml4LCBkb3VibGVNYXRyaXgsIHN0cmluZ01hdHJpeCwgYnl0ZUVudW1NYXRyaXgsIGludEVudW1NYXRyaXgsIGxvbmdFbnVtTWF0cml4LCBwYXJjZWxhYmxlTWF0cml4LCBib29sTnVsbGFibGVBcnJheSwgYnl0ZU51bGxhYmxlQXJyYXksIGNoYXJOdWxsYWJsZUFycmF5LCBpbnROdWxsYWJsZUFycmF5LCBsb25nTnVsbGFibGVBcnJheSwgZmxvYXROdWxsYWJsZUFycmF5LCBkb3VibGVOdWxsYWJsZUFycmF5LCBzdHJpbmdOdWxsYWJsZUFycmF5LCBieXRlRW51bU51bGxhYmxlQXJyYXksIGludEVudW1OdWxsYWJsZUFycmF5LCBsb25nRW51bU51bGxhYmxlQXJyYXksIGJpbmRlck51bGxhYmxlQXJyYXksIHBmZE51bGxhYmxlQXJyYXksIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5LCBib29sTnVsbGFibGVNYXRyaXgsIGJ5dGVOdWxsYWJsZU1hdHJpeCwgY2hhck51bGxhYmxlTWF0cml4LCBpbnROdWxsYWJsZU1hdHJpeCwgbG9uZ051bGxhYmxlTWF0cml4LCBmbG9hdE51bGxhYmxlTWF0cml4LCBkb3VibGVOdWxsYWJsZU1hdHJpeCwgc3RyaW5nTnVsbGFibGVNYXRyaXgsIGJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIGludEVudW1OdWxsYWJsZU1hdHJpeCwgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgYmluZGVyTnVsbGFibGVNYXRyaXgsIHBmZE51bGxhYmxlTWF0cml4LCBwYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIGludGVyZmFjZU51bGxhYmxlTWF0cml4KSA8PSBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPT0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPiBzdGQ6OnRpZShyaHMuaW50MngzLCByaHMuYm9vbEFycmF5LCByaHMuYnl0ZUFycmF5LCByaHMuY2hhckFycmF5LCByaHMuaW50QXJyYXksIHJocy5sb25nQXJyYXksIHJocy5mbG9hdEFycmF5LCByaHMuZG91YmxlQXJyYXksIHJocy5zdHJpbmdBcnJheSwgcmhzLmJ5dGVFbnVtQXJyYXksIHJocy5pbnRFbnVtQXJyYXksIHJocy5sb25nRW51bUFycmF5LCByaHMucGFyY2VsYWJsZUFycmF5LCByaHMuYm9vbE1hdHJpeCwgcmhzLmJ5dGVNYXRyaXgsIHJocy5jaGFyTWF0cml4LCByaHMuaW50TWF0cml4LCByaHMubG9uZ01hdHJpeCwgcmhzLmZsb2F0TWF0cml4LCByaHMuZG91YmxlTWF0cml4LCByaHMuc3RyaW5nTWF0cml4LCByaHMuYnl0ZUVudW1NYXRyaXgsIHJocy5pbnRFbnVtTWF0cml4LCByaHMubG9uZ0VudW1NYXRyaXgsIHJocy5wYXJjZWxhYmxlTWF0cml4LCByaHMuYm9vbE51bGxhYmxlQXJyYXksIHJocy5ieXRlTnVsbGFibGVBcnJheSwgcmhzLmNoYXJOdWxsYWJsZUFycmF5LCByaHMuaW50TnVsbGFibGVBcnJheSwgcmhzLmxvbmdOdWxsYWJsZUFycmF5LCByaHMuZmxvYXROdWxsYWJsZUFycmF5LCByaHMuZG91YmxlTnVsbGFibGVBcnJheSwgcmhzLnN0cmluZ051bGxhYmxlQXJyYXksIHJocy5ieXRlRW51bU51bGxhYmxlQXJyYXksIHJocy5pbnRFbnVtTnVsbGFibGVBcnJheSwgcmhzLmxvbmdFbnVtTnVsbGFibGVBcnJheSwgcmhzLmJpbmRlck51bGxhYmxlQXJyYXksIHJocy5wZmROdWxsYWJsZUFycmF5LCByaHMucGFyY2VsYWJsZU51bGxhYmxlQXJyYXksIHJocy5pbnRlcmZhY2VOdWxsYWJsZUFycmF5LCByaHMuYm9vbE51bGxhYmxlTWF0cml4LCByaHMuYnl0ZU51bGxhYmxlTWF0cml4LCByaHMuY2hhck51bGxhYmxlTWF0cml4LCByaHMuaW50TnVsbGFibGVNYXRyaXgsIHJocy5sb25nTnVsbGFibGVNYXRyaXgsIHJocy5mbG9hdE51bGxhYmxlTWF0cml4LCByaHMuZG91YmxlTnVsbGFibGVNYXRyaXgsIHJocy5zdHJpbmdOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5pbnRFbnVtTnVsbGFibGVNYXRyaXgsIHJocy5sb25nRW51bU51bGxhYmxlTWF0cml4LCByaHMuYmluZGVyTnVsbGFibGVNYXRyaXgsIHJocy5wZmROdWxsYWJsZU1hdHJpeCwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCwgcmhzLmludGVyZmFjZU51bGxhYmxlTWF0cml4KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGludDJ4MywgYm9vbEFycmF5LCBieXRlQXJyYXksIGNoYXJBcnJheSwgaW50QXJyYXksIGxvbmdBcnJheSwgZmxvYXRBcnJheSwgZG91YmxlQXJyYXksIHN0cmluZ0FycmF5LCBieXRlRW51bUFycmF5LCBpbnRFbnVtQXJyYXksIGxvbmdFbnVtQXJyYXksIHBhcmNlbGFibGVBcnJheSwgYm9vbE1hdHJpeCwgYnl0ZU1hdHJpeCwgY2hhck1hdHJpeCwgaW50TWF0cml4LCBsb25nTWF0cml4LCBmbG9hdE1hdHJpeCwgZG91YmxlTWF0cml4LCBzdHJpbmdNYXRyaXgsIGJ5dGVFbnVtTWF0cml4LCBpbnRFbnVtTWF0cml4LCBsb25nRW51bU1hdHJpeCwgcGFyY2VsYWJsZU1hdHJpeCwgYm9vbE51bGxhYmxlQXJyYXksIGJ5dGVOdWxsYWJsZUFycmF5LCBjaGFyTnVsbGFibGVBcnJheSwgaW50TnVsbGFibGVBcnJheSwgbG9uZ051bGxhYmxlQXJyYXksIGZsb2F0TnVsbGFibGVBcnJheSwgZG91YmxlTnVsbGFibGVBcnJheSwgc3RyaW5nTnVsbGFibGVBcnJheSwgYnl0ZUVudW1OdWxsYWJsZUFycmF5LCBpbnRFbnVtTnVsbGFibGVBcnJheSwgbG9uZ0VudW1OdWxsYWJsZUFycmF5LCBiaW5kZXJOdWxsYWJsZUFycmF5LCBwZmROdWxsYWJsZUFycmF5LCBwYXJjZWxhYmxlTnVsbGFibGVBcnJheSwgaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgYm9vbE51bGxhYmxlTWF0cml4LCBieXRlTnVsbGFibGVNYXRyaXgsIGNoYXJOdWxsYWJsZU1hdHJpeCwgaW50TnVsbGFibGVNYXRyaXgsIGxvbmdOdWxsYWJsZU1hdHJpeCwgZmxvYXROdWxsYWJsZU1hdHJpeCwgZG91YmxlTnVsbGFibGVNYXRyaXgsIHN0cmluZ051bGxhYmxlTWF0cml4LCBieXRlRW51bU51bGxhYmxlTWF0cml4LCBpbnRFbnVtTnVsbGFibGVNYXRyaXgsIGxvbmdFbnVtTnVsbGFibGVNYXRyaXgsIGJpbmRlck51bGxhYmxlTWF0cml4LCBwZmROdWxsYWJsZU1hdHJpeCwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4LCBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCkgPj0gc3RkOjp0aWUocmhzLmludDJ4MywgcmhzLmJvb2xBcnJheSwgcmhzLmJ5dGVBcnJheSwgcmhzLmNoYXJBcnJheSwgcmhzLmludEFycmF5LCByaHMubG9uZ0FycmF5LCByaHMuZmxvYXRBcnJheSwgcmhzLmRvdWJsZUFycmF5LCByaHMuc3RyaW5nQXJyYXksIHJocy5ieXRlRW51bUFycmF5LCByaHMuaW50RW51bUFycmF5LCByaHMubG9uZ0VudW1BcnJheSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmJvb2xNYXRyaXgsIHJocy5ieXRlTWF0cml4LCByaHMuY2hhck1hdHJpeCwgcmhzLmludE1hdHJpeCwgcmhzLmxvbmdNYXRyaXgsIHJocy5mbG9hdE1hdHJpeCwgcmhzLmRvdWJsZU1hdHJpeCwgcmhzLnN0cmluZ01hdHJpeCwgcmhzLmJ5dGVFbnVtTWF0cml4LCByaHMuaW50RW51bU1hdHJpeCwgcmhzLmxvbmdFbnVtTWF0cml4LCByaHMucGFyY2VsYWJsZU1hdHJpeCwgcmhzLmJvb2xOdWxsYWJsZUFycmF5LCByaHMuYnl0ZU51bGxhYmxlQXJyYXksIHJocy5jaGFyTnVsbGFibGVBcnJheSwgcmhzLmludE51bGxhYmxlQXJyYXksIHJocy5sb25nTnVsbGFibGVBcnJheSwgcmhzLmZsb2F0TnVsbGFibGVBcnJheSwgcmhzLmRvdWJsZU51bGxhYmxlQXJyYXksIHJocy5zdHJpbmdOdWxsYWJsZUFycmF5LCByaHMuYnl0ZUVudW1OdWxsYWJsZUFycmF5LCByaHMuaW50RW51bU51bGxhYmxlQXJyYXksIHJocy5sb25nRW51bU51bGxhYmxlQXJyYXksIHJocy5iaW5kZXJOdWxsYWJsZUFycmF5LCByaHMucGZkTnVsbGFibGVBcnJheSwgcmhzLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5LCByaHMuaW50ZXJmYWNlTnVsbGFibGVBcnJheSwgcmhzLmJvb2xOdWxsYWJsZU1hdHJpeCwgcmhzLmJ5dGVOdWxsYWJsZU1hdHJpeCwgcmhzLmNoYXJOdWxsYWJsZU1hdHJpeCwgcmhzLmludE51bGxhYmxlTWF0cml4LCByaHMubG9uZ051bGxhYmxlTWF0cml4LCByaHMuZmxvYXROdWxsYWJsZU1hdHJpeCwgcmhzLmRvdWJsZU51bGxhYmxlTWF0cml4LCByaHMuc3RyaW5nTnVsbGFibGVNYXRyaXgsIHJocy5ieXRlRW51bU51bGxhYmxlTWF0cml4LCByaHMuaW50RW51bU51bGxhYmxlTWF0cml4LCByaHMubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCwgcmhzLmJpbmRlck51bGxhYmxlTWF0cml4LCByaHMucGZkTnVsbGFibGVNYXRyaXgsIHJocy5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgsIHJocy5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRml4ZWRTaXplQXJyYXlFeGFtcGxleyI7CisgICAgb3MgPDwgImludDJ4MzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQyeDMpOworICAgIG9zIDw8ICIsIGJvb2xBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sQXJyYXkpOworICAgIG9zIDw8ICIsIGJ5dGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlQXJyYXkpOworICAgIG9zIDw8ICIsIGNoYXJBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyQXJyYXkpOworICAgIG9zIDw8ICIsIGludEFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEFycmF5KTsKKyAgICBvcyA8PCAiLCBsb25nQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ0FycmF5KTsKKyAgICBvcyA8PCAiLCBmbG9hdEFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0QXJyYXkpOworICAgIG9zIDw8ICIsIGRvdWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdBcnJheSk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1BcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bUFycmF5KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtQXJyYXkpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJvb2xNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbE1hdHJpeCk7CisgICAgb3MgPDwgIiwgYnl0ZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBjaGFyTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJNYXRyaXgpOworICAgIG9zIDw8ICIsIGludE1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRNYXRyaXgpOworICAgIG9zIDw8ICIsIGxvbmdNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ01hdHJpeCk7CisgICAgb3MgPDwgIiwgZmxvYXRNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXRNYXRyaXgpOworICAgIG9zIDw8ICIsIGRvdWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhkb3VibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIHN0cmluZ01hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludEVudW1NYXRyaXgpOworICAgIG9zIDw8ICIsIGxvbmdFbnVtTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTWF0cml4KTsKKyAgICBvcyA8PCAiLCBwYXJjZWxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJvb2xOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgY2hhck51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hhck51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGludE51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50TnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ051bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ051bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGZsb2F0TnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmbG9hdE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGRvdWJsZU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgc3RyaW5nTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBieXRlRW51bU51bGxhYmxlQXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZUVudW1OdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnRFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgbG9uZ0VudW1OdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTnVsbGFibGVBcnJheSk7CisgICAgb3MgPDwgIiwgYmluZGVyTnVsbGFibGVBcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBwZmROdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZE51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVOdWxsYWJsZUFycmF5KTsKKyAgICBvcyA8PCAiLCBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludGVyZmFjZU51bGxhYmxlQXJyYXkpOworICAgIG9zIDw8ICIsIGJvb2xOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhib29sTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJ5dGVOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGNoYXJOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGludE51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludE51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobG9uZ051bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBmbG9hdE51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0TnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGRvdWJsZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBzdHJpbmdOdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgYnl0ZUVudW1OdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhieXRlRW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBpbnRFbnVtTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50RW51bU51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBsb25nRW51bU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdFbnVtTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICIsIGJpbmRlck51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlck51bGxhYmxlTWF0cml4KTsKKyAgICBvcyA8PCAiLCBwZmROdWxsYWJsZU1hdHJpeDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwZmROdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbGFibGVOdWxsYWJsZU1hdHJpeCk7CisgICAgb3MgPDwgIiwgaW50ZXJmYWNlTnVsbGFibGVNYXRyaXg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50ZXJmYWNlTnVsbGFibGVNYXRyaXgpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBmaXhlZHNpemVhcnJheSB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRml4ZWRTaXplQXJyYXlFeGFtcGxlOjpCeXRlRW51bSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW06OkE6CisgICAgcmV0dXJuICJBIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW0sIDE+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkJ5dGVFbnVtPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6Qnl0ZUVudW06OkEsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bTo6QToKKyAgICByZXR1cm4gIkEiOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQzMl90Pih2YWwpKTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGZpeGVkc2l6ZWFycmF5Cit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgbmRrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bSwgMT4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6SW50RW51bT4gPSB7CisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OkludEVudW06OkEsCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbmRrCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0gdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBGaXhlZFNpemVBcnJheUV4YW1wbGU6OkxvbmdFbnVtOjpBOgorICAgIHJldHVybiAiQSI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDY0X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgZml4ZWRzaXplYXJyYXkKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBuZGsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bSwgMT4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6TG9uZ0VudW0+ID0geworICBhaWRsOjphbmRyb2lkOjphaWRsOjpmaXhlZHNpemVhcnJheTo6Rml4ZWRTaXplQXJyYXlFeGFtcGxlOjpMb25nRW51bTo6QSwKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1uZGstc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktbmRrLXNvdXJjZS9nZW4vdGltZXN0YW1wCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvZml4ZWRzaXplYXJyYXkvRml4ZWRTaXplQXJyYXlFeGFtcGxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjIzODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5ycwpAQCAtMCwwICsxLDEwNzAgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorI1tkZXJpdmUoRGVidWcsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgIHB1YiBpbnQyeDM6IFtbaTMyOyAzXTsgMl0sCisgIHB1YiBib29sQXJyYXk6IFtib29sOyAyXSwKKyAgcHViIGJ5dGVBcnJheTogW3U4OyAyXSwKKyAgcHViIGNoYXJBcnJheTogW3UxNjsgMl0sCisgIHB1YiBpbnRBcnJheTogW2kzMjsgMl0sCisgIHB1YiBsb25nQXJyYXk6IFtpNjQ7IDJdLAorICBwdWIgZmxvYXRBcnJheTogW2YzMjsgMl0sCisgIHB1YiBkb3VibGVBcnJheTogW2Y2NDsgMl0sCisgIHB1YiBzdHJpbmdBcnJheTogW1N0cmluZzsgMl0sCisgIHB1YiBieXRlRW51bUFycmF5OiBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0J5dGVFbnVtOyAyXSwKKyAgcHViIGludEVudW1BcnJheTogW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOyAyXSwKKyAgcHViIGxvbmdFbnVtQXJyYXk6IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfTG9uZ0VudW07IDJdLAorICBwdWIgcGFyY2VsYWJsZUFycmF5OiBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAyXSwKKyAgcHViIGJvb2xNYXRyaXg6IFtbYm9vbDsgMl07IDJdLAorICBwdWIgYnl0ZU1hdHJpeDogW1t1ODsgMl07IDJdLAorICBwdWIgY2hhck1hdHJpeDogW1t1MTY7IDJdOyAyXSwKKyAgcHViIGludE1hdHJpeDogW1tpMzI7IDJdOyAyXSwKKyAgcHViIGxvbmdNYXRyaXg6IFtbaTY0OyAyXTsgMl0sCisgIHB1YiBmbG9hdE1hdHJpeDogW1tmMzI7IDJdOyAyXSwKKyAgcHViIGRvdWJsZU1hdHJpeDogW1tmNjQ7IDJdOyAyXSwKKyAgcHViIHN0cmluZ01hdHJpeDogW1tTdHJpbmc7IDJdOyAyXSwKKyAgcHViIGJ5dGVFbnVtTWF0cml4OiBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfOF9CeXRlRW51bTsgMl07IDJdLAorICBwdWIgaW50RW51bU1hdHJpeDogW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzdfSW50RW51bTsgMl07IDJdLAorICBwdWIgbG9uZ0VudW1NYXRyaXg6IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0xvbmdFbnVtOyAyXTsgMl0sCisgIHB1YiBwYXJjZWxhYmxlTWF0cml4OiBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgMl07IDJdLAorICBwdWIgYm9vbE51bGxhYmxlQXJyYXk6IE9wdGlvbjxbYm9vbDsgMl0+LAorICBwdWIgYnl0ZU51bGxhYmxlQXJyYXk6IE9wdGlvbjxbdTg7IDJdPiwKKyAgcHViIGNoYXJOdWxsYWJsZUFycmF5OiBPcHRpb248W3UxNjsgMl0+LAorICBwdWIgaW50TnVsbGFibGVBcnJheTogT3B0aW9uPFtpMzI7IDJdPiwKKyAgcHViIGxvbmdOdWxsYWJsZUFycmF5OiBPcHRpb248W2k2NDsgMl0+LAorICBwdWIgZmxvYXROdWxsYWJsZUFycmF5OiBPcHRpb248W2YzMjsgMl0+LAorICBwdWIgZG91YmxlTnVsbGFibGVBcnJheTogT3B0aW9uPFtmNjQ7IDJdPiwKKyAgcHViIHN0cmluZ051bGxhYmxlQXJyYXk6IE9wdGlvbjxbT3B0aW9uPFN0cmluZz47IDJdPiwKKyAgcHViIGJ5dGVFbnVtTnVsbGFibGVBcnJheTogT3B0aW9uPFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfQnl0ZUVudW07IDJdPiwKKyAgcHViIGludEVudW1OdWxsYWJsZUFycmF5OiBPcHRpb248W2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOyAyXT4sCisgIHB1YiBsb25nRW51bU51bGxhYmxlQXJyYXk6IE9wdGlvbjxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0xvbmdFbnVtOyAyXT4sCisgIHB1YiBiaW5kZXJOdWxsYWJsZUFycmF5OiBPcHRpb248W09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDJdPiwKKyAgcHViIHBmZE51bGxhYmxlQXJyYXk6IE9wdGlvbjxbT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+OyAyXT4sCisgIHB1YiBwYXJjZWxhYmxlTnVsbGFibGVBcnJheTogT3B0aW9uPFtPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlPjsgMl0+LAorICBwdWIgaW50ZXJmYWNlTnVsbGFibGVBcnJheTogT3B0aW9uPFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTVfSUVtcHR5SW50ZXJmYWNlPj47IDJdPiwKKyAgcHViIGJvb2xOdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbYm9vbDsgMl07IDJdPiwKKyAgcHViIGJ5dGVOdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbdTg7IDJdOyAyXT4sCisgIHB1YiBjaGFyTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW3UxNjsgMl07IDJdPiwKKyAgcHViIGludE51bGxhYmxlTWF0cml4OiBPcHRpb248W1tpMzI7IDJdOyAyXT4sCisgIHB1YiBsb25nTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW2k2NDsgMl07IDJdPiwKKyAgcHViIGZsb2F0TnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW2YzMjsgMl07IDJdPiwKKyAgcHViIGRvdWJsZU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tmNjQ7IDJdOyAyXT4sCisgIHB1YiBzdHJpbmdOdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbT3B0aW9uPFN0cmluZz47IDJdOyAyXT4sCisgIHB1YiBieXRlRW51bU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfQnl0ZUVudW07IDJdOyAyXT4sCisgIHB1YiBpbnRFbnVtTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOyAyXTsgMl0+LAorICBwdWIgbG9uZ0VudW1OdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV84X0xvbmdFbnVtOyAyXTsgMl0+LAorICBwdWIgYmluZGVyTnVsbGFibGVNYXRyaXg6IE9wdGlvbjxbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDJdOyAyXT4sCisgIHB1YiBwZmROdWxsYWJsZU1hdHJpeDogT3B0aW9uPFtbT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+OyAyXTsgMl0+LAorICBwdWIgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlPjsgMl07IDJdPiwKKyAgcHViIGludGVyZmFjZU51bGxhYmxlTWF0cml4OiBPcHRpb248W1tPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTVfSUVtcHR5SW50ZXJmYWNlPj47IDJdOyAyXT4sCit9CitpbXBsIERlZmF1bHQgZm9yIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGludDJ4MzogW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSwKKyAgICAgIGJvb2xBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGJ5dGVBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGNoYXJBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGludEFycmF5OiBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLAorICAgICAgbG9uZ0FycmF5OiBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLAorICAgICAgZmxvYXRBcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGRvdWJsZUFycmF5OiBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLAorICAgICAgc3RyaW5nQXJyYXk6IFsiaGVsbG8iLmludG8oKSwgIndvcmxkIi5pbnRvKCldLAorICAgICAgYnl0ZUVudW1BcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGludEVudW1BcnJheTogW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwKKyAgICAgIGxvbmdFbnVtQXJyYXk6IFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sCisgICAgICBwYXJjZWxhYmxlQXJyYXk6IFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sCisgICAgICBib29sTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBieXRlTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBjaGFyTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBpbnRNYXRyaXg6IFtbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLCBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldXSwKKyAgICAgIGxvbmdNYXRyaXg6IFtbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLCBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldXSwKKyAgICAgIGZsb2F0TWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBkb3VibGVNYXRyaXg6IFtbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldLCBbRGVmYXVsdDo6ZGVmYXVsdCgpLCBEZWZhdWx0OjpkZWZhdWx0KCldXSwKKyAgICAgIHN0cmluZ01hdHJpeDogW1siaGVsbG8iLmludG8oKSwgIndvcmxkIi5pbnRvKCldLCBbIkNpYW8iLmludG8oKSwgIm1vbmRvIi5pbnRvKCldXSwKKyAgICAgIGJ5dGVFbnVtTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBpbnRFbnVtTWF0cml4OiBbW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSwgW0RlZmF1bHQ6OmRlZmF1bHQoKSwgRGVmYXVsdDo6ZGVmYXVsdCgpXV0sCisgICAgICBsb25nRW51bU1hdHJpeDogW1tEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sIFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV1dLAorICAgICAgcGFyY2VsYWJsZU1hdHJpeDogW1tEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV0sIFtEZWZhdWx0OjpkZWZhdWx0KCksIERlZmF1bHQ6OmRlZmF1bHQoKV1dLAorICAgICAgYm9vbE51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJ5dGVOdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBjaGFyTnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgaW50TnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgbG9uZ051bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGZsb2F0TnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgZG91YmxlTnVsbGFibGVBcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgc3RyaW5nTnVsbGFibGVBcnJheTogU29tZShbU29tZSgiaGVsbG8iLmludG8oKSksIFNvbWUoIndvcmxkIi5pbnRvKCkpXSksCisgICAgICBieXRlRW51bU51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGludEVudW1OdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBsb25nRW51bU51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJpbmRlck51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIHBmZE51bGxhYmxlQXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIHBhcmNlbGFibGVOdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnRlcmZhY2VOdWxsYWJsZUFycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBib29sTnVsbGFibGVNYXRyaXg6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJ5dGVOdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgY2hhck51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnROdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgbG9uZ051bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBmbG9hdE51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBkb3VibGVOdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgc3RyaW5nTnVsbGFibGVNYXRyaXg6IFNvbWUoW1tTb21lKCJoZWxsbyIuaW50bygpKSwgU29tZSgid29ybGQiLmludG8oKSldLCBbU29tZSgiQ2lhbyIuaW50bygpKSwgU29tZSgibW9uZG8iLmludG8oKSldXSksCisgICAgICBieXRlRW51bU51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnRFbnVtTnVsbGFibGVNYXRyaXg6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGxvbmdFbnVtTnVsbGFibGVNYXRyaXg6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIGJpbmRlck51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBwZmROdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgcGFyY2VsYWJsZU51bGxhYmxlTWF0cml4OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBpbnRlcmZhY2VOdWxsYWJsZU1hdHJpeDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgIH0KKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEZpeGVkU2l6ZUFycmF5RXhhbXBsZSB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludDJ4Myk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoYXJBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludEFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0FycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXRBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlRW51bUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0VudW1BcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hhck1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludE1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmxvbmdNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5mbG9hdE1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnN0cmluZ01hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVFbnVtTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmxvbmdFbnVtTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYnl0ZU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jaGFyTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludE51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZsb2F0TnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zdHJpbmdOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYnl0ZUVudW1OdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nRW51bU51bGxhYmxlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5iaW5kZXJOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGZkTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVOdWxsYWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50ZXJmYWNlTnVsbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJvb2xOdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVOdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoYXJOdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludE51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ051bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXROdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZU51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nTnVsbGFibGVNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlRW51bU51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50RW51bU51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0VudW1OdWxsYWJsZU1hdHJpeCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJpbmRlck51bGxhYmxlTWF0cml4KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGZkTnVsbGFibGVNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wYXJjZWxhYmxlTnVsbGFibGVNYXRyaXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCk/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludDJ4MyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbEFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoYXJBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50QXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmxvYXRBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnN0cmluZ0FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlRW51bUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdFbnVtQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnBhcmNlbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbE1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuY2hhck1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50TWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5sb25nTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdE1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zdHJpbmdNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJ5dGVFbnVtTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5sb25nRW51bU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYucGFyY2VsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbE51bGxhYmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJ5dGVOdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5jaGFyTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50TnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYubG9uZ051bGxhYmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmZsb2F0TnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RyaW5nTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZUVudW1OdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYubG9uZ0VudW1OdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5iaW5kZXJOdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wZmROdWxsYWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wYXJjZWxhYmxlTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50ZXJmYWNlTnVsbGFibGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbE51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoYXJOdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50TnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdOdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmxvYXROdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnN0cmluZ051bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlRW51bU51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRFbnVtTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdFbnVtTnVsbGFibGVNYXRyaXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJpbmRlck51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wZmROdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYucGFyY2VsYWJsZU51bGxhYmxlTWF0cml4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnRlcmZhY2VOdWxsYWJsZU1hdHJpeCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRTaXplQXJyYXlFeGFtcGxlKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRTaXplQXJyYXlFeGFtcGxlKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBGaXhlZFNpemVBcnJheUV4YW1wbGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlIiB9Cit9CitwdWIgbW9kIElSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCisgICNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOworICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CisgIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgeworICAgIElSZXBlYXRGaXhlZFNpemVBcnJheVsiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXkiXSB7CisgICAgICBuYXRpdmU6IEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkob25fdHJhbnNhY3QpLAorICAgICAgcHJveHk6IEJwUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICAgICAgfSwKKyAgICAgIGFzeW5jOiBJUmVwZWF0Rml4ZWRTaXplQXJyYXlBc3luYywKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElSZXBlYXRGaXhlZFNpemVBcnJheTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSIgfQorICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPjsKKyAgICBmbiBSZXBlYXRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPjsKKyAgICBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+OworICAgIGZuIFJlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPjsKKyAgICBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPjsKKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+OworICAgIGZuIFJlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdPjsKKyAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPjsKKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHRSZWYpIC0+IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElSZXBlYXRGaXhlZFNpemVBcnJheUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSVJlcGVhdEZpeGVkU2l6ZUFycmF5IiB9CisgICAgZm4gUmVwZWF0Qnl0ZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4+OworICAgIGZuIFJlcGVhdEludHM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4+OworICAgIGZuIFJlcGVhdEJpbmRlcnM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbYmluZGVyOjpTcElCaW5kZXI7IDNdPj47CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4+OworICAgIGZuIFJlcGVhdDJkQnl0ZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtbdTg7IDNdOyAyXT4+OworICAgIGZuIFJlcGVhdDJkSW50czwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbW2kzMjsgM107IDJdPj47CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4+OworICAgIGZuIFJlcGVhdDJkUGFyY2VsYWJsZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXT4+OworICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJUmVwZWF0Rml4ZWRTaXplQXJyYXlBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheSIgfQorICAgIGFzeW5jIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPjsKKyAgICBhc3luYyBmbiBSZXBlYXRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPjsKKyAgICBhc3luYyBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+OworICAgIGFzeW5jIGZuIFJlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPjsKKyAgICBhc3luYyBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPjsKKyAgICBhc3luYyBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+OworICAgIGFzeW5jIGZuIFJlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdPjsKKyAgICBhc3luYyBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPjsKKyAgfQorICBpbXBsIEJuUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgICAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElSZXBlYXRGaXhlZFNpemVBcnJheT4KKyAgICB3aGVyZQorICAgICAgVDogSVJlcGVhdEZpeGVkU2l6ZUFycmF5QXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICAgIF9pbm5lcjogVCwKKyAgICAgICAgX3J0OiBSLAorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICAgIHdoZXJlCisgICAgICAgIFQ6IElSZXBlYXRGaXhlZFNpemVBcnJheUFzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICB7CisgICAgICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICAgIH0KKyAgICAgICAgZm4gUmVwZWF0SW50cygmc2VsZiwgX2FyZ19pbnB1dDogJltpMzI7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtpMzI7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICAgIH0KKyAgICAgICAgZm4gUmVwZWF0QmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbYmluZGVyOjpTcElCaW5kZXI7IDNdPiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgICBmbiBSZXBlYXRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgICB9CisgICAgICAgIGZuIFJlcGVhdDJkQnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW3U4OyAzXTsgMl0+IHsKKyAgICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgICB9CisgICAgICAgIGZuIFJlcGVhdDJkSW50cygmc2VsZiwgX2FyZ19pbnB1dDogJltbaTMyOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tpMzI7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tpMzI7IDNdOyAyXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdDJkSW50cyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgICBmbiBSZXBlYXQyZEJpbmRlcnMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdDJkQmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPiB7CisgICAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9OworICAgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElSZXBlYXRGaXhlZFNpemVBcnJheURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKKyAgICBmbiBSZXBlYXRCeXRlcygmc2VsZiwgX2FyZ19pbnB1dDogJlt1ODsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICAgIGZuIFJlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2kzMjsgM10+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkQnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW3U4OyAzXTsgMl0+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEJpbmRlcnMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4geworICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkUGFyY2VsYWJsZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IFJlcGVhdEJ5dGVzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBwdWIgY29uc3QgUmVwZWF0SW50czogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgICAgcHViIGNvbnN0IFJlcGVhdEJpbmRlcnM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICAgIHB1YiBjb25zdCBSZXBlYXRQYXJjZWxhYmxlczogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7CisgICAgcHViIGNvbnN0IFJlcGVhdDJkQnl0ZXM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OworICAgIHB1YiBjb25zdCBSZXBlYXQyZEludHM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OworICAgIHB1YiBjb25zdCBSZXBlYXQyZEJpbmRlcnM6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2OworICAgIHB1YiBjb25zdCBSZXBlYXQyZFBhcmNlbGFibGVzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKKyAgfQorICBwdWIgdHlwZSBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJUmVwZWF0Rml4ZWRTaXplQXJyYXlEZWZhdWx0Pj47CisgIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CisgIGxhenlfc3RhdGljISB7CisgICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SVJlcGVhdEZpeGVkU2l6ZUFycmF5RGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CisgIH0KKyAgaW1wbCBCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IHsKKyAgICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0Qnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTg7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFt1ODsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRCeXRlcygmc2VsZiwgX2FyZ19pbnB1dDogJlt1ODsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPiB7CisgICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXk+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFt1ODsgM10gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgICAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtpMzI7IDNdID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CisgICAgICBPayhfYWlkbF9yZXR1cm4pCisgICAgfQorICAgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8W2JpbmRlcjo6U3BJQmluZGVyOyAzXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtiaW5kZXI6OlNwSUJpbmRlcjsgM10gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgICAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPiB7CisgICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXk+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CisgICAgICBPayhfYWlkbF9yZXR1cm4pCisgICAgfQorICAgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdDJkQnl0ZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1t1ODsgM107IDJdLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFtbdTg7IDNdOyAyXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbdTg7IDNdOyAyXSA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OworICAgICAgT2soX2FpZGxfcmV0dXJuKQorICAgIH0KKyAgICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0MmRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tpMzI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2kzMjsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgICBPayhhaWRsX2RhdGEpCisgICAgfQorICAgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0MmRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tpMzI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2kzMjsgM107IDJdLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsKKyAgICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0MmRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbaTMyOyAzXTsgMl0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgICAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0+IHsKKyAgICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0MmRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OworICAgICAgT2soX2FpZGxfcmV0dXJuKQorICAgIH0KKyAgICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0MmRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdDJkUGFyY2VsYWJsZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Pjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXQyZFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgIH0KKyAgaW1wbCBJUmVwZWF0Rml4ZWRTaXplQXJyYXkgZm9yIEJwUmVwZWF0Rml4ZWRTaXplQXJyYXkgeworICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbdTg7IDNdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGVzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXRJbnRzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2kzMjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtiaW5kZXI6OlNwSUJpbmRlcjsgM10+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCaW5kZXJzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJpbmRlcnMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgfQorICAgIGZuIFJlcGVhdFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdFBhcmNlbGFibGVzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdDJkQnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0MmRCeXRlcywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0MmRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkSW50cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgfQorICAgIGZuIFJlcGVhdDJkQmluZGVycygmc2VsZiwgX2FyZ19pbnB1dDogJltbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdDJkQmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXQyZEJpbmRlcnMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0MmRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdDJkUGFyY2VsYWJsZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0MmRQYXJjZWxhYmxlcywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgIH0KKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJUmVwZWF0Rml4ZWRTaXplQXJyYXlBc3luYzxQPiBmb3IgQnBSZXBlYXRGaXhlZFNpemVBcnJheSB7CisgICAgZm4gUmVwZWF0Qnl0ZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW3U4OyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbdTg7IDNdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0SW50czwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtpMzI7IDNdPj4geworICAgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEludHMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0SW50cyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgICBmbiBSZXBlYXRCaW5kZXJzPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlNwSUJpbmRlcjsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W2JpbmRlcjo6U3BJQmluZGVyOyAzXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICAgIH07CisgICAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICAgIFA6OnNwYXduKAorICAgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCaW5kZXJzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJpbmRlcnMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0UGFyY2VsYWJsZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsYWJsZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0UGFyY2VsYWJsZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRCeXRlczwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbW3U4OyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgW1t1ODsgM107IDJdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPj4geworICAgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkQnl0ZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0MmRCeXRlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEludHM8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1tpMzI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW2kzMjsgM107IDJdKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8W1tpMzI7IDNdOyAyXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0MmRJbnRzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkSW50cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0MmRCaW5kZXJzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkQmluZGVycywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXQyZEJpbmRlcnMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICAgIH0KKyAgICAgICkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRQYXJjZWxhYmxlczwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxbW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM107IDJdPj4geworICAgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXQyZFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgICAgfTsKKyAgICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgICAgUDo6c3Bhd24oCisgICAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdDJkUGFyY2VsYWJsZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElSZXBlYXRGaXhlZFNpemVBcnJheSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuUmVwZWF0Rml4ZWRTaXplQXJyYXk+IHsKKyAgICBmbiBSZXBlYXRCeXRlcygmc2VsZiwgX2FyZ19pbnB1dDogJlt1ODsgM10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW3U4OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W3U4OyAzXT4geyBzZWxmLjAuUmVwZWF0Qnl0ZXMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICAgIGZuIFJlcGVhdEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbaTMyOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2kzMjsgM10+IHsgc2VsZi4wLlJlcGVhdEludHMoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICAgIGZuIFJlcGVhdEJpbmRlcnMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXI7IDNdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2JpbmRlcjo6U3BJQmluZGVyOyAzXT4geyBzZWxmLjAuUmVwZWF0QmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXSwgX2FyZ19yZXBlYXRlZDogJm11dCBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXSkgLT4gYmluZGVyOjpSZXN1bHQ8W2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10+IHsgc2VsZi4wLlJlcGVhdFBhcmNlbGFibGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgICBmbiBSZXBlYXQyZEJ5dGVzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1t1ODsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1t1ODsgM107IDJdPiB7IHNlbGYuMC5SZXBlYXQyZEJ5dGVzKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgICBmbiBSZXBlYXQyZEludHMoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbW2kzMjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbaTMyOyAzXTsgMl0pIC0+IGJpbmRlcjo6UmVzdWx0PFtbaTMyOyAzXTsgMl0+IHsgc2VsZi4wLlJlcGVhdDJkSW50cyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzKCZzZWxmLCBfYXJnX2lucHV0OiAmW1tiaW5kZXI6OlNwSUJpbmRlcjsgM107IDJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFtbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPjsgM107IDJdKSAtPiBiaW5kZXI6OlJlc3VsdDxbW2JpbmRlcjo6U3BJQmluZGVyOyAzXTsgMl0+IHsgc2VsZi4wLlJlcGVhdDJkQmluZGVycyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgICAgZm4gUmVwZWF0MmRQYXJjZWxhYmxlcygmc2VsZiwgX2FyZ19pbnB1dDogJltbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSkgLT4gYmluZGVyOjpSZXN1bHQ8W1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXT4geyBzZWxmLjAuUmVwZWF0MmRQYXJjZWxhYmxlcyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJUmVwZWF0Rml4ZWRTaXplQXJyYXksIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pbnB1dDogW3U4OyAzXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbdTg7IDNdID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXBlYXRCeXRlcygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0SW50cyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lucHV0OiBbaTMyOyAzXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbaTMyOyAzXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0SW50cygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0QmluZGVycyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lucHV0OiBbYmluZGVyOjpTcElCaW5kZXI7IDNdID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFtPcHRpb248YmluZGVyOjpTcElCaW5kZXI+OyAzXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0QmluZGVycygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsYWJsZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pbnB1dDogW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19yZXBlYXRlZDogW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfMTNfSW50UGFyY2VsYWJsZTsgM10gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdFBhcmNlbGFibGVzKCZfYXJnX2lucHV0LCAmbXV0IF9hcmdfcmVwZWF0ZWQpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19yZXBlYXRlZCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXQyZEJ5dGVzID0+IHsKKyAgICAgICAgbGV0IF9hcmdfaW5wdXQ6IFtbdTg7IDNdOyAyXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbW3U4OyAzXTsgMl0gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdDJkQnl0ZXMoJl9hcmdfaW5wdXQsICZtdXQgX2FyZ19yZXBlYXRlZCk7CisgICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX3JlcGVhdGVkKT87CisgICAgICAgICAgfQorICAgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9CisgICAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdDJkSW50cyA9PiB7CisgICAgICAgIGxldCBfYXJnX2lucHV0OiBbW2kzMjsgM107IDJdID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFtbaTMyOyAzXTsgMl0gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdDJkSW50cygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0MmRCaW5kZXJzID0+IHsKKyAgICAgICAgbGV0IF9hcmdfaW5wdXQ6IFtbYmluZGVyOjpTcElCaW5kZXI7IDNdOyAyXSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBbW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj47IDNdOyAyXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0MmRCaW5kZXJzKCZfYXJnX2lucHV0LCAmbXV0IF9hcmdfcmVwZWF0ZWQpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19yZXBlYXRlZCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXQyZFBhcmNlbGFibGVzID0+IHsKKyAgICAgICAgbGV0IF9hcmdfaW5wdXQ6IFtbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOyAzXTsgMl0gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19yZXBlYXRlZDogW1tjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzEzX0ludFBhcmNlbGFibGU7IDNdOyAyXSA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0MmRQYXJjZWxhYmxlcygmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgQnl0ZUVudW0geworICAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KKyAgdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKKyAgZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICAgIEJ5dGVFbnVtIDogW2k4OyAxXSB7CisgICAgICBBID0gMCwKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSW50RW51bSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgSW50RW51bSA6IFtpMzI7IDFdIHsKKyAgICAgIEEgPSAwLAorICAgIH0KKyAgfQorfQorcHViIG1vZCBMb25nRW51bSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgTG9uZ0VudW0gOiBbaTY0OyAxXSB7CisgICAgICBBID0gMCwKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSW50UGFyY2VsYWJsZSB7CisgICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgQ29weSwgUGFydGlhbEVxKV0KKyAgcHViIHN0cnVjdCBJbnRQYXJjZWxhYmxlIHsKKyAgICBwdWIgdmFsdWU6IGkzMiwKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIEludFBhcmNlbGFibGUgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgICB2YWx1ZTogMCwKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEludFBhcmNlbGFibGUgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi52YWx1ZSk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYudmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICB9CisgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEludFBhcmNlbGFibGUpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEludFBhcmNlbGFibGUpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgSW50UGFyY2VsYWJsZSB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlIiB9CisgIH0KK30KK3B1YiBtb2QgSUVtcHR5SW50ZXJmYWNlIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSUVtcHR5SW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSJdIHsKKyAgICAgIG5hdGl2ZTogQm5FbXB0eUludGVyZmFjZShvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBFbXB0eUludGVyZmFjZSB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElFbXB0eUludGVyZmFjZUFzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC5maXhlZHNpemVhcnJheS5GaXhlZFNpemVBcnJheUV4YW1wbGUuSUVtcHR5SW50ZXJmYWNlIiB9CisgICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQorICAgIH0KKyAgICBmbiBzZXREZWZhdWx0SW1wbChkOiBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmKSAtPiBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgIGltcGwgQm5FbXB0eUludGVyZmFjZSB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUVtcHR5SW50ZXJmYWNlPgorICAgIHdoZXJlCisgICAgICBUOiBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElFbXB0eUludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgIH0KKyAgcHViIG1vZCB0cmFuc2FjdGlvbnMgeworICB9CisgIHB1YiB0eXBlIElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElFbXB0eUludGVyZmFjZURlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwRW1wdHlJbnRlcmZhY2UgeworICB9CisgIGltcGwgSUVtcHR5SW50ZXJmYWNlIGZvciBCcEVtcHR5SW50ZXJmYWNlIHsKKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPiBmb3IgQnBFbXB0eUludGVyZmFjZSB7CisgIH0KKyAgaW1wbCBJRW1wdHlJbnRlcmZhY2UgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbkVtcHR5SW50ZXJmYWNlPiB7CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJRW1wdHlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGU7CisgcHViIHVzZSBzdXBlcjo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5OjpJUmVwZWF0Rml4ZWRTaXplQXJyYXkgYXMgXzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzIxX0lSZXBlYXRGaXhlZFNpemVBcnJheTsKKyBwdWIgdXNlIHN1cGVyOjpCeXRlRW51bTo6Qnl0ZUVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfMTRfZml4ZWRzaXplYXJyYXlfMjFfRml4ZWRTaXplQXJyYXlFeGFtcGxlXzhfQnl0ZUVudW07CisgcHViIHVzZSBzdXBlcjo6SW50RW51bTo6SW50RW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfN19JbnRFbnVtOworIHB1YiB1c2Ugc3VwZXI6OkxvbmdFbnVtOjpMb25nRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF8xNF9maXhlZHNpemVhcnJheV8yMV9GaXhlZFNpemVBcnJheUV4YW1wbGVfOF9Mb25nRW51bTsKKyBwdWIgdXNlIHN1cGVyOjpJbnRQYXJjZWxhYmxlOjpJbnRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xM19JbnRQYXJjZWxhYmxlOworIHB1YiB1c2Ugc3VwZXI6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzE0X2ZpeGVkc2l6ZWFycmF5XzIxX0ZpeGVkU2l6ZUFycmF5RXhhbXBsZV8xNV9JRW1wdHlJbnRlcmZhY2U7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1maXhlZHNpemVhcnJheS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2ZpeGVkc2l6ZWFycmF5L0ZpeGVkU2l6ZUFycmF5RXhhbXBsZS5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODExY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUucnMuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9maXhlZHNpemVhcnJheS9GaXhlZFNpemVBcnJheUV4YW1wbGUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWZpeGVkc2l6ZWFycmF5LXJ1c3Qtc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UvZ2VuL3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTczZjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAKQEAgLTAsMCArMSw0NTMgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgQXJyYXlPZkludGVyZmFjZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgQXJyYXlPZkludGVyZmFjZXM6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK0RPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfTkVTVEVEX0lOVEVSRkFDRShBcnJheU9mSW50ZXJmYWNlcywgRW1wdHlJbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIikKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworQXJyYXlPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6OkJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPihfYWlkbF9pbXBsKXsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKEFycmF5T2ZJbnRlcmZhY2VzLCBNeUludGVyZmFjZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiKQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6QnBNeUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJTXlJbnRlcmZhY2U+KF9haWRsX2ltcGwpeworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEFycmF5T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlOjptZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpZmFjZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgbnVsbGFibGVfaWZhY2UsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2FycmF5X2luLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9hcnJheV9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2FycmF5X2lub3V0LCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2FycmF5X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKGlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9hcnJheV9pbik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlVmVjdG9yU2l6ZSgqaWZhY2VfYXJyYXlfb3V0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoKmlmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IobnVsbGFibGVfaWZhY2VfYXJyYXlfaW4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVZlY3RvclNpemUoKm51bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKCpudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQXJyYXlPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5X2luLCBpZmFjZV9hcnJheV9vdXQsIGlmYWNlX2FycmF5X2lub3V0LCBudWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9hcnJheV9vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9hcnJheV9pbm91dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworCitBcnJheU9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Qm5NeUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCbk15SW50ZXJmYWNlOjpUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlczoKKyAgeworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gaW5faWZhY2U7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IGluX2lmYWNlX2FycmF5X2luOworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gb3V0X2lmYWNlX2FycmF5X291dDsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IGluX2lmYWNlX2FycmF5X2lub3V0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbjsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlcigmaW5faWZhY2UpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoJmluX251bGxhYmxlX2lmYWNlKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5faWZhY2VfYXJyYXlfaW4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZXNpemVPdXRWZWN0b3IoJm91dF9pZmFjZV9hcnJheV9vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX251bGxhYmxlX2lmYWNlX2FycmF5X2luKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVzaXplT3V0VmVjdG9yKCZvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhtZXRob2RXaXRoSW50ZXJmYWNlcyhpbl9pZmFjZSwgaW5fbnVsbGFibGVfaWZhY2UsIGluX2lmYWNlX2FycmF5X2luLCAmb3V0X2lmYWNlX2FycmF5X291dCwgJmluX2lmYWNlX2FycmF5X2lub3V0LCBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgJm91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsICZpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihvdXRfaWZhY2VfYXJyYXlfb3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3Rvcihpbl9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Iob3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoJmlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZudWxsYWJsZV9pZmFjZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmlmYWNlX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmbnVsbGFibGVfaWZhY2VfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaWZhY2VfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IobnVsbGFibGVfaWZhY2VfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgIGNhc2UgaWZhY2U6IHsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxpZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PikgeworICAgICAgc2V0PG51bGxhYmxlX2lmYWNlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBpZmFjZV9hcnJheTogeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PikgeworICAgICAgc2V0PGlmYWNlX2FycmF5PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGlmYWNlX2FycmF5PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIH0KKyAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihnZXRUYWcoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgaWZhY2U6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGdldDxpZmFjZT4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGdldDxudWxsYWJsZV9pZmFjZT4oKSk7CisgIGNhc2UgaWZhY2VfYXJyYXk6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGdldDxpZmFjZV9hcnJheT4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGdldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWFjYTdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCmluZGV4IGJhNGIxNWIuLjY3MTQyYjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCkBAIC0xLDIyICsxLDIyIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiA6OmFuZHJvaWQ6OnN0YXR1c190IERlcHJlY2F0ZWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7Ci0gIFtbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCk7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgMCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IERlcHJlY2F0ZWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKICAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwpAQCAtMjcsOSArMjcsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZmNhMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAKQEAgLTAsMCArMSwyODMgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRml4ZWRTaXplOjpGaXhlZFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRCb29sKCZib29sZWFuVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQnl0ZSgmYnl0ZVZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZENoYXIoJmNoYXJWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmaW50VmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50NjQoJmxvbmdWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGbG9hdCgmZmxvYXRWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWREb3VibGUoJmRvdWJsZVZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDY0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCAqPigmZW51bVZhbHVlKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZwYXJjZWxhYmxlVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZTo6Rml4ZWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlQm9vbChib29sZWFuVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVCeXRlKGJ5dGVWYWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUNoYXIoY2hhclZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoaW50VmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQ2NChsb25nVmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVGbG9hdChmbG9hdFZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlRG91YmxlKGRvdWJsZVZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oZW51bVZhbHVlKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUocGFyY2VsYWJsZVZhbHVlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgIGNhc2UgYm9vbGVhblZhbHVlOiB7CisgICAgYm9vbCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRCb29sKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxib29sPikgeworICAgICAgc2V0PGJvb2xlYW5WYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxib29sZWFuVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGJ5dGVWYWx1ZTogeworICAgIGludDhfdCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRCeXRlKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQ4X3Q+KSB7CisgICAgICBzZXQ8Ynl0ZVZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGJ5dGVWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgY2hhclZhbHVlOiB7CisgICAgY2hhcjE2X3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQ2hhcigmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8Y2hhcjE2X3Q+KSB7CisgICAgICBzZXQ8Y2hhclZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGNoYXJWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgaW50VmFsdWU6IHsKKyAgICBpbnQzMl90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQzMl90PikgeworICAgICAgc2V0PGludFZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGludFZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBsb25nVmFsdWU6IHsKKyAgICBpbnQ2NF90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDY0KCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQ2NF90PikgeworICAgICAgc2V0PGxvbmdWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxsb25nVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGZsb2F0VmFsdWU6IHsKKyAgICBmbG9hdCBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRGbG9hdCgmX2FpZGxfdmFsdWUpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8ZmxvYXQ+KSB7CisgICAgICBzZXQ8ZmxvYXRWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxmbG9hdFZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBkb3VibGVWYWx1ZTogeworICAgIGRvdWJsZSBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWREb3VibGUoJl9haWRsX3ZhbHVlKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGRvdWJsZT4pIHsKKyAgICAgIHNldDxkb3VibGVWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxkb3VibGVWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIGNhc2UgZW51bVZhbHVlOiB7CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50NjQocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90ICo+KCZfYWlkbF92YWx1ZSkpKSAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KSB7CisgICAgICBzZXQ8ZW51bVZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGVudW1WYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiA6OmFuZHJvaWQ6Ok9LOyB9CisgIH0KKyAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBGaXhlZFNpemU6OkZpeGVkVW5pb246OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0VGFnKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGJvb2xlYW5WYWx1ZTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVCb29sKGdldDxib29sZWFuVmFsdWU+KCkpOworICBjYXNlIGJ5dGVWYWx1ZTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVCeXRlKGdldDxieXRlVmFsdWU+KCkpOworICBjYXNlIGNoYXJWYWx1ZTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVDaGFyKGdldDxjaGFyVmFsdWU+KCkpOworICBjYXNlIGludFZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGdldDxpbnRWYWx1ZT4oKSk7CisgIGNhc2UgbG9uZ1ZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZUludDY0KGdldDxsb25nVmFsdWU+KCkpOworICBjYXNlIGZsb2F0VmFsdWU6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlRmxvYXQoZ2V0PGZsb2F0VmFsdWU+KCkpOworICBjYXNlIGRvdWJsZVZhbHVlOiByZXR1cm4gX2FpZGxfcGFyY2VsLT53cml0ZURvdWJsZShnZXQ8ZG91YmxlVmFsdWU+KCkpOworICBjYXNlIGVudW1WYWx1ZTogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihnZXQ8ZW51bVZhbHVlPigpKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjQwNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcAppbmRleCA0YWRiNGU3Li44YmUwOWMyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcApAQCAtMSwxOCArMSwxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIERPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERlcHJlY2F0ZWQsICJhbmRyb2lkLmFpZGwudGVzdHMuSURlcHJlY2F0ZWQiKQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oPgpAQCAtMjAsOSArMTMsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJwRGVwcmVjYXRlZDo6QnBEZXByZWNhdGVkKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKQEAgLTMwLDE4ICsyMSwxNCBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJuRGVwcmVjYXRlZDo6Qm5EZXByZWNhdGVkKCkKQEAgLTYyLDcgKzQ5LDcgQEAKICAgYnJlYWs7CiAgIH0KICAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKLSAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOwogICB9CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQpAQCAtNzAsNyArNTcsNSBAQAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKaW5kZXggYTFiYjY1MS4uMWJjMDVkZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKQEAgLTEsMTggKzEsMTEgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShOYW1lZENhbGxiYWNrLCAiYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIikKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaD4KQEAgLTIwLDkgKzEzLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewogCiBCcE5hbWVkQ2FsbGJhY2s6OkJwTmFtZWRDYWxsYmFjayhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCkBAIC02MywxOCArNTQsMTQgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewogCiBCbk5hbWVkQ2FsbGJhY2s6OkJuTmFtZWRDYWxsYmFjaygpCkBAIC0xMTMsMTMgKzEwMCwxMSBAQAogICBicmVhazsKICAgfQogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgewotICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CiAgIH0KICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcAppbmRleCA3ZGNjNDRmLi5iMzA4ODU2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcApAQCAtMSwxOCArMSwxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIERPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE5ld05hbWUsICJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiKQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oPgpAQCAtMjAsOSArMTMsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJwTmV3TmFtZTo6QnBOZXdOYW1lKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKQEAgLTYzLDE4ICs1NCwxNCBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJuTmV3TmFtZTo6Qm5OZXdOYW1lKCkKQEAgLTExMywxMyArMTAwLDExIEBACiAgIGJyZWFrOwogICB9CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgfQogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwCmluZGV4IDI5ODg0MDcuLmVlMDRhNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwCkBAIC0xLDE4ICsxLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoT2xkTmFtZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSIpCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmg+CkBAIC0yMCw5ICsxMyw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQnBPbGROYW1lOjpCcE9sZE5hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQpAQCAtNjMsMTggKzU0LDE0IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQm5PbGROYW1lOjpCbk9sZE5hbWUoKQpAQCAtMTEzLDEzICsxMDAsMTEgQEAKICAgYnJlYWs7CiAgIH0KICAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKLSAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOwogICB9CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcAppbmRleCBmM2NkMTk4Li40MDI2NGMwIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwCkBAIC0xLDMzICsxLDIzIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShUZXN0U2VydmljZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UiKQotCiBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBJVGVzdFNlcnZpY2U6OlNUUklOR19URVNUX0NPTlNUQU5UKCkgewogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiB2YWx1ZSg6OmFuZHJvaWQ6OlN0cmluZzE2KCJmb28iKSk7CiAgIHJldHVybiB2YWx1ZTsKIH0KLQogY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgSVRlc3RTZXJ2aWNlOjpTVFJJTkdfVEVTVF9DT05TVEFOVDIoKSB7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2IHZhbHVlKDo6YW5kcm9pZDo6U3RyaW5nMTYoImJhciIpKTsKICAgcmV0dXJuIHZhbHVlOwogfQotCiBjb25zdCA6OnN0ZDo6c3RyaW5nJiBJVGVzdFNlcnZpY2U6OlNUUklOR19URVNUX0NPTlNUQU5UX1VURjgoKSB7CiAgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIHZhbHVlKCJiYXoiKTsKICAgcmV0dXJuIHZhbHVlOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmg+CkBAIC0zNSw5ICsyNSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKIAogQnBUZXN0U2VydmljZTo6QnBUZXN0U2VydmljZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCkBAIC0xMTA4LDcgKzEwOTYsNyBAQAogICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgZ290byBfYWlkbF9lcnJvcjsKICAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlcig6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazo6YXNCaW5kZXIoc2VydmljZSkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzZXJ2aWNlKTsKICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgIGdvdG8gX2FpZGxfZXJyb3I7CiAgIH0KQEAgLTExMzksNiArMTEyNywyNDYgQEAKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KIAorOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXRJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3RyaW5nMTZWZWN0b3IobmFtZXMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX0dldEludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5HZXRJbnRlcmZhY2VBcnJheShuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKHNlcnZpY2VzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJpbmcxNlZlY3RvcihuYW1lcyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KHNlcnZpY2VzLCBuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEJvb2woX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJpbmcxNlZlY3RvcihuYW1lcyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Ioc2VydmljZXMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cmluZzE2VmVjdG9yKG5hbWVzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KHNlcnZpY2VzLCBuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEJvb2woX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJpbmcxNlZlY3RvcihuYW1lcyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlTGlzdCwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+R2V0SW50ZXJmYWNlTGlzdChuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Ioc2VydmljZXMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cmluZzE2VmVjdG9yKG5hbWVzKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KHNlcnZpY2VzLCBuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZEJvb2woX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKwogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgewogICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOwogICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKQEAgLTE1MjcsNyArMTc1NSw3IEBACiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9CiAKLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pIHsKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSB7CiAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CiAgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOwogICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOwpAQCAtMTU2NSw2ICsxNzkzLDgyIEBACiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9CiAKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVQYXJjZWxhYmxlVmVjdG9yKGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRQYXJjZWxhYmxlVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGVWZWN0b3IoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRQYXJjZWxhYmxlVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6VGFrZXNBbklCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBpbnB1dCkgewogICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOwogICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKQEAgLTE2MzMsNiArMTkzNyw3NCBAQAogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQogCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlRha2VzQW5JQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0KSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdCwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VGFrZXNBbklCaW5kZXJMaXN0KGlucHV0KTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4mIGlucHV0KSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoaW5wdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB0b2tlbiwgOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CiAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CiAgIF9haWRsX2RhdGEubWFya1NlbnNpdGl2ZSgpOwpAQCAtMTkxOSw2ICsyMjkxLDE3NCBAQAogICByZXR1cm4gX2FpZGxfc3RhdHVzOwogfQogCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGVwLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBlcDIpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGUoZXApOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShlcCwgZXAyKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFBhcmNlbGFibGUoZXAyKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlTGlzdChjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBsaXN0LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGUobGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmV2ZXJzZUxpc3QsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX0NMRUFSX0JVRik7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJldmVyc2VMaXN0KGxpc3QsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRQYXJjZWxhYmxlKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBUZXN0U2VydmljZTo6UmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVWZWN0b3JTaXplKCpyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheSwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCA6OmFuZHJvaWQ6OklCaW5kZXI6OkZMQUdfQ0xFQVJfQlVGKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmV2ZXJzZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IocmVwZWF0ZWQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIF9haWRsX3JldHVybikgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGlucHV0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVWZWN0b3JTaXplKCpyZXBlYXRlZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDo6YW5kcm9pZDo6SUJpbmRlcjo6RkxBR19DTEVBUl9CVUYpOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKHJlcGVhdGVkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKwogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXRPbGROYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pIHsKICAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKICAgX2FpZGxfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CkBAIC0yMDU2LDE4ICsyNTk2LDE0IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7CiAKIEJuVGVzdFNlcnZpY2U6OkJuVGVzdFNlcnZpY2UoKQpAQCAtMjA5Myw2ICsyNjI5LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFVuaW1wbGVtZW50ZWRNZXRob2QoaW5fYXJnLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMTQ0LDYgKzI2ODQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0Qm9vbGVhbihpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjE3MCw2ICsyNzE0LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEJ5dGUoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTIxOTYsNiArMjc0NCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRDaGFyKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMjIyLDYgKzI3NzQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0SW50KGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMjQ4LDYgKzI4MDQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TG9uZyhpbl90b2tlbiwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjI3NCw2ICsyODM0LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEZsb2F0KGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMzAwLDYgKzI4NjQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0RG91YmxlKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMzI2LDYgKzI4OTQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0U3RyaW5nKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yMzUyLDYgKzI5MjQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0Qnl0ZUVudW0oaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTIzNzgsNiArMjk1NCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRJbnRFbnVtKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNDA0LDYgKzI5ODQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TG9uZ0VudW0oaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI0MzUsNiArMzAxOSwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlQm9vbGVhbihpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjQ3MCw2ICszMDU4LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VCeXRlKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNTA1LDYgKzMwOTcsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUNoYXIoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI1NDAsNiArMzEzNiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlSW50KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNTc1LDYgKzMxNzUsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUxvbmcoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI2MTAsNiArMzIxNCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlRmxvYXQoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI2NDUsNiArMzI1MywxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlRG91YmxlKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNjgwLDYgKzMyOTIsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZVN0cmluZyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjcxNSw2ICszMzMxLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VCeXRlRW51bShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjc1MCw2ICszMzcwLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VJbnRFbnVtKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yNzg1LDYgKzM0MDksMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZUxvbmdFbnVtKGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yODE1LDYgKzM0NDMsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoR2V0T3RoZXJUZXN0U2VydmljZShpbl9uYW1lLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yODIzLDcgKzM0NTUsNyBAQAogICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgewogICAgICAgYnJlYWs7CiAgICAgfQotICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s6OmFzQmluZGVyKF9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoX2FpZGxfcmV0dXJuKTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0yODQ2LDYgKzM0NzgsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVmVyaWZ5TmFtZShpbl9zZXJ2aWNlLCBpbl9uYW1lLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yODYwLDYgKzM0OTYsMjAxIEBACiAgICAgfQogICB9CiAgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX0dldEludGVyZmFjZUFycmF5OgorICB7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBpbl9uYW1lczsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJpbmcxNlZlY3RvcigmaW5fbmFtZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhHZXRJbnRlcmZhY2VBcnJheShpbl9uYW1lcywgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXk6CisgIHsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiBpbl9zZXJ2aWNlczsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IGluX25hbWVzOworICAgIGJvb2wgX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9zZXJ2aWNlcyk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJpbmcxNlZlY3RvcigmaW5fbmFtZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShpbl9zZXJ2aWNlcywgaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlQm9vbChfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4gaW5fbmFtZXM7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJpbmcxNlZlY3RvcigmaW5fbmFtZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiBpbl9zZXJ2aWNlczsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiBpbl9uYW1lczsKKyAgICBib29sIF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5fc2VydmljZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3RyaW5nMTZWZWN0b3IoJmluX25hbWVzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShpbl9zZXJ2aWNlcywgaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlQm9vbChfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4gaW5fbmFtZXM7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJpbmcxNlZlY3RvcigmaW5fbmFtZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhHZXRJbnRlcmZhY2VMaXN0KGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiBpbl9zZXJ2aWNlczsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiBpbl9uYW1lczsKKyAgICBib29sIF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5fc2VydmljZXMpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3RyaW5nMTZWZWN0b3IoJmluX25hbWVzKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChpbl9zZXJ2aWNlcywgaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlQm9vbChfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKICAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nTGlzdDoKICAgewogICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gaW5faW5wdXQ7CkBAIC0yODczLDYgKzM3MDQsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZVN0cmluZ0xpc3QoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI5MDMsNiArMzczOCwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihpbl9yZWFkLCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0yOTM0LDYgKzM3NzMsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTI5NjMsNiArMzgwNiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW5fY29kZSkpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMjk4NSw2ICszODMyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdE51bGxhYmxlSW50QXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMwMTEsNiArMzg2MiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMwMzcsNiArMzg5MiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzA2Myw2ICszOTIyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzA4OSw2ICszOTUyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdE51bGxhYmxlU3RyaW5nKGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMTE1LDYgKzM5ODIsMTAgQEAKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CiAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zMTMxLDggKzQwMDIsOCBAQAogICBicmVhazsKICAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGU6CiAgIHsKLSAgICA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+IGluX2lucHV0OwotICAgIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4gX2FpZGxfcmV0dXJuOworICAgIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBpbl9pbnB1dDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gX2FpZGxfcmV0dXJuOwogICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKICAgICAgIGJyZWFrOwpAQCAtMzE0MSw2ICs0MDEyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShpbl9pbnB1dCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzE1NSw2ICs0MDMwLDY2IEBACiAgICAgfQogICB9CiAgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gaW5faW5wdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3Q6CisgIHsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiBpbl9pbnB1dDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZpbl9pbnB1dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlUGFyY2VsYWJsZVZlY3RvcihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKICAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlcjoKICAgewogICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiBpbl9pbnB1dDsKQEAgLTMxNjYsNiArNDEwMSwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhUYWtlc0FuSUJpbmRlcihpbl9pbnB1dCkpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzE4Nyw2ICs0MTI2LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFRha2VzQU51bGxhYmxlSUJpbmRlcihpbl9pbnB1dCkpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzE5Nyw2ICs0MTQwLDU2IEBACiAgICAgfQogICB9CiAgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdDoKKyAgeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBpbl9pbnB1dDsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5faW5wdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhUYWtlc0FuSUJpbmRlckxpc3QoaW5faW5wdXQpKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0OgorICB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4gaW5faW5wdXQ7CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbl9pbnB1dCkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOwogICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdFV0ZjhDcHBTdHJpbmc6CiAgIHsKICAgICA6OnN0ZDo6c3RyaW5nIGluX3Rva2VuOwpAQCAtMzIwOSw2ICs0MjAyLDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdFV0ZjhDcHBTdHJpbmcoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMyMzUsNiArNDIzMiwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMyNjYsNiArNDI2NywxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlVXRmOENwcFN0cmluZyhpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzMwMSw2ICs0MzA2LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMzMzIsNiArNDM0MSwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKICAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKQEAgLTMzNjIsNiArNDM3NSwxMCBAQAogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhHZXRDYWxsYmFjayhpbl9yZXR1cm5fbnVsbCwgJl9haWRsX3JldHVybikpOwogICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewpAQCAtMzM3MCw3ICs0Mzg3LDcgQEAKICAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjphc0JpbmRlcihfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKF9haWRsX3JldHVybik7CiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzM4Nyw2ICs0NDA0LDEwIEBACiAgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgmaW5fcGFyY2VsKSk7CiAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CkBAIC0zNDAxLDYgKzQ0MjIsMTQ0IEBACiAgICAgfQogICB9CiAgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlOgorICB7CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSBpbl9lcDsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlIG91dF9lcDI7CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRQYXJjZWxhYmxlKCZpbl9lcCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGluX2VwLCAmb3V0X2VwMikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVQYXJjZWxhYmxlKG91dF9lcDIpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBCblRlc3RTZXJ2aWNlOjpUUkFOU0FDVElPTl9SZXZlcnNlTGlzdDoKKyAgeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QgaW5fbGlzdDsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0IF9haWRsX3JldHVybjsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFBhcmNlbGFibGUoJmluX2xpc3QpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlTGlzdChpbl9saXN0LCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVBhcmNlbGFibGUoX2FpZGxfcmV0dXJuKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheToKKyAgeworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBpbl9pbnB1dDsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4gb3V0X3JlcGVhdGVkOworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVzaXplT3V0VmVjdG9yKCZvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlSUJpbmRlckFycmF5KGluX2lucHV0LCAmb3V0X3JlcGVhdGVkLCAmX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKG91dF9yZXBlYXRlZCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuVGVzdFNlcnZpY2U6OlRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheToKKyAgeworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+IGluX2lucHV0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+IG91dF9yZXBlYXRlZDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiBfYWlkbF9yZXR1cm47CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX2lucHV0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVzaXplT3V0VmVjdG9yKCZvdXRfcmVwZWF0ZWQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Iob3V0X3JlcGVhdGVkKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CiAgIGNhc2UgQm5UZXN0U2VydmljZTo6VFJBTlNBQ1RJT05fR2V0T2xkTmFtZUludGVyZmFjZToKICAgewogICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+IF9haWRsX3JldHVybjsKQEAgLTM0MTYsNyArNDU3NSw3IEBACiAgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcig6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZTo6YXNCaW5kZXIoX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihfYWlkbF9yZXR1cm4pOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTM0MzcsNyArNDU5Niw3IEBACiAgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcig6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZTo6YXNCaW5kZXIoX2FpZGxfcmV0dXJuKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihfYWlkbF9yZXR1cm4pOwogICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTM0OTIsNyArNDY1MSw3IEBACiAgIGJyZWFrOwogICB9CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7Ci0gICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKICAgfQogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KQEAgLTM1MDAsNyArNDY1OSwyODUgQEAKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgSVRlc3RTZXJ2aWNlOjpFbXB0eTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBJVGVzdFNlcnZpY2U6OkVtcHR5Ojp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IElUZXN0U2VydmljZTo6Q29tcGlsZXJDaGVja3M6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoJmJpbmRlcik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmbnVsbGFibGVfYmluZGVyKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmYmluZGVyX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmbnVsbGFibGVfYmluZGVyX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmYmluZGVyX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZwZmQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmbnVsbGFibGVfcGZkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJnBmZF9hcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZudWxsYWJsZV9wZmRfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmcGZkX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmbnVsbGFibGVfcGZkX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmcGFyY2VsKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGUoJm51bGxhYmxlX3BhcmNlbCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZwYXJjZWxfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmbnVsbGFibGVfcGFyY2VsX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJnBhcmNlbF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBJVGVzdFNlcnZpY2U6OkNvbXBpbGVyQ2hlY2tzOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGJpbmRlcik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihudWxsYWJsZV9iaW5kZXIpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoYmluZGVyX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihiaW5kZXJfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUocGZkKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlTnVsbGFibGVQYXJjZWxhYmxlKG51bGxhYmxlX3BmZCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IocGZkX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wZmRfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKHBmZF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wZmRfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUocGFyY2VsKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlTnVsbGFibGVQYXJjZWxhYmxlKG51bGxhYmxlX3BhcmNlbCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IocGFyY2VsX2FycmF5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wYXJjZWxfYXJyYXkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKHBhcmNlbF9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCmluZGV4IGE4OGQ3YjMuLmY4MjA4MWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCkBAIC03LDQgKzcsOCBAQAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwZTQzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworOjphbmRyb2lkOjpzdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IExpc3RPZkludGVyZmFjZXM6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitET19OT1RfRElSRUNUTFlfVVNFX01FX0lNUExFTUVOVF9NRVRBX05FU1RFRF9JTlRFUkZBQ0UoTGlzdE9mSW50ZXJmYWNlcywgRW1wdHlJbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiKQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTGlzdE9mSW50ZXJmYWNlczo6QnBFbXB0eUludGVyZmFjZTo6QnBFbXB0eUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+KF9haWRsX2ltcGwpeworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTGlzdE9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpCbkVtcHR5SW50ZXJmYWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBkZWZhdWx0OgorICB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkJpbmRlcjo6b25UcmFuc2FjdChfYWlkbF9jb2RlLCBfYWlkbF9kYXRhLCBfYWlkbF9yZXBseSwgX2FpZGxfZmxhZ3MpOworICB9CisgIGJyZWFrOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMKSB7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OkVYX05VTExfUE9JTlRFUikud3JpdGVPdmVyUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKExpc3RPZkludGVyZmFjZXMsIE15SW50ZXJmYWNlLCAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIikKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK0xpc3RPZkludGVyZmFjZXM6OkJwTXlJbnRlcmZhY2U6OkJwTXlJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SU15SW50ZXJmYWNlPihfYWlkbF9pbXBsKXsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMaXN0T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlOjptZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGlmYWNlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIG51bGxhYmxlX2lmYWNlLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2xpc3RfaW4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9pbm91dCwgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2xpc3RfaW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKGlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIobnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9saXN0X2luKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoKmlmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihudWxsYWJsZV9pZmFjZV9saXN0X2luKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoKm51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExpc3RPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3RfaW4sIGlmYWNlX2xpc3Rfb3V0LCBpZmFjZV9saXN0X2lub3V0LCBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihpZmFjZV9saXN0X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKGlmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZFN0cm9uZ0JpbmRlclZlY3RvcihudWxsYWJsZV9pZmFjZV9saXN0X291dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKworTGlzdE9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Qm5NeUludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuTXlJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzOgorICB7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGluX2lmYWNlOworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaW5faWZhY2VfbGlzdF9pbjsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gb3V0X2lmYWNlX2xpc3Rfb3V0OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpbl9pZmFjZV9saXN0X2lub3V0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW47CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyKCZpbl9pZmFjZSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmaW5fbnVsbGFibGVfaWZhY2UpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9pZmFjZV9saXN0X2luKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmaW5faWZhY2VfbGlzdF9pbm91dCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXJWZWN0b3IoJmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4pOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMobWV0aG9kV2l0aEludGVyZmFjZXMoaW5faWZhY2UsIGluX251bGxhYmxlX2lmYWNlLCBpbl9pZmFjZV9saXN0X2luLCAmb3V0X2lmYWNlX2xpc3Rfb3V0LCAmaW5faWZhY2VfbGlzdF9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgJm91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dCwgJmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsICZfYWlkbF9yZXR1cm4pKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3Iob3V0X2lmYWNlX2xpc3Rfb3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3Rvcihpbl9pZmFjZV9saXN0X2lub3V0KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3JlcGx5LT53cml0ZVN0cm9uZ0JpbmRlclZlY3RvcihvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcmVwbHktPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCZpZmFjZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmbnVsbGFibGVfaWZhY2UpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZpZmFjZV9saXN0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlclZlY3RvcigmbnVsbGFibGVfaWZhY2VfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGlmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKG51bGxhYmxlX2lmYWNlKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGlmYWNlX2xpc3QpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IobnVsbGFibGVfaWZhY2VfbGlzdCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfdGFnKSkgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgIGNhc2UgaWZhY2U6IHsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KSB7CisgICAgICBzZXQ8aWZhY2U+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8aWZhY2U+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIG51bGxhYmxlX2lmYWNlOiB7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KSB7CisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2U+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8bnVsbGFibGVfaWZhY2U+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICBjYXNlIGlmYWNlX2xpc3Q6IHsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KSB7CisgICAgICBzZXQ8aWZhY2VfbGlzdD4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZV9saXN0PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6T0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiB7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyVmVjdG9yKCZfYWlkbF92YWx1ZSkpICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9saXN0PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2xpc3Q+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gOjphbmRyb2lkOjpPSzsgfQorICB9CisgIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihnZXRUYWcoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgaWZhY2U6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGdldDxpZmFjZT4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGdldDxudWxsYWJsZV9pZmFjZT4oKSk7CisgIGNhc2UgaWZhY2VfbGlzdDogcmV0dXJuIF9haWRsX3BhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXJWZWN0b3IoZ2V0PGlmYWNlX2xpc3Q+KCkpOworICBjYXNlIG51bGxhYmxlX2lmYWNlX2xpc3Q6IHJldHVybiBfYWlkbF9wYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyVmVjdG9yKGdldDxudWxsYWJsZV9pZmFjZV9saXN0PigpKTsKKyAgfQorICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOworfQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDc5ZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCmluZGV4IGQ2YTdkNjQuLmE0N2ExYjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCkBAIC0xLDE3ICsxLDE4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiA6OmFuZHJvaWQ6OnN0YXR1c190IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7Ci0gIFtbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCk7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgMCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CiAgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewogICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CkBAIC0yNCw3ICsyNSw2IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKICAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwpAQCAtMzksOSArMzksNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCmluZGV4IDdiNDA5MTAuLmJkM2JkYzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKQEAgLTEsMTcgKzEsMTggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFBhcmNlbGFibGVGb3JUb1N0cmluZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKICAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwpAQCAtMjAwLDcgKzIwMSw2IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFBhcmNlbGFibGVGb3JUb1N0cmluZzo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CiAgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKQEAgLTMwMyw5ICszMDMsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZAppbmRleCA5OTVlNTVhLi40MDQzZmQxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZApAQCAtNCw0ICs0LDcgQEAKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQwY2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcApAQCAtMCwwICsxLDU2IEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgUmVjdXJzaXZlTGlzdDo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZuZXh0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBSZWN1cnNpdmVMaXN0Ojp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIodmFsdWUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVOdWxsYWJsZVBhcmNlbGFibGUobmV4dCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkMWZmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcAppbmRleCBjYzBmMmYxLi43M2Q4ZWZmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcApAQCAtMSwxNyArMSwxOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKICAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwpAQCAtMjgxLDYgKzI4MiwyMiBAQAogICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZFBhcmNlbGFibGUoJmVtcHR5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEJ5dGVWZWN0b3IoJmludDhfMSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CiAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmaW50MzJfMSk7CiAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKQEAgLTQ0MCw3ICs0NTcsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogOjphbmRyb2lkOjpzdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CiAgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKQEAgLTU3Nyw2ICs1OTMsMTQgQEAKICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgewogICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZShlbXB0eSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUJ5dGVWZWN0b3IoaW50OF8xKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CiAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzJWZWN0b3IoaW50MzJfMSk7CiAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKICAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKQEAgLTY2Myw5ICs2ODcsMzggQEAKICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpFbXB0eTo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6RW1wdHk6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcAppbmRleCAwNmEzZjM3Li4zNmI4NjcwIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcApAQCAtMSwxNiArMSwxMiBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pb246OlMxKCkgewogICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyB2YWx1ZSgiYSBzdHJpbmcgY29uc3RhbnQgaW4gdW5pb24iKTsKICAgcmV0dXJuIHZhbHVlOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7CkBAIC04OSw3ICs4NSw2IEBACiAgIH0KICAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGdldFRhZygpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CkBAIC0xMDQsOSArOTksNiBAQAogICB9CiAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcAppbmRleCA1ZmIyZGRmLi4xMDA2NTI3IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcApAQCAtMSwxMSArMSw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uV2l0aEZkOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7CkBAIC0zNCw3ICszMSw2IEBACiAgIH0KICAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uV2l0aEZkOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGdldFRhZygpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CkBAIC00NCw5ICs0MCw2IEBACiAgIH0KICAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzNWIwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcApAQCAtMCwwICsxLDk0IEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IEV4dGVuZGFibGVQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmYik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZleHQpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50NjQoJmMpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmZXh0Mik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRXh0ZW5kYWJsZVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihhKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYoYik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoZXh0KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50NjQoYyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoZXh0Mik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2U5MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRhNmVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTXlFeHQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmYSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBNeUV4dDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlMzRkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1YzU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAKQEAgLTAsMCArMSw3MCBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTXlFeHQyOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmYik7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZjKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBNeUV4dDI6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihhKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlUGFyY2VsYWJsZShiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYoYyk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ZTE2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczYmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAKQEAgLTAsMCArMSw1OCBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgTXlFeHRMaWtlOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJmEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmIpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IE15RXh0TGlrZTo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKGEpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVTdHJpbmcxNihiKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgxMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQzODhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcApAQCAtMCwwICsxLDE4MiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IERlZXBseU5lc3RlZDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworOjphbmRyb2lkOjpzdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRCeXRlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90ICo+KCZlKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpBOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KGUpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorOjphbmRyb2lkOjpzdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgYXV0byBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9Cis6OmFuZHJvaWQ6OnN0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6Qzo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworOjphbmRyb2lkOjpzdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpEOjp3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgYXV0byBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoMCk7CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg0MTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3NTkwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDM2MiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwTmVzdGVkU2VydmljZS5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTmVzdGVkU2VydmljZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UiKQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5OZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworCitCcE5lc3RlZFNlcnZpY2U6OkJwTmVzdGVkU2VydmljZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJTmVzdGVkU2VydmljZT4oX2FpZGxfaW1wbCl7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBOZXN0ZWRTZXJ2aWNlOjpmbGlwU3RhdHVzKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHAsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZVBhcmNlbGFibGUocCk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5OZXN0ZWRTZXJ2aWNlOjpUUkFOU0FDVElPTl9mbGlwU3RhdHVzLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJTmVzdGVkU2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+ZmxpcFN0YXR1cyhwLCBfYWlkbF9yZXR1cm4pOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkUGFyY2VsYWJsZShfYWlkbF9yZXR1cm4pOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwTmVzdGVkU2VydmljZTo6ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGNiKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PihzdGF0dXMpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2IpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuTmVzdGVkU2VydmljZTo6VFJBTlNBQ1RJT05fZmxpcFN0YXR1c1dpdGhDYWxsYmFjaywgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElOZXN0ZWRTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soc3RhdHVzLCBjYik7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKKworQm5OZXN0ZWRTZXJ2aWNlOjpCbk5lc3RlZFNlcnZpY2UoKQoreworICA6OmFuZHJvaWQ6OmludGVybmFsOjpTdGFiaWxpdHk6Om1hcmtDb21waWxhdGlvblVuaXQodGhpcyk7Cit9CisKKzo6YW5kcm9pZDo6c3RhdHVzX3QgQm5OZXN0ZWRTZXJ2aWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuTmVzdGVkU2VydmljZTo6VFJBTlNBQ1RJT05fZmxpcFN0YXR1czoKKyAgeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQgaW5fcDsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQgX2FpZGxfcmV0dXJuOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkUGFyY2VsYWJsZSgmaW5fcCk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKGZsaXBTdGF0dXMoaW5fcCwgJl9haWRsX3JldHVybikpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9yZXBseS0+d3JpdGVQYXJjZWxhYmxlKF9haWRsX3JldHVybik7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuTmVzdGVkU2VydmljZTo6VFJBTlNBQ1RJT05fZmxpcFN0YXR1c1dpdGhDYWxsYmFjazoKKyAgeworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXM7CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+IGluX2NiOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmaW5fc3RhdHVzKSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWRTdHJvbmdCaW5kZXIoJmluX2NiKTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhpbl9zdGF0dXMsIGluX2NiKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworOjphbmRyb2lkOjpzdGF0dXNfdCBJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIGF1dG8gX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgX2FpZGxfcGFyY2VsLT53cml0ZUludDMyKDApOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT53cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PihzdGF0dXMpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGF1dG8gX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9ORVNURURfSU5URVJGQUNFKElOZXN0ZWRTZXJ2aWNlLCBDYWxsYmFjaywgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIikKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CisKK0lOZXN0ZWRTZXJ2aWNlOjpCcENhbGxiYWNrOjpCcENhbGxiYWNrKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKKyAgICA6IEJwSW50ZXJmYWNlPElDYWxsYmFjaz4oX2FpZGxfaW1wbCl7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgSU5lc3RlZFNlcnZpY2U6OkJwQ2FsbGJhY2s6OmRvbmUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cykgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4oc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSU5lc3RlZFNlcnZpY2U6OkJuQ2FsbGJhY2s6OlRSQU5TQUNUSU9OX2RvbmUsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJQ2FsbGJhY2s6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJQ2FsbGJhY2s6OmdldERlZmF1bHRJbXBsKCktPmRvbmUoc3RhdHVzKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YWJpbGl0eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CisKK0lOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrOjpCbkNhbGxiYWNrKCkKK3sKKyAgOjphbmRyb2lkOjppbnRlcm5hbDo6U3RhYmlsaXR5OjptYXJrQ29tcGlsYXRpb25Vbml0KHRoaXMpOworfQorCis6OmFuZHJvaWQ6OnN0YXR1c190IElOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrOjpvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICBjYXNlIEJuQ2FsbGJhY2s6OlRSQU5TQUNUSU9OX2RvbmU6CisgIHsKKyAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzOworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmaW5fc3RhdHVzKSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdXRvIHN0ID0gX2FpZGxfZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsgIXN0LmlzT2soKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IHN0LndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKGRvbmUoaW5fc3RhdHVzKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE3N2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcApAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Cis6OmFuZHJvaWQ6OnN0YXR1c190IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkSW50MzIoJl9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPCA0KSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gU0laRV9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgX2FpZGxfcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfcGFyY2VsLT5yZWFkQnl0ZShyZWludGVycHJldF9jYXN0PGludDhfdCAqPigmc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKzo6YW5kcm9pZDo6c3RhdHVzX3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4oc3RhdHVzKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBhdXRvIF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzIxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGFkN2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JwUHJvdGVjdGVkLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHBlcm1pc3Npb24geworRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUHJvdGVjdGVkLCAiYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZCIpCit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JuUHJvdGVjdGVkLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBwZXJtaXNzaW9uIHsKKworQnBQcm90ZWN0ZWQ6OkJwUHJvdGVjdGVkKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKKyAgICA6IEJwSW50ZXJmYWNlPElQcm90ZWN0ZWQ+KF9haWRsX2ltcGwpeworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJwUHJvdGVjdGVkOjpQZXJtaXNzaW9uUHJvdGVjdGVkKCkgeworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9kYXRhOworICBfYWlkbF9kYXRhLm1hcmtGb3JCaW5kZXIocmVtb3RlU3Ryb25nKCkpOworICA6OmFuZHJvaWQ6OlBhcmNlbCBfYWlkbF9yZXBseTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpPSzsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCblByb3RlY3RlZDo6VFJBTlNBQ1RJT05fUGVybWlzc2lvblByb3RlY3RlZCwgX2FpZGxfZGF0YSwgJl9haWRsX3JlcGx5LCAwKTsKKyAgaWYgKFVOTElLRUxZKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OICYmIElQcm90ZWN0ZWQ6OmdldERlZmF1bHRJbXBsKCkpKSB7CisgICAgIHJldHVybiBJUHJvdGVjdGVkOjpnZXREZWZhdWx0SW1wbCgpLT5QZXJtaXNzaW9uUHJvdGVjdGVkKCk7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFByb3RlY3RlZDo6TXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5Qcm90ZWN0ZWQ6OlRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGwsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUHJvdGVjdGVkOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVByb3RlY3RlZDo6Z2V0RGVmYXVsdEltcGwoKS0+TXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBQcm90ZWN0ZWQ6Ok11bHRpcGxlUGVybWlzc2lvbnNBbnkoKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuUHJvdGVjdGVkOjpUUkFOU0FDVElPTl9NdWx0aXBsZVBlcm1pc3Npb25zQW55LCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVByb3RlY3RlZDo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElQcm90ZWN0ZWQ6OmdldERlZmF1bHRJbXBsKCktPk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CisKK0JuUHJvdGVjdGVkOjpCblByb3RlY3RlZCgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBCblByb3RlY3RlZDo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCblByb3RlY3RlZDo6VFJBTlNBQ1RJT05fUGVybWlzc2lvblByb3RlY3RlZDoKKyAgeworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhQZXJtaXNzaW9uUHJvdGVjdGVkKCkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUHJvdGVjdGVkOjpUUkFOU0FDVElPTl9NdWx0aXBsZVBlcm1pc3Npb25zQWxsOgorICB7CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKE11bHRpcGxlUGVybWlzc2lvbnNBbGwoKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgQm5Qcm90ZWN0ZWQ6OlRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbnk6CisgIHsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpKTsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJtaXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIzYWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5ZmU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDE1MiBAQAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZEludGVyZmFjZS5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBwZXJtaXNzaW9uIHsKK0RPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFByb3RlY3RlZEludGVyZmFjZSwgImFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWRJbnRlcmZhY2UiKQorfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CisKK0JwUHJvdGVjdGVkSW50ZXJmYWNlOjpCcFByb3RlY3RlZEludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpCisgICAgOiBCcEludGVyZmFjZTxJUHJvdGVjdGVkSW50ZXJmYWNlPihfYWlkbF9pbXBsKXsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCcFByb3RlY3RlZEludGVyZmFjZTo6TWV0aG9kMSgpIHsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfZGF0YTsKKyAgX2FpZGxfZGF0YS5tYXJrRm9yQmluZGVyKHJlbW90ZVN0cm9uZygpKTsKKyAgOjphbmRyb2lkOjpQYXJjZWwgX2FpZGxfcmVwbHk7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5Qcm90ZWN0ZWRJbnRlcmZhY2U6OlRSQU5TQUNUSU9OX01ldGhvZDEsIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgMCk7CisgIGlmIChVTkxJS0VMWShfYWlkbF9yZXRfc3RhdHVzID09IDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUHJvdGVjdGVkSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSkgeworICAgICByZXR1cm4gSVByb3RlY3RlZEludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+TWV0aG9kMSgpOworICB9CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMucmVhZEZyb21QYXJjZWwoX2FpZGxfcmVwbHkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICByZXR1cm4gX2FpZGxfc3RhdHVzOworICB9CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0RnJvbVN0YXR1c1QoX2FpZGxfcmV0X3N0YXR1cyk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQnBQcm90ZWN0ZWRJbnRlcmZhY2U6Ok1ldGhvZDIoKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuUHJvdGVjdGVkSW50ZXJmYWNlOjpUUkFOU0FDVElPTl9NZXRob2QyLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVByb3RlY3RlZEludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElQcm90ZWN0ZWRJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCktPk1ldGhvZDIoKTsKKyAgfQorICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgZ290byBfYWlkbF9lcnJvcjsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLnJlYWRGcm9tUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgcmV0dXJuIF9haWRsX3N0YXR1czsKKyAgfQorICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldEZyb21TdGF0dXNUKF9haWRsX3JldF9zdGF0dXMpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhYmlsaXR5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CisKK0JuUHJvdGVjdGVkSW50ZXJmYWNlOjpCblByb3RlY3RlZEludGVyZmFjZSgpCit7CisgIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlN0YWJpbGl0eTo6bWFya0NvbXBpbGF0aW9uVW5pdCh0aGlzKTsKK30KKworOjphbmRyb2lkOjpzdGF0dXNfdCBCblByb3RlY3RlZEludGVyZmFjZTo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCblByb3RlY3RlZEludGVyZmFjZTo6VFJBTlNBQ1RJT05fTWV0aG9kMToKKyAgeworICAgIGlmICghKF9haWRsX2RhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVFlQRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhNZXRob2QxKCkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9zdGF0dXMud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEJuUHJvdGVjdGVkSW50ZXJmYWNlOjpUUkFOU0FDVElPTl9NZXRob2QyOgorICB7CisgICAgaWYgKCEoX2FpZGxfZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9UWVBFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgX2FpZGxfc3RhdHVzKE1ldGhvZDIoKSk7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICBpZiAoKChfYWlkbF9yZXRfc3RhdHVzKSAhPSAoOjphbmRyb2lkOjpPSykpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfYWlkbF9zdGF0dXMuaXNPaygpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGRlZmF1bHQ6CisgIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpCQmluZGVyOjpvblRyYW5zYWN0KF9haWRsX2NvZGUsIF9haWRsX2RhdGEsIF9haWRsX3JlcGx5LCBfYWlkbF9mbGFncyk7CisgIH0KKyAgYnJlYWs7CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gOjphbmRyb2lkOjpVTkVYUEVDVEVEX05VTEwpIHsKKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6RVhfTlVMTF9QT0lOVEVSKS53cml0ZU92ZXJQYXJjZWwoX2FpZGxfcmVwbHkpOworICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0MWI2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAKaW5kZXggOWMzNDkzYS4uZTc4MGE0NSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwCkBAIC0xLDEzICsxLDkgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogbmFtZXNwYWNlIHVuaW9ucyB7Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgRW51bVVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7CkBAIC0zNiw3ICszMiw2IEBACiAgIH0KICAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IEVudW1Vbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihnZXRUYWcoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwpAQCAtNDYsMTEgKzQxLDcgQEAKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdW5pb25zCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAKaW5kZXggODI2OGRlOC4uMDZmNjY4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwCkBAIC0xLDEzICsxLDkgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogbmFtZXNwYWNlIHVuaW9ucyB7Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgVW5pb25JblVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7CkBAIC0zNiw3ICszMiw2IEBACiAgIH0KICAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IFVuaW9uSW5Vbmlvbjo6d3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+d3JpdGVJbnQzMihnZXRUYWcoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwpAQCAtNDYsMTEgKzQxLDcgQEAKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgdW5pb25zCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kCmluZGV4IDZkZjY0YjUuLjQ3MGQ5ZWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwLmQKQEAgLTEsMyArMSw1IEBACiBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzMjE5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEsMjY1IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx2YXJpYW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmbmRlZiBfX0JJT05JQ19fCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgQXJyYXlPZkludGVyZmFjZXMgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEVtcHR5SW50ZXJmYWNlKQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdAorICBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgfTsgIC8vIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UKKyAgY2xhc3MgQm5FbXB0eUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElFbXB0eUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQm5FbXB0eUludGVyZmFjZSgpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yIDogcHVibGljIEJuRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUVtcHR5SW50ZXJmYWNlPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJRW1wdHlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yCisgIGNsYXNzIElNeUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNeUludGVyZmFjZSkKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaWZhY2UsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIG51bGxhYmxlX2lmYWNlLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpZmFjZV9hcnJheV9pbiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfYXJyYXlfb3V0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9hcnJheV9pbm91dCwgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBudWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIH07ICAvLyBjbGFzcyBJTXlJbnRlcmZhY2UKKworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElNeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiAvKmlmYWNlKi8sIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIC8qbnVsbGFibGVfaWZhY2UqLywgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgLyppZmFjZV9hcnJheV9pbiovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiAvKmlmYWNlX2FycmF5X291dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiAvKmlmYWNlX2FycmF5X2lub3V0Ki8sIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgLypudWxsYWJsZV9pZmFjZV9hcnJheV9pbiovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElNeUludGVyZmFjZURlZmF1bHQKKyAgY2xhc3MgQnBNeUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBNeUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICAgIHZpcnR1YWwgfkJwTXlJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpZmFjZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgbnVsbGFibGVfaWZhY2UsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2FycmF5X2luLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9hcnJheV9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2FycmF5X2lub3V0LCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2FycmF5X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQnBNeUludGVyZmFjZQorICBjbGFzcyBCbk15SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SU15SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBleHBsaWNpdCBCbk15SW50ZXJmYWNlKCk7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKKyAgfTsgIC8vIGNsYXNzIEJuTXlJbnRlcmZhY2UKKworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5NeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJTXlJbnRlcmZhY2U+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGlmYWNlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBudWxsYWJsZV9pZmFjZSwgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaWZhY2VfYXJyYXlfaW4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2FycmF5X291dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfYXJyYXlfaW5vdXQsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5X2luLCBpZmFjZV9hcnJheV9vdXQsIGlmYWNlX2FycmF5X2lub3V0LCBudWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJTXlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSU15SW50ZXJmYWNlRGVsZWdhdG9yCisgIGNsYXNzIE15UGFyY2VsYWJsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpZmFjZTsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlOworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaWZhY2VfYXJyYXk7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IG51bGxhYmxlX2lmYWNlX2FycmF5OworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgIT0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpIDwgc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA8PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpID09IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA+IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgPj0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLk15UGFyY2VsYWJsZSIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15UGFyY2VsYWJsZXsiOworICAgICAgb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGlmYWNlKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgIG9zIDw8ICIsIGlmYWNlX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGlmYWNlX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBNeVBhcmNlbGFibGUKKyAgY2xhc3MgTXlVbmlvbiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgZW51bSBUYWcgOiBpbnQzMl90IHsKKyAgICAgIGlmYWNlID0gMCwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgICBudWxsYWJsZV9pZmFjZSwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2U7CisgICAgICBpZmFjZV9hcnJheSwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheTsKKyAgICAgIG51bGxhYmxlX2lmYWNlX2FycmF5LCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBNeVVuaW9uPjsKKworICAgIE15VW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PGlmYWNlPiwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPigpKSB7IH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CisgICAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQorICAgIGNvbnN0ZXhwciBNeVVuaW9uKF9UcCYmIF9hcmcpCisgICAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQorCisgICAgdGVtcGxhdGUgPHNpemVfdCBfTnAsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBjb25zdGV4cHIgZXhwbGljaXQgTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCisgICAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgeworICAgICAgcmV0dXJuIE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgorICAgIHN0YXRpYyBNeVVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgeworICAgICAgcmV0dXJuIE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgICAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgeworICAgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBhdXRvJiBnZXQoKSB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuTXlVbmlvbiIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15VW5pb257IjsKKyAgICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICAgIGNhc2UgaWZhY2U6IG9zIDw8ICJpZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IG9zIDw8ICJudWxsYWJsZV9pZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgaWZhY2VfYXJyYXk6IG9zIDw8ICJpZmFjZV9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2VfYXJyYXk+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IG9zIDw8ICJudWxsYWJsZV9pZmFjZV9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2VfYXJyYXk+KCkpOyBicmVhazsKKyAgICAgIH0KKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgc3RkOjp2YXJpYW50PDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4sIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4gX3ZhbHVlOworICB9OyAgLy8gY2xhc3MgTXlVbmlvbgorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFycmF5T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFycmF5T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEFycmF5T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcyIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiQXJyYXlPZkludGVyZmFjZXN7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgQXJyYXlPZkludGVyZmFjZXMKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oCmluZGV4IGE4N2RjMmUuLjVmYTJhMjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oCkBAIC02LDE4ICs2LDIwIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogZW51bSBjbGFzcyBCYWNrZW5kVHlwZSA6IGludDhfdCB7CiAgIENQUCA9IDAsCiAgIEpBVkEgPSAxLAogICBOREsgPSAyLAogICBSVVNUID0gMywKIH07Ci0KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgewogW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEJhY2tlbmRUeXBlIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgQmFja2VuZFR5cGU6OkNQUDoKQEAgLTMyLDE2ICszNCwxMSBAQAogICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOwogICB9CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgaW50ZXJuYWwgewotCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKIHRlbXBsYXRlIDw+CkBAIC01Miw3ICs0OSw1IEBACiAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlOjpSVVNULAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5BcnJheU9mSW50ZXJmYWNlcy5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQXJyYXlPZkludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQXJyYXlPZkludGVyZmFjZXMuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaAppbmRleCBmYzgyZDhiLi4zNmY0MmVmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oCkBAIC00LDE5ICs0LDIxIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBCbkRlcHJlY2F0ZWQgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJRGVwcmVjYXRlZD4gewogcHVibGljOgogICBleHBsaWNpdCBCbkRlcHJlY2F0ZWQoKTsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKIH07ICAvLyBjbGFzcyBCbkRlcHJlY2F0ZWQKIAorY2xhc3MgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgSURlcHJlY2F0ZWREZWxlZ2F0b3IgOiBwdWJsaWMgQm5EZXByZWNhdGVkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSURlcHJlY2F0ZWREZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJRGVwcmVjYXRlZD4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworcHJpdmF0ZToKKyAgOjphbmRyb2lkOjpzcDxJRGVwcmVjYXRlZD4gX2FpZGxfZGVsZWdhdGU7Cit9OyAgLy8gY2xhc3MgSURlcHJlY2F0ZWREZWxlZ2F0b3IKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRml4ZWRTaXplLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5GaXhlZFNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRml4ZWRTaXplLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5MaXN0T2ZJbnRlcmZhY2VzLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5MaXN0T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbkxpc3RPZkludGVyZmFjZXMuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaAppbmRleCA4NWMwNDQzLi40MDQ0ZGU4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oCkBAIC00LDExICs0LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIEJuTmFtZWRDYWxsYmFjayA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElOYW1lZENhbGxiYWNrPiB7CiBwdWJsaWM6CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0TmFtZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CkBAIC0xNiw4ICsxMywxNiBAQAogICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOwogfTsgIC8vIGNsYXNzIEJuTmFtZWRDYWxsYmFjawogCitjbGFzcyBJTmFtZWRDYWxsYmFja0RlbGVnYXRvciA6IHB1YmxpYyBCbk5hbWVkQ2FsbGJhY2sgeworcHVibGljOgorICBleHBsaWNpdCBJTmFtZWRDYWxsYmFja0RlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElOYW1lZENhbGxiYWNrPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldE5hbWUoX2FpZGxfcmV0dXJuKTsKKyAgfQorcHJpdmF0ZToKKyAgOjphbmRyb2lkOjpzcDxJTmFtZWRDYWxsYmFjaz4gX2FpZGxfZGVsZWdhdGU7Cit9OyAgLy8gY2xhc3MgSU5hbWVkQ2FsbGJhY2tEZWxlZ2F0b3IKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oCmluZGV4IGZlY2YxYTYuLjBkYjY1MjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5ld05hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmgKQEAgLTQsMTEgKzQsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgQm5OZXdOYW1lIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SU5ld05hbWU+IHsKIHB1YmxpYzoKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZWFsTmFtZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CkBAIC0xNiw4ICsxMywxNiBAQAogICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOwogfTsgIC8vIGNsYXNzIEJuTmV3TmFtZQogCitjbGFzcyBJTmV3TmFtZURlbGVnYXRvciA6IHB1YmxpYyBCbk5ld05hbWUgeworcHVibGljOgorICBleHBsaWNpdCBJTmV3TmFtZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElOZXdOYW1lPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVhbE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZWFsTmFtZShfYWlkbF9yZXR1cm4pOworICB9Citwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElOZXdOYW1lPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJTmV3TmFtZURlbGVnYXRvcgogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmgKaW5kZXggYTAzODFhYy4uYWE5ZTNiMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaApAQCAtNCwxMSArNCw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBCbk9sZE5hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJT2xkTmFtZT4gewogcHVibGljOgogICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlYWxOYW1lID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKQEAgLTE2LDggKzEzLDE2IEBACiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CiB9OyAgLy8gY2xhc3MgQm5PbGROYW1lCiAKK2NsYXNzIElPbGROYW1lRGVsZWdhdG9yIDogcHVibGljIEJuT2xkTmFtZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElPbGROYW1lRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SU9sZE5hbWU+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWFsTmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlYWxOYW1lKF9haWRsX3JldHVybik7CisgIH0KK3ByaXZhdGU6CisgIDo6YW5kcm9pZDo6c3A8SU9sZE5hbWU+IF9haWRsX2RlbGVnYXRlOworfTsgIC8vIGNsYXNzIElPbGROYW1lRGVsZWdhdG9yCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CblJlY3Vyc2l2ZUxpc3QuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CblJlY3Vyc2l2ZUxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuUmVjdXJzaXZlTGlzdC5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmgKaW5kZXggNzAzNTYxNi4uMmQyYTg2NCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oCkBAIC00LDExICs0LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBCblRlc3RTZXJ2aWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SVRlc3RTZXJ2aWNlPiB7CiBwdWJsaWM6CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVW5pbXBsZW1lbnRlZE1ldGhvZCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CkBAIC0zOCwzNiArMzUsMjUwIEBACiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUxvbmdFbnVtID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQ7CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI1OwogICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjg7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UaHJvd1NlcnZpY2VFeGNlcHRpb24gPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM1OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzg7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldENhbGxiYWNrID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T2xkTmFtZUludGVyZmFjZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE5ld05hbWVJbnRlcmZhY2UgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0ODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRDcHBKYXZhVGVzdHMgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9nZXRCYWNrZW5kVHlwZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldEludGVyZmFjZUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjc7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldEludGVyZmFjZUxpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZ0xpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvciA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmcgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlciA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlciA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdCA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTE7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmcgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2sgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VMaXN0ID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2UgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXROZXdOYW1lSW50ZXJmYWNlID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0Q3BwSmF2YVRlc3RzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZ2V0QmFja2VuZFR5cGUgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NDsKICAgZXhwbGljaXQgQm5UZXN0U2VydmljZSgpOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOwogfTsgIC8vIGNsYXNzIEJuVGVzdFNlcnZpY2UKIAorY2xhc3MgSVRlc3RTZXJ2aWNlRGVsZWdhdG9yIDogcHVibGljIEJuVGVzdFNlcnZpY2UgeworcHVibGljOgorICBleHBsaWNpdCBJVGVzdFNlcnZpY2VEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJVGVzdFNlcnZpY2U+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlVuaW1wbGVtZW50ZWRNZXRob2QoYXJnLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRGVwcmVjYXRlZCgpIG92ZXJyaWRlIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjayBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucyIpKSkgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+RGVwcmVjYXRlZCgpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGVzdE9uZXdheSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlRlc3RPbmV3YXkoKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEJvb2xlYW4oYm9vbCB0b2tlbiwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRCb29sZWFuKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Qnl0ZShpbnQ4X3QgdG9rZW4sIGludDhfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRCeXRlKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCB0b2tlbiwgY2hhcjE2X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0Q2hhcih0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludChpbnQzMl90IHRva2VuLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEludCh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdExvbmcoaW50NjRfdCB0b2tlbiwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRMb25nKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0RmxvYXQoZmxvYXQgdG9rZW4sIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEZsb2F0KHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0RG91YmxlKGRvdWJsZSB0b2tlbiwgZG91YmxlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdERvdWJsZSh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFN0cmluZyhjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiB0b2tlbiwgOjphbmRyb2lkOjpTdHJpbmcxNiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRTdHJpbmcodG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlRW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSB0b2tlbiwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0Qnl0ZUVudW0odG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnRFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gdG9rZW4sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0SW50RW51bSh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdExvbmdFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIHRva2VuLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRMb25nRW51bSh0b2tlbiwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCb29sZWFuKGNvbnN0IDo6c3RkOjp2ZWN0b3I8Ym9vbD4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPGJvb2w+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjxib29sPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlQm9vbGVhbihpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQnl0ZShjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUJ5dGUoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUNoYXIoY29uc3QgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VDaGFyKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJbnQoY29uc3QgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VJbnQoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxvbmcoY29uc3QgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VMb25nKGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VGbG9hdChjb25zdCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUZsb2F0KGlucHV0LCByZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3QgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VEb3VibGUoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVN0cmluZyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZVN0cmluZyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQnl0ZUVudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VCeXRlRW51bShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlSW50RW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUludEVudW0oaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlTG9uZ0VudW0oaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBuYW1lLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+JiBzZXJ2aWNlLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBuYW1lLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlZlcmlmeU5hbWUoc2VydmljZSwgbmFtZSwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIG5hbWVzLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5HZXRJbnRlcmZhY2VBcnJheShuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KHNlcnZpY2VzLCBuYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldEludGVyZmFjZUxpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldEludGVyZmFjZUxpc3QobmFtZXMsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChzZXJ2aWNlcywgbmFtZXMsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZVN0cmluZ0xpc3QoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3ImIHJlYWQsIDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKHJlYWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGludDMyX3QgY29kZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGNvZGUpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3RvcjxpbnQzMl90Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVJbnRBcnJheShpbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdE51bGxhYmxlU3RyaW5nKGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGlucHV0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoaW5wdXQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FuSUJpbmRlcihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIGlucHV0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5UYWtlc0FuSUJpbmRlcihpbnB1dCk7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBpbnB1dCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+VGFrZXNBTnVsbGFibGVJQmluZGVyKGlucHV0KTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5UYWtlc0FuSUJpbmRlckxpc3QoaW5wdXQpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5wdXQpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB0b2tlbiwgOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXRVdGY4Q3BwU3RyaW5nKHRva2VuLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiYgdG9rZW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcodG9rZW4sIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZVV0ZjhDcHBTdHJpbmcoaW5wdXQsIHJlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogcmVwZWF0ZWQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRDYWxsYmFjayhib29sIHJldHVybl9udWxsLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5HZXRDYWxsYmFjayhyZXR1cm5fbnVsbCwgX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUocGFyY2VsKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGVwLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBlcDIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGVwLCBlcDIpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxpc3QoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCYgbGlzdCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5SZXZlcnNlTGlzdChsaXN0LCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+UmV2ZXJzZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiogcmVwZWF0ZWQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQsIF9haWRsX3JldHVybik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkdldE9sZE5hbWVJbnRlcmZhY2UoX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+R2V0TmV3TmFtZUludGVyZmFjZShfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5HZXRDcHBKYXZhVGVzdHMoX2FpZGxfcmV0dXJuKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPmdldEJhY2tlbmRUeXBlKF9haWRsX3JldHVybik7CisgIH0KK3ByaXZhdGU6CisgIDo6YW5kcm9pZDo6c3A8SVRlc3RTZXJ2aWNlPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJVGVzdFNlcnZpY2VEZWxlZ2F0b3IKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQXJyYXlPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEFycmF5T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEFycmF5T2ZJbnRlcmZhY2VzLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmgKaW5kZXggODhmYjYyZC4uNjI4YzU3MCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaApAQCAtNiwxOSArNiwxMyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgQnBEZXByZWNhdGVkIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SURlcHJlY2F0ZWQ+IHsKIHB1YmxpYzoKICAgZXhwbGljaXQgQnBEZXByZWNhdGVkKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CiAgIHZpcnR1YWwgfkJwRGVwcmVjYXRlZCgpID0gZGVmYXVsdDsKIH07ICAvLyBjbGFzcyBCcERlcHJlY2F0ZWQKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBGaXhlZFNpemUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEZpeGVkU2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBGaXhlZFNpemUuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExpc3RPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExpc3RPZkludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTGlzdE9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oCmluZGV4IDRjM2ViOTEuLjkwNzIzMTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmgKQEAgLTYsMjAgKzYsMTQgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIEJwTmFtZWRDYWxsYmFjayA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElOYW1lZENhbGxiYWNrPiB7CiBwdWJsaWM6CiAgIGV4cGxpY2l0IEJwTmFtZWRDYWxsYmFjayhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOwogICB2aXJ0dWFsIH5CcE5hbWVkQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogfTsgIC8vIGNsYXNzIEJwTmFtZWRDYWxsYmFjawotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaAppbmRleCBkOWJhOTBlLi4wNzAyYmU1IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oCkBAIC02LDIwICs2LDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBCcE5ld05hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpCcEludGVyZmFjZTxJTmV3TmFtZT4gewogcHVibGljOgogICBleHBsaWNpdCBCcE5ld05hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKICAgdmlydHVhbCB+QnBOZXdOYW1lKCkgPSBkZWZhdWx0OwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiB9OyAgLy8gY2xhc3MgQnBOZXdOYW1lCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oCmluZGV4IGEzNjI2NjQuLjVlZTg1YjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmgKQEAgLTYsMjAgKzYsMTQgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIEJwT2xkTmFtZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElPbGROYW1lPiB7CiBwdWJsaWM6CiAgIGV4cGxpY2l0IEJwT2xkTmFtZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOwogICB2aXJ0dWFsIH5CcE9sZE5hbWUoKSA9IGRlZmF1bHQ7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVhbE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIH07ICAvLyBjbGFzcyBCcE9sZE5hbWUKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBSZWN1cnNpdmVMaXN0LmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBSZWN1cnNpdmVMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFJlY3Vyc2l2ZUxpc3QuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oCmluZGV4IGJlZTI1YmYuLmMxY2JhYTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaApAQCAtNiwxMSArNiw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgQnBUZXN0U2VydmljZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElUZXN0U2VydmljZT4gewogcHVibGljOgogICBleHBsaWNpdCBCcFRlc3RTZXJ2aWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CkBAIC00Miw2ICszOSwxMiBAQAogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMb25nRW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBuYW1lLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+JiBzZXJ2aWNlLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBuYW1lLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIG5hbWVzLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiYgc2VydmljZXMsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgc2VydmljZXMsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yJiByZWFkLCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiYgaW5wdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CkBAIC01Miw5ICs1NSwxMyBAQAogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBpbnB1dCkgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgaW5wdXQpIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0KSBvdmVycmlkZTsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiBpbnB1dCkgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB0b2tlbiwgOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+JiB0b2tlbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKQEAgLTYyLDE0ICs2OSwxNSBAQAogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCByZXR1cm5fbnVsbCwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiBwYXJjZWwpIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGVwLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBlcDIpIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMaXN0KGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIGxpc3QsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIHJlcGVhdGVkLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIHJlcGVhdGVkLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIH07ICAvLyBjbGFzcyBCcFRlc3RTZXJ2aWNlCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaAppbmRleCA3YjUwMDEwLi42ZWUwOWQ4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaApAQCAtNiwxNyArNiwxOSBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGVudW0gY2xhc3MgQnl0ZUVudW0gOiBpbnQ4X3QgewogICBGT08gPSAxLAogICBCQVIgPSAyLAogICBCQVogPSAzLAogfTsKLQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQnl0ZUVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBCeXRlRW51bTo6Rk9POgpAQCAtMjksMTYgKzMxLDExIEBACiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTQ4LDcgKzQ1LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW06OkJBWiwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKaW5kZXggYjlhYmNiMy4uNjUxMzFhMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCkBAIC02LDExICs2LDggQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBlbnVtIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbkVudW0gOiBpbnQzMl90IHsKICAgZGVjSW50MzJfMSA9IDEsCiAgIGRlY0ludDMyXzIgPSAxLApAQCAtMjMsNyArMjAsMTIgQEAKICAgaGV4SW50MzJfMyA9IDEsCiAgIGhleEludDY0XzEgPSAxLAogfTsKLQorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQ29uc3RhbnRFeHByZXNzaW9uRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDMyXzE6CkBAIC0zMiwxNiArMzQsMTEgQEAKICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50MzJfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTU4LDcgKzU1LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bTo6aGV4SW50NjRfMSwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaAppbmRleCA4ZGU1M2NmLi5jODliMzhmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaApAQCAtNiwxOCArNiwyMSBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGVudW0gY2xhc3MgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgRGVwcmVjYXRlZEVudW0gOiBpbnQzMl90IHsKICAgQSA9IDAsCiAgIEIgPSAxLAogICBDID0gMiwKIH07Ci0KLVtbbm9kaXNjYXJkXV0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhEZXByZWNhdGVkRW51bSB2YWwpIHsKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKERlcHJlY2F0ZWRFbnVtIHZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSk7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRGVwcmVjYXRlZEVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBEZXByZWNhdGVkRW51bTo6QToKICAgICByZXR1cm4gIkEiOwpAQCAtMjksMTYgKzMyLDExIEBACiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOwogICB9CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgaW50ZXJuYWwgewotCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKIHRlbXBsYXRlIDw+CkBAIC00OCw3ICs0Niw1IEBACiAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkRlcHJlY2F0ZWRFbnVtOjpDLAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCmluZGV4IDU5YzdmMjAuLmFhYjUwODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCkBAIC03LDExICs3LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidGVzdCIpKSkgRGVwcmVjYXRlZFBhcmNlbGFibGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZXByZWNhdGVkUGFyY2VsYWJsZSYpIGNvbnN0IHsKQEAgLTQ2LDkgKzQzLDYgQEAKICAgICByZXR1cm4gb3Muc3RyKCk7CiAgIH0KIH07ICAvLyBjbGFzcyBEZXByZWNhdGVkUGFyY2VsYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY3MGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5oCkBAIC0wLDAgKzEsMjIyIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dmFyaWFudD4KKworI2lmbmRlZiBfX0JJT05JQ19fCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgRml4ZWRTaXplIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGNsYXNzIEZpeGVkVW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIGVudW0gVGFnIDogdWludDhfdCB7CisgICAgICBib29sZWFuVmFsdWUgPSAwLCAgLy8gYm9vbGVhbiBib29sZWFuVmFsdWU7CisgICAgICBieXRlVmFsdWUsICAvLyBieXRlIGJ5dGVWYWx1ZTsKKyAgICAgIGNoYXJWYWx1ZSwgIC8vIGNoYXIgY2hhclZhbHVlOworICAgICAgaW50VmFsdWUsICAvLyBpbnQgaW50VmFsdWU7CisgICAgICBsb25nVmFsdWUsICAvLyBsb25nIGxvbmdWYWx1ZTsKKyAgICAgIGZsb2F0VmFsdWUsICAvLyBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgZG91YmxlVmFsdWUsICAvLyBkb3VibGUgZG91YmxlVmFsdWU7CisgICAgICBlbnVtVmFsdWUsICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW0gZW51bVZhbHVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgdXNpbmcgX2F0ID0gdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PF9UYWcsIHN0ZDo6dHVwbGU8Ym9vbCwgaW50OF90LCBjaGFyMTZfdCwgaW50MzJfdCwgaW50NjRfdCwgZmxvYXQsIGRvdWJsZSwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+Pjo6dHlwZTsKKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWcsIHR5cGVuYW1lIF9UeXBlPgorICAgIHN0YXRpYyBGaXhlZFVuaW9uIG1ha2UoX1R5cGUmJiBfYXJnKSB7CisgICAgICBGaXhlZFVuaW9uIF9pbnN0OworICAgICAgX2luc3Quc2V0PF9UYWc+KHN0ZDo6Zm9yd2FyZDxfVHlwZT4oX2FyZykpOworICAgICAgcmV0dXJuIF9pbnN0OworICAgIH0KKyAgICBjb25zdGV4cHIgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdGFnOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgY29uc3QgX2F0PF9UYWc+JiBnZXQoKSBjb25zdCB7CisgICAgICBpZiAoX1RhZyAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPFRhZyBfVGFnPgorICAgIF9hdDxfVGFnPiYgZ2V0KCkgeworICAgICAgaWYgKF9UYWcgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuICooX2F0PF9UYWc+KikoJl92YWx1ZSk7CisgICAgfQorICAgIHRlbXBsYXRlIDxUYWcgX1RhZywgdHlwZW5hbWUgX1R5cGU+CisgICAgdm9pZCBzZXQoX1R5cGUmJiBfYXJnKSB7CisgICAgICBfdGFnID0gX1RhZzsKKyAgICAgIGdldDxfVGFnPigpID0gc3RkOjpmb3J3YXJkPF9UeXBlPihfYXJnKTsKKyAgICB9CisgICAgc3RhdGljIGludCBfY21wKGNvbnN0IEZpeGVkVW5pb24mIF9saHMsIGNvbnN0IEZpeGVkVW5pb24mIF9yaHMpIHsKKyAgICAgIHJldHVybiBfY21wX3ZhbHVlKF9saHMuZ2V0VGFnKCksIF9yaHMuZ2V0VGFnKCkpIHx8IF9jbXBfdmFsdWVfYXQ8ZW51bVZhbHVlPihfbGhzLCBfcmhzKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPFRhZyBfVGFnPgorICAgIHN0YXRpYyBpbnQgX2NtcF92YWx1ZV9hdChjb25zdCBGaXhlZFVuaW9uJiBfbGhzLCBjb25zdCBGaXhlZFVuaW9uJiBfcmhzKSB7CisgICAgICBpZiBjb25zdGV4cHIgKF9UYWcgPT0gYm9vbGVhblZhbHVlKSB7CisgICAgICAgIHJldHVybiBfY21wX3ZhbHVlKF9saHMuZ2V0PF9UYWc+KCksIF9yaHMuZ2V0PF9UYWc+KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChfbGhzLmdldFRhZygpID09IF9UYWcpCisgICAgICAgICAgPyBfY21wX3ZhbHVlKF9saHMuZ2V0PF9UYWc+KCksIF9yaHMuZ2V0PF9UYWc+KCkpCisgICAgICAgICAgOiBfY21wX3ZhbHVlX2F0PChUYWcpKF9UYWctMSk+KF9saHMsIF9yaHMpOworICAgICAgfQorICAgIH0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1R5cGU+CisgICAgc3RhdGljIGludCBfY21wX3ZhbHVlKGNvbnN0IF9UeXBlJiBfbGhzLCBjb25zdCBfVHlwZSYgX3JocykgeworICAgICAgcmV0dXJuIChfbGhzID09IF9yaHMpID8gMCA6IChfbGhzIDwgX3JocykgPyAtMSA6IDE7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgIT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpIDwgMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA8PSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA+IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPj0gMDsKKyAgICB9CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRVbmlvbiIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkZpeGVkVW5pb257IjsKKyAgICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICAgIGNhc2UgYm9vbGVhblZhbHVlOiBvcyA8PCAiYm9vbGVhblZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxib29sZWFuVmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgYnl0ZVZhbHVlOiBvcyA8PCAiYnl0ZVZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxieXRlVmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgY2hhclZhbHVlOiBvcyA8PCAiY2hhclZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxjaGFyVmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgaW50VmFsdWU6IG9zIDw8ICJpbnRWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aW50VmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbG9uZ1ZhbHVlOiBvcyA8PCAibG9uZ1ZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxsb25nVmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgZmxvYXRWYWx1ZTogb3MgPDwgImZsb2F0VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGZsb2F0VmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgZG91YmxlVmFsdWU6IG9zIDw8ICJkb3VibGVWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8ZG91YmxlVmFsdWU+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgZW51bVZhbHVlOiBvcyA8PCAiZW51bVZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxlbnVtVmFsdWU+KCkpOyBicmVhazsKKyAgICAgIH0KKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgVGFnIF90YWcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMSkpKSA9IGJvb2xlYW5WYWx1ZTsKKyAgICB1bmlvbiBfdmFsdWVfdCB7CisgICAgICBfdmFsdWVfdCgpIHt9CisgICAgICB+X3ZhbHVlX3QoKSB7fQorICAgICAgYm9vbCBib29sZWFuVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMSkpKSA9IGJvb2woZmFsc2UpOworICAgICAgaW50OF90IGJ5dGVWYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICgxKSkpOworICAgICAgY2hhcjE2X3QgY2hhclZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDIpKSk7CisgICAgICBpbnQzMl90IGludFZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDQpKSk7CisgICAgICBpbnQ2NF90IGxvbmdWYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgICAgZmxvYXQgZmxvYXRWYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg0KSkpOworICAgICAgZG91YmxlIGRvdWJsZVZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBlbnVtVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKKyAgICB9IF92YWx1ZTsKKyAgfTsgIC8vIGNsYXNzIEZpeGVkVW5pb24KKyAgY2xhc3MgRml4ZWRQYXJjZWxhYmxlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CisgIHB1YmxpYzoKKyAgICBib29sIGJvb2xlYW5WYWx1ZSA9IGZhbHNlOworICAgIGludDhfdCBieXRlVmFsdWUgPSAwOworICAgIGNoYXIxNl90IGNoYXJWYWx1ZSA9ICdcMCc7CisgICAgaW50MzJfdCBpbnRWYWx1ZSA9IDA7CisgICAgaW50NjRfdCBsb25nVmFsdWUgPSAwTDsKKyAgICBmbG9hdCBmbG9hdFZhbHVlID0gMC4wMDAwMDBmOworICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IDAuMDAwMDAwOworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGVudW1WYWx1ZSA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtOjpGT087CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Rml4ZWRTaXplOjpGaXhlZFVuaW9uIHBhcmNlbGFibGVWYWx1ZTsKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSAhPSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpIDwgc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPD0gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPT0gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA+IHN0ZDo6dGllKHJocy5ib29sZWFuVmFsdWUsIHJocy5ieXRlVmFsdWUsIHJocy5jaGFyVmFsdWUsIHJocy5pbnRWYWx1ZSwgcmhzLmxvbmdWYWx1ZSwgcmhzLmZsb2F0VmFsdWUsIHJocy5kb3VibGVWYWx1ZSwgcmhzLmVudW1WYWx1ZSwgcmhzLnBhcmNlbGFibGVWYWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpID49IHN0ZDo6dGllKHJocy5ib29sZWFuVmFsdWUsIHJocy5ieXRlVmFsdWUsIHJocy5jaGFyVmFsdWUsIHJocy5pbnRWYWx1ZSwgcmhzLmxvbmdWYWx1ZSwgcmhzLmZsb2F0VmFsdWUsIHJocy5kb3VibGVWYWx1ZSwgcmhzLmVudW1WYWx1ZSwgcmhzLnBhcmNlbGFibGVWYWx1ZSk7CisgICAgfQorCisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRQYXJjZWxhYmxlIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRml4ZWRQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiYm9vbGVhblZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xlYW5WYWx1ZSk7CisgICAgICBvcyA8PCAiLCBieXRlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZVZhbHVlKTsKKyAgICAgIG9zIDw8ICIsIGNoYXJWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyVmFsdWUpOworICAgICAgb3MgPDwgIiwgaW50VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50VmFsdWUpOworICAgICAgb3MgPDwgIiwgbG9uZ1ZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBmbG9hdFZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0VmFsdWUpOworICAgICAgb3MgPDwgIiwgZG91YmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlVmFsdWUpOworICAgICAgb3MgPDwgIiwgZW51bVZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGVudW1WYWx1ZSk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxhYmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsYWJsZVZhbHVlKTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBGaXhlZFBhcmNlbGFibGUKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplIik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJGaXhlZFNpemV7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgRml4ZWRTaXplCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCmluZGV4IGU2NTVlZTEuLjdhODZmODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKQEAgLTgsMTQgKzgsMTMgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI+CiBjbGFzcyBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKKyAgaW50MzJfdCBhID0gMDsKKyAgaW50MzJfdCBiID0gMDsKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewogICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOwogICB9CkBAIC0zNSw4ICszNCw2IEBACiAgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID49IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CiAgIH0KIAotICBpbnQzMl90IGEgPSBpbnQzMl90KDApOwotICBpbnQzMl90IGIgPSBpbnQzMl90KDApOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTUyLDI3ICs0OSwyNSBAQAogICAgIHJldHVybiBvcy5zdHIoKTsKICAgfQogfTsgIC8vIGNsYXNzIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj4KIDo6YW5kcm9pZDo6c3RhdHVzX3QgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPFQsVSxCPjo6cmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpOwotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigpOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgW1ttYXliZV91bnVzZWRdXSBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPnJlYWRJbnQzMigmX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA8IDQpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgc2l6ZV90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSk7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBTSVpFX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwogICBpZiAoX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKICAgICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwpAQCAtOTMsNyArODgsNiBAQAogICBfYWlkbF9wYXJjZWwtPnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI+CiA6OmFuZHJvaWQ6OnN0YXR1c190IEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxULFUsQj46OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwpAQCAtMTEzLDkgKzEwNyw2IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCmluZGV4IDczOTMxZWEuLjE5NWI0N2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCkBAIC02LDExICs2LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0ZXN0IikpKSBJRGVwcmVjYXRlZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgewogcHVibGljOgogICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERlcHJlY2F0ZWQpCkBAIC0yMiw5ICsxOSw2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIH07ICAvLyBjbGFzcyBJRGVwcmVjYXRlZERlZmF1bHQKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCmluZGV4IDkxMDI5NGMuLjJiMjc3NzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCkBAIC03LDExICs3LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgdGVzdHMgewotCiBjbGFzcyBJTmFtZWRDYWxsYmFjayA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgewogcHVibGljOgogICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE5hbWVkQ2FsbGJhY2spCkBAIC0yMywxMyArMjAsMTAgQEAKICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmFtZSg6OmFuZHJvaWQ6OlN0cmluZzE2Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSU5hbWVkQ2FsbGJhY2tEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaAppbmRleCBhM2Q5MTFjLi42OTNmODhiIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaApAQCAtNywxMSArNyw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgSU5ld05hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKIHB1YmxpYzoKICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShOZXdOYW1lKQpAQCAtMjMsMTMgKzIwLDEwIEBACiAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVhbE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSU5ld05hbWVEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaAppbmRleCBhYjU1MzBiLi4yMTQyZDg4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaApAQCAtNywxMSArNyw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgSU9sZE5hbWUgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKIHB1YmxpYzoKICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPbGROYW1lKQpAQCAtMjMsMTMgKzIwLDEwIEBACiAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlYWxOYW1lKDo6YW5kcm9pZDo6U3RyaW5nMTYqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVhbE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiB9OyAgLy8gY2xhc3MgSU9sZE5hbWVEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oCmluZGV4IDlkOTFlMGUuLmRkMGU3ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmgKQEAgLTUsMTA5ICs1LDIxMCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIElUZXN0U2VydmljZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgewogcHVibGljOgogICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFRlc3RTZXJ2aWNlKQotICBlbnVtICA6IGludDhfdCB7Ci0gICAgQllURV9URVNUX0NPTlNUQU5UID0gMTcsCi0gIH07Ci0gIGVudW0gIDogaW50MzJfdCB7Ci0gICAgVEVTVF9DT05TVEFOVCA9IDQyLAotICAgIFRFU1RfQ09OU1RBTlQyID0gLTQyLAotICAgIFRFU1RfQ09OU1RBTlQzID0gNDIsCi0gICAgVEVTVF9DT05TVEFOVDQgPSA0LAotICAgIFRFU1RfQ09OU1RBTlQ1ID0gLTQsCi0gICAgVEVTVF9DT05TVEFOVDYgPSAwLAotICAgIFRFU1RfQ09OU1RBTlQ3ID0gMCwKLSAgICBURVNUX0NPTlNUQU5UOCA9IDAsCi0gICAgVEVTVF9DT05TVEFOVDkgPSA4NiwKLSAgICBURVNUX0NPTlNUQU5UMTAgPSAxNjUsCi0gICAgVEVTVF9DT05TVEFOVDExID0gMjUwLAotICAgIFRFU1RfQ09OU1RBTlQxMiA9IC0xLAotICAgIEExID0gMSwKLSAgICBBMiA9IDEsCi0gICAgQTMgPSAxLAotICAgIEE0ID0gMSwKLSAgICBBNSA9IDEsCi0gICAgQTYgPSAxLAotICAgIEE3ID0gMSwKLSAgICBBOCA9IDEsCi0gICAgQTkgPSAxLAotICAgIEExMCA9IDEsCi0gICAgQTExID0gMSwKLSAgICBBMTIgPSAxLAotICAgIEExMyA9IDEsCi0gICAgQTE0ID0gMSwKLSAgICBBMTUgPSAxLAotICAgIEExNiA9IDEsCi0gICAgQTE3ID0gMSwKLSAgICBBMTggPSAxLAotICAgIEExOSA9IDEsCi0gICAgQTIwID0gMSwKLSAgICBBMjEgPSAxLAotICAgIEEyMiA9IDEsCi0gICAgQTIzID0gMSwKLSAgICBBMjQgPSAxLAotICAgIEEyNSA9IDEsCi0gICAgQTI2ID0gMSwKLSAgICBBMjcgPSAxLAotICAgIEEyOCA9IDEsCi0gICAgQTI5ID0gMSwKLSAgICBBMzAgPSAxLAotICAgIEEzMSA9IDEsCi0gICAgQTMyID0gMSwKLSAgICBBMzMgPSAxLAotICAgIEEzNCA9IDEsCi0gICAgQTM1ID0gMSwKLSAgICBBMzYgPSAxLAotICAgIEEzNyA9IDEsCi0gICAgQTM4ID0gMSwKLSAgICBBMzkgPSAxLAotICAgIEE0MCA9IDEsCi0gICAgQTQxID0gMSwKLSAgICBBNDIgPSAxLAotICAgIEE0MyA9IDEsCi0gICAgQTQ0ID0gMSwKLSAgICBBNDUgPSAxLAotICAgIEE0NiA9IDEsCi0gICAgQTQ3ID0gMSwKLSAgICBBNDggPSAxLAotICAgIEE0OSA9IDEsCi0gICAgQTUwID0gMSwKLSAgICBBNTEgPSAxLAotICAgIEE1MiA9IDEsCi0gICAgQTUzID0gMSwKLSAgICBBNTQgPSAxLAotICAgIEE1NSA9IDEsCi0gICAgQTU2ID0gMSwKLSAgICBBNTcgPSAxLAotICB9OwotICBlbnVtICA6IGludDY0X3QgewotICAgIExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMLAotICB9OworICBjbGFzcyBFbXB0eSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5Iik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRW1wdHl7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBFbXB0eQorICBjbGFzcyBDb21waWxlckNoZWNrcyA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+IGJpbmRlcjsKKyAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4gbnVsbGFibGVfYmluZGVyOworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBiaW5kZXJfYXJyYXk7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4gbnVsbGFibGVfYmluZGVyX2FycmF5OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiBiaW5kZXJfbGlzdDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiBudWxsYWJsZV9iaW5kZXJfbGlzdDsKKyAgICA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQ7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiBudWxsYWJsZV9wZmQ7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gcGZkX2FycmF5OworICAgIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+PiBudWxsYWJsZV9wZmRfYXJyYXk7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gcGZkX2xpc3Q7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4+IG51bGxhYmxlX3BmZF9saXN0OworICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHkgcGFyY2VsOworICAgIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBudWxsYWJsZV9wYXJjZWw7CisgICAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBwYXJjZWxfYXJyYXk7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gbnVsbGFibGVfcGFyY2VsX2FycmF5OworICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gcGFyY2VsX2xpc3Q7CisgICAgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4gbnVsbGFibGVfcGFyY2VsX2xpc3Q7CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgIT0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPCBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPD0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29tcGlsZXJDaGVja3MmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJpbmRlciwgbnVsbGFibGVfYmluZGVyLCBiaW5kZXJfYXJyYXksIG51bGxhYmxlX2JpbmRlcl9hcnJheSwgYmluZGVyX2xpc3QsIG51bGxhYmxlX2JpbmRlcl9saXN0LCBwZmQsIG51bGxhYmxlX3BmZCwgcGZkX2FycmF5LCBudWxsYWJsZV9wZmRfYXJyYXksIHBmZF9saXN0LCBudWxsYWJsZV9wZmRfbGlzdCwgcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwsIHBhcmNlbF9hcnJheSwgbnVsbGFibGVfcGFyY2VsX2FycmF5LCBwYXJjZWxfbGlzdCwgbnVsbGFibGVfcGFyY2VsX2xpc3QpID09IHN0ZDo6dGllKHJocy5iaW5kZXIsIHJocy5udWxsYWJsZV9iaW5kZXIsIHJocy5iaW5kZXJfYXJyYXksIHJocy5udWxsYWJsZV9iaW5kZXJfYXJyYXksIHJocy5iaW5kZXJfbGlzdCwgcmhzLm51bGxhYmxlX2JpbmRlcl9saXN0LCByaHMucGZkLCByaHMubnVsbGFibGVfcGZkLCByaHMucGZkX2FycmF5LCByaHMubnVsbGFibGVfcGZkX2FycmF5LCByaHMucGZkX2xpc3QsIHJocy5udWxsYWJsZV9wZmRfbGlzdCwgcmhzLnBhcmNlbCwgcmhzLm51bGxhYmxlX3BhcmNlbCwgcmhzLnBhcmNlbF9hcnJheSwgcmhzLm51bGxhYmxlX3BhcmNlbF9hcnJheSwgcmhzLnBhcmNlbF9saXN0LCByaHMubnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQ29tcGlsZXJDaGVja3MmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJpbmRlciwgbnVsbGFibGVfYmluZGVyLCBiaW5kZXJfYXJyYXksIG51bGxhYmxlX2JpbmRlcl9hcnJheSwgYmluZGVyX2xpc3QsIG51bGxhYmxlX2JpbmRlcl9saXN0LCBwZmQsIG51bGxhYmxlX3BmZCwgcGZkX2FycmF5LCBudWxsYWJsZV9wZmRfYXJyYXksIHBmZF9saXN0LCBudWxsYWJsZV9wZmRfbGlzdCwgcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwsIHBhcmNlbF9hcnJheSwgbnVsbGFibGVfcGFyY2VsX2FycmF5LCBwYXJjZWxfbGlzdCwgbnVsbGFibGVfcGFyY2VsX2xpc3QpID4gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQ29tcGlsZXJDaGVja3MmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJpbmRlciwgbnVsbGFibGVfYmluZGVyLCBiaW5kZXJfYXJyYXksIG51bGxhYmxlX2JpbmRlcl9hcnJheSwgYmluZGVyX2xpc3QsIG51bGxhYmxlX2JpbmRlcl9saXN0LCBwZmQsIG51bGxhYmxlX3BmZCwgcGZkX2FycmF5LCBudWxsYWJsZV9wZmRfYXJyYXksIHBmZF9saXN0LCBudWxsYWJsZV9wZmRfbGlzdCwgcGFyY2VsLCBudWxsYWJsZV9wYXJjZWwsIHBhcmNlbF9hcnJheSwgbnVsbGFibGVfcGFyY2VsX2FycmF5LCBwYXJjZWxfbGlzdCwgbnVsbGFibGVfcGFyY2VsX2xpc3QpID49IHN0ZDo6dGllKHJocy5iaW5kZXIsIHJocy5udWxsYWJsZV9iaW5kZXIsIHJocy5iaW5kZXJfYXJyYXksIHJocy5udWxsYWJsZV9iaW5kZXJfYXJyYXksIHJocy5iaW5kZXJfbGlzdCwgcmhzLm51bGxhYmxlX2JpbmRlcl9saXN0LCByaHMucGZkLCByaHMubnVsbGFibGVfcGZkLCByaHMucGZkX2FycmF5LCByaHMubnVsbGFibGVfcGZkX2FycmF5LCByaHMucGZkX2xpc3QsIHJocy5udWxsYWJsZV9wZmRfbGlzdCwgcmhzLnBhcmNlbCwgcmhzLm51bGxhYmxlX3BhcmNlbCwgcmhzLnBhcmNlbF9hcnJheSwgcmhzLm51bGxhYmxlX3BhcmNlbF9hcnJheSwgcmhzLnBhcmNlbF9saXN0LCByaHMubnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkNvbXBpbGVyQ2hlY2tzIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiQ29tcGlsZXJDaGVja3N7IjsKKyAgICAgIG9zIDw8ICJiaW5kZXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYmluZGVyKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2JpbmRlcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9iaW5kZXIpOworICAgICAgb3MgPDwgIiwgYmluZGVyX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlcl9hcnJheSk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9iaW5kZXJfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfYmluZGVyX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIGJpbmRlcl9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlcl9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2JpbmRlcl9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2JpbmRlcl9saXN0KTsKKyAgICAgIG9zIDw8ICIsIHBmZDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwZmQpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGZkOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BmZCk7CisgICAgICBvcyA8PCAiLCBwZmRfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BmZF9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wZmRfYXJyYXkpOworICAgICAgb3MgPDwgIiwgcGZkX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkX2xpc3QpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGZkX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGZkX2xpc3QpOworICAgICAgb3MgPDwgIiwgcGFyY2VsOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBhcmNlbCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9wYXJjZWw6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGFyY2VsKTsKKyAgICAgIG9zIDw8ICIsIHBhcmNlbF9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxfYXJyYXkpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGFyY2VsX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BhcmNlbF9hcnJheSk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWxfbGlzdCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9wYXJjZWxfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgQ29tcGlsZXJDaGVja3MKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UMiA9IC00MiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQzID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNCA9IDQgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNSA9IC00IH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDYgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDcgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDggPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDkgPSA4NiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMCA9IDE2NSB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMSA9IDI1MCB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMiA9IC0xIH07CisgIGVudW0gOiBpbnQ4X3QgeyBCWVRFX1RFU1RfQ09OU1RBTlQgPSAxNyB9OworICBlbnVtIDogaW50NjRfdCB7IExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMIH07CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBTVFJJTkdfVEVTVF9DT05TVEFOVCgpOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgU1RSSU5HX1RFU1RfQ09OU1RBTlQyKCk7CiAgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTVFJJTkdfVEVTVF9DT05TVEFOVF9VVEY4KCk7CisgIGVudW0gOiBpbnQzMl90IHsgQTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExMSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyNiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI4ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyOSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzAgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMxID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzMiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM0ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzNSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM3ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzOCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0MSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTU1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1NiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTcgPSAxIH07CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIERlcHJlY2F0ZWQoKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiKSkpID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRlc3RPbmV3YXkoKSA9IDA7CkBAIC0xMzUsNiArMjM2LDEyIEBACiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgc2VydmljZSwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiBuYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBuYW1lcywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIHNlcnZpY2VzLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgbmFtZXMsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBzZXJ2aWNlcywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIG5hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYgcmVhZCwgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogcmVwZWF0ZWQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pID0gMDsKQEAgLTE0NSw5ICsyNTIsMTMgQEAKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbnB1dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBpbnB1dCkgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgaW5wdXQpID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4mIGlucHV0KSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+JiBpbnB1dCkgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB0b2tlbiwgOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+JiB0b2tlbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4mIGlucHV0LCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSA9IDA7CkBAIC0xNTUsNiArMjY2LDEwIEBACiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mIGlucHV0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiogcmVwZWF0ZWQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENhbGxiYWNrKGJvb2wgcmV0dXJuX251bGwsIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogcGFyY2VsKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiBlcCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogZXAyKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTGlzdChjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0JiBsaXN0LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+JiBpbnB1dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiByZXBlYXRlZCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgaW5wdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4+KiByZXBlYXRlZCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIF9haWRsX3JldHVybikgPSAwOwogICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiogX2FpZGxfcmV0dXJuKSA9IDA7CiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+KiBfYWlkbF9yZXR1cm4pID0gMDsKICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENwcEphdmFUZXN0cyg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4qIF9haWRsX3JldHVybikgPSAwOwpAQCAtMTY2LDcgKzI4MSw3IEBACiAgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFVuaW1wbGVtZW50ZWRNZXRob2QoaW50MzJfdCwgaW50MzJfdCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgLyphcmcqLywgaW50MzJfdCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9CiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRGVwcmVjYXRlZCgpIG92ZXJyaWRlIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjayBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucyIpKSkgewpAQCAtMTc1LDE1NCArMjkwLDE5MyBAQAogICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRlc3RPbmV3YXkoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wsIGJvb2wqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Qm9vbGVhbihib29sIC8qdG9rZW4qLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Qnl0ZShpbnQ4X3QsIGludDhfdCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlKGludDhfdCAvKnRva2VuKi8sIGludDhfdCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCwgY2hhcjE2X3QqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCAvKnRva2VuKi8sIGNoYXIxNl90KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCwgaW50MzJfdCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCAvKnRva2VuKi8sIGludDMyX3QqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdExvbmcoaW50NjRfdCwgaW50NjRfdCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRMb25nKGludDY0X3QgLyp0b2tlbiovLCBpbnQ2NF90KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCwgZmxvYXQqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0RmxvYXQoZmxvYXQgLyp0b2tlbiovLCBmbG9hdCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0RG91YmxlKGRvdWJsZSwgZG91YmxlKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdERvdWJsZShkb3VibGUgLyp0b2tlbiovLCBkb3VibGUqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFN0cmluZyhjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiwgOjphbmRyb2lkOjpTdHJpbmcxNiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRTdHJpbmcoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgLyp0b2tlbiovLCA6OmFuZHJvaWQ6OlN0cmluZzE2KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRCeXRlRW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0Qnl0ZUVudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gLyp0b2tlbiovLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0SW50RW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdEludEVudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSAvKnRva2VuKi8sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdExvbmdFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRMb25nRW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSAvKnRva2VuKi8sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQm9vbGVhbihjb25zdCA6OnN0ZDo6dmVjdG9yPGJvb2w+JiwgOjpzdGQ6OnZlY3Rvcjxib29sPiosIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUJvb2xlYW4oY29uc3QgOjpzdGQ6OnZlY3Rvcjxib29sPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPGJvb2w+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mLCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiwgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQnl0ZShjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUNoYXIoY29uc3QgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4mLCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiosIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VDaGFyKGNvbnN0IDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlSW50KGNvbnN0IDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4mLCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KiwgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlSW50KGNvbnN0IDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+JiwgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiosIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUxvbmcoY29uc3QgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VGbG9hdChjb25zdCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiYsIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+KiwgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlRG91YmxlKGNvbnN0IDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiYsIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiosIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlRG91YmxlKGNvbnN0IDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlQnl0ZUVudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4mLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZUludEVudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VJbnRFbnVtKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMb25nRW51bShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiAvKm5hbWUqLywgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWUoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4mLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiwgYm9vbCopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+JiAvKnNlcnZpY2UqLywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgLypuYW1lKi8sIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiAvKm5hbWVzKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYsIDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+JiAvKnNlcnZpY2VzKi8sIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4mIC8qbmFtZXMqLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4mLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIC8qbmFtZXMqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGludDMyX3QpIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIC8qc2VydmljZXMqLywgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4mIC8qbmFtZXMqLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3RvcjxpbnQzMl90Pj4mLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4+PiYgLypuYW1lcyovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiYsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiAvKnNlcnZpY2VzKi8sIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiAvKm5hbWVzKi8sIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlU3RyaW5nTGlzdChjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+JiAvKmlucHV0Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yJiAvKnJlYWQqLywgOjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2PiYsIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+Pj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGludDMyX3QgLypjb2RlKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYpIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Jikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYsIDo6c3RkOjpzdHJpbmcqKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiYsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpTdHJpbmcxNj4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZyhjb25zdCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+JiwgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiosIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OlN0cmluZzE2Pj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+JiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4+PiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCwgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgLyppbnB1dCovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQW5JQmluZGVyKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgLyppbnB1dCovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+Kikgb3ZlcnJpZGUgeworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFRha2VzQU51bGxhYmxlSUJpbmRlcihjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIC8qaW5wdXQqLykgb3ZlcnJpZGUgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOwogICB9Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0TmV3TmFtZUludGVyZmFjZSg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBUYWtlc0FuSUJpbmRlckxpc3QoY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+JiAvKmlucHV0Ki8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQotICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENwcEphdmFUZXN0cyg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+PiYgLyppbnB1dCovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSopIG92ZXJyaWRlIHsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIC8qdG9rZW4qLywgOjpzdGQ6OnN0cmluZyogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPiYgLyp0b2tlbiovLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnN0cmluZz4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4mIC8qaW5wdXQqLywgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiogLypyZXBlYXRlZCovLCA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+JiAvKmlucHV0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiAvKnJlcGVhdGVkKi8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6c3RyaW5nPj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjpzdHJpbmc+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENhbGxiYWNrKGJvb2wgLypyZXR1cm5fbnVsbCovLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiAvKnBhcmNlbCovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiAvKmVwKi8sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIC8qZXAyKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJldmVyc2VMaXN0KGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIC8qbGlzdCovLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlSUJpbmRlckFycmF5KGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+PiYgLyppbnB1dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPj4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4+KiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4mIC8qaW5wdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIC8qcmVwZWF0ZWQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE9sZE5hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2UoOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldENwcEphdmFUZXN0cyg6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CiAgIH0KIH07ICAvLyBjbGFzcyBJVGVzdFNlcnZpY2VEZWZhdWx0Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmgKaW5kZXggNTBiMWI2MC4uMDBlODczOCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oCkBAIC02LDE3ICs2LDE5IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogZW51bSBjbGFzcyBJbnRFbnVtIDogaW50MzJfdCB7CiAgIEZPTyA9IDEwMDAsCiAgIEJBUiA9IDIwMDAsCiAgIEJBWiA9IDIwMDEsCiB9OwotCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhJbnRFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgSW50RW51bTo6Rk9POgpAQCAtMjksMTYgKzMxLDExIEBACiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbCkpOwogICB9CiB9Ci0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgaW50ZXJuYWwgewotCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKIHRlbXBsYXRlIDw+CkBAIC00OCw3ICs0NSw1IEBACiAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkJBWiwKIH07CiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YzgxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmgKQEAgLTAsMCArMSwyNjUgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIExpc3RPZkludGVyZmFjZXMgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEVtcHR5SW50ZXJmYWNlKQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdAorICBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgfTsgIC8vIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UKKyAgY2xhc3MgQm5FbXB0eUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElFbXB0eUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQm5FbXB0eUludGVyZmFjZSgpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlCisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yIDogcHVibGljIEJuRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUVtcHR5SW50ZXJmYWNlPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJRW1wdHlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVsZWdhdG9yCisgIGNsYXNzIElNeUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNeUludGVyZmFjZSkKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpZmFjZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBudWxsYWJsZV9pZmFjZSwgY29uc3QgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpZmFjZV9saXN0X2luLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2xpc3Rfb3V0LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGlmYWNlX2xpc3RfaW5vdXQsIGNvbnN0IDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBudWxsYWJsZV9pZmFjZV9saXN0X2luLCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIH07ICAvLyBjbGFzcyBJTXlJbnRlcmZhY2UKKworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElNeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIC8qaWZhY2UqLywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiAvKm51bGxhYmxlX2lmYWNlKi8sIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgLyppZmFjZV9saXN0X2luKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogLyppZmFjZV9saXN0X291dCovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qaWZhY2VfbGlzdF9pbm91dCovLCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgLypudWxsYWJsZV9pZmFjZV9saXN0X2luKi8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKm51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0Ki8sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKm51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQqLywgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIElNeUludGVyZmFjZURlZmF1bHQKKyAgY2xhc3MgQnBNeUludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBNeUludGVyZmFjZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICAgIHZpcnR1YWwgfkJwTXlJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGlmYWNlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIG51bGxhYmxlX2lmYWNlLCBjb25zdCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGlmYWNlX2xpc3RfaW4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9vdXQsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaWZhY2VfbGlzdF9pbm91dCwgY29uc3QgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIG51bGxhYmxlX2lmYWNlX2xpc3RfaW4sIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIDo6c3RkOjpvcHRpb25hbDw6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICB9OyAgLy8gY2xhc3MgQnBNeUludGVyZmFjZQorICBjbGFzcyBCbk15SW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SU15SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBleHBsaWNpdCBCbk15SW50ZXJmYWNlKCk7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKKyAgfTsgIC8vIGNsYXNzIEJuTXlJbnRlcmZhY2UKKworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5NeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJTXlJbnRlcmZhY2VEZWxlZ2F0b3IoOjphbmRyb2lkOjpzcDxJTXlJbnRlcmZhY2U+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaWZhY2UsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgbnVsbGFibGVfaWZhY2UsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaWZhY2VfbGlzdF9pbiwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9saXN0X291dCwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpZmFjZV9saXN0X2lub3V0LCBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3RfaW4sIGlmYWNlX2xpc3Rfb3V0LCBpZmFjZV9saXN0X2lub3V0LCBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCwgX2FpZGxfcmV0dXJuKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgOjphbmRyb2lkOjpzcDxJTXlJbnRlcmZhY2U+IF9haWRsX2RlbGVnYXRlOworICB9OyAgLy8gY2xhc3MgSU15SW50ZXJmYWNlRGVsZWdhdG9yCisgIGNsYXNzIE15UGFyY2VsYWJsZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IGlmYWNlOworICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZTsKKyAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaWZhY2VfbGlzdDsKKyAgICA6OnN0ZDo6b3B0aW9uYWw8OjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBudWxsYWJsZV9pZmFjZV9saXN0OworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpICE9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpIDwgc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9saXN0LCByaHMubnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpIDw9IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA9PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA+IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA+PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuTXlQYXJjZWxhYmxlIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2UpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2UpOworICAgICAgb3MgPDwgIiwgaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpZmFjZV9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgTXlQYXJjZWxhYmxlCisgIGNsYXNzIE15VW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIGVudW0gVGFnIDogaW50MzJfdCB7CisgICAgICBpZmFjZSA9IDAsICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgICBudWxsYWJsZV9pZmFjZSwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICAgIGlmYWNlX2xpc3QsICAvLyBMaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdDsKKyAgICAgIG51bGxhYmxlX2lmYWNlX2xpc3QsICAvLyBMaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgTXlVbmlvbj47CisKKyAgICBNeVVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxpZmFjZT4sIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPigpKSB7IH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CisgICAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQorICAgIGNvbnN0ZXhwciBNeVVuaW9uKF9UcCYmIF9hcmcpCisgICAgICAgIDogX3ZhbHVlKHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmcpKSB7fQorCisgICAgdGVtcGxhdGUgPHNpemVfdCBfTnAsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBjb25zdGV4cHIgZXhwbGljaXQgTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4X3Q8X05wPiwgX1RwJiYuLi4gX2FyZ3MpCisgICAgICAgIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X05wPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKSB7fQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShfVHAmJi4uLiBfYXJncykgeworICAgICAgcmV0dXJuIE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgorICAgIHN0YXRpYyBNeVVuaW9uIG1ha2Uoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX2lsLCBfVXAmJi4uLiBfYXJncykgeworICAgICAgcmV0dXJuIE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleDxfdGFnPiwgc3RkOjptb3ZlKF9pbCksIHN0ZDo6Zm9yd2FyZDxfVXA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgVGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWc+KF92YWx1ZS5pbmRleCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgICAgY29uc3QgYXV0byYgZ2V0KCkgY29uc3QgeworICAgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBhdXRvJiBnZXQoKSB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgdm9pZCBzZXQoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVVuaW9uIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlVbmlvbnsiOworICAgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgICAgY2FzZSBpZmFjZTogb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogb3MgPDwgIm51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxudWxsYWJsZV9pZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9saXN0OiBvcyA8PCAiaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2VfbGlzdD4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiBvcyA8PCAibnVsbGFibGVfaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2VfbGlzdD4oKSk7IGJyZWFrOworICAgICAgfQorICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZhcmlhbnQ8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+LCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiwgOjpzdGQ6Om9wdGlvbmFsPDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4+IF92YWx1ZTsKKyAgfTsgIC8vIGNsYXNzIE15VW5pb24KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcyIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTGlzdE9mSW50ZXJmYWNlc3siOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBMaXN0T2ZJbnRlcmZhY2VzCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaAppbmRleCA4Y2FhM2FhLi44MDIyZjZiIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaApAQCAtNiwxNyArNiwxOSBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGVudW0gY2xhc3MgTG9uZ0VudW0gOiBpbnQ2NF90IHsKICAgRk9PID0gMTAwMDAwMDAwMDAwTCwKICAgQkFSID0gMjAwMDAwMDAwMDAwTCwKICAgQkFaID0gMjAwMDAwMDAwMDAxTCwKIH07Ci0KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgewogW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKExvbmdFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgTG9uZ0VudW06OkZPTzoKQEAgLTI5LDE2ICszMSwxMSBAQAogICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ2NF90Pih2YWwpKTsKICAgfQogfQotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGludGVybmFsIHsKLQogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCiB0ZW1wbGF0ZSA8PgpAQCAtNDgsNyArNDUsNSBAQAogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bTo6QkFaLAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCmluZGV4IDdlYjcyZTkuLmZhMDViMTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCkBAIC03LDEzICs3LDExIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CiBwdWJsaWM6CisgIDo6YW5kcm9pZDo6U3RyaW5nMTYgZmllbGQ7CiAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcmIHJocykgY29uc3QgewogICAgIHJldHVybiBzdGQ6OnRpZShmaWVsZCkgIT0gc3RkOjp0aWUocmhzLmZpZWxkKTsKICAgfQpAQCAtMzMsNyArMzEsNiBAQAogICAgIHJldHVybiBzdGQ6OnRpZShmaWVsZCkgPj0gc3RkOjp0aWUocmhzLmZpZWxkKTsKICAgfQogCi0gIDo6YW5kcm9pZDo6U3RyaW5nMTYgZmllbGQ7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgewpAQCAtNDgsOSArNDUsNiBAQAogICAgIHJldHVybiBvcy5zdHIoKTsKICAgfQogfTsgIC8vIGNsYXNzIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oCmluZGV4IDM5ZTY0YmUuLjdmM2FkZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKQEAgLTE0LDEzICsxNCwzMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIFBhcmNlbGFibGVGb3JUb1N0cmluZyA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgewogcHVibGljOgorICBpbnQzMl90IGludFZhbHVlID0gMDsKKyAgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbnRBcnJheTsKKyAgaW50NjRfdCBsb25nVmFsdWUgPSAwTDsKKyAgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiBsb25nQXJyYXk7CisgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IDAuMDAwMDAwOworICA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4gZG91YmxlQXJyYXk7CisgIGZsb2F0IGZsb2F0VmFsdWUgPSAwLjAwMDAwMGY7CisgIDo6c3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0QXJyYXk7CisgIGludDhfdCBieXRlVmFsdWUgPSAwOworICA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKKyAgYm9vbCBib29sZWFuVmFsdWUgPSBmYWxzZTsKKyAgOjpzdGQ6OnZlY3Rvcjxib29sPiBib29sZWFuQXJyYXk7CisgIDo6YW5kcm9pZDo6U3RyaW5nMTYgc3RyaW5nVmFsdWU7CisgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gc3RyaW5nQXJyYXk7CisgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gc3RyaW5nTGlzdDsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6T3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgcGFyY2VsYWJsZVZhbHVlOworICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Ok90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nPiBwYXJjZWxhYmxlQXJyYXk7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gZW51bVZhbHVlID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6Rk9POworICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+IGVudW1BcnJheTsKKyAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBudWxsQXJyYXk7CisgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gbnVsbExpc3Q7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxpbnQzMl90LCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gcGFyY2VsYWJsZUdlbmVyaWM7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uIHVuaW9uVmFsdWU7CiAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyY2VsYWJsZUZvclRvU3RyaW5nJiByaHMpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjp0aWUoaW50VmFsdWUsIGludEFycmF5LCBsb25nVmFsdWUsIGxvbmdBcnJheSwgZG91YmxlVmFsdWUsIGRvdWJsZUFycmF5LCBmbG9hdFZhbHVlLCBmbG9hdEFycmF5LCBieXRlVmFsdWUsIGJ5dGVBcnJheSwgYm9vbGVhblZhbHVlLCBib29sZWFuQXJyYXksIHN0cmluZ1ZhbHVlLCBzdHJpbmdBcnJheSwgc3RyaW5nTGlzdCwgcGFyY2VsYWJsZVZhbHVlLCBwYXJjZWxhYmxlQXJyYXksIGVudW1WYWx1ZSwgZW51bUFycmF5LCBudWxsQXJyYXksIG51bGxMaXN0LCBwYXJjZWxhYmxlR2VuZXJpYywgdW5pb25WYWx1ZSkgIT0gc3RkOjp0aWUocmhzLmludFZhbHVlLCByaHMuaW50QXJyYXksIHJocy5sb25nVmFsdWUsIHJocy5sb25nQXJyYXksIHJocy5kb3VibGVWYWx1ZSwgcmhzLmRvdWJsZUFycmF5LCByaHMuZmxvYXRWYWx1ZSwgcmhzLmZsb2F0QXJyYXksIHJocy5ieXRlVmFsdWUsIHJocy5ieXRlQXJyYXksIHJocy5ib29sZWFuVmFsdWUsIHJocy5ib29sZWFuQXJyYXksIHJocy5zdHJpbmdWYWx1ZSwgcmhzLnN0cmluZ0FycmF5LCByaHMuc3RyaW5nTGlzdCwgcmhzLnBhcmNlbGFibGVWYWx1ZSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmVudW1WYWx1ZSwgcmhzLmVudW1BcnJheSwgcmhzLm51bGxBcnJheSwgcmhzLm51bGxMaXN0LCByaHMucGFyY2VsYWJsZUdlbmVyaWMsIHJocy51bmlvblZhbHVlKTsKICAgfQpAQCAtNDAsMjkgKzYwLDYgQEAKICAgICByZXR1cm4gc3RkOjp0aWUoaW50VmFsdWUsIGludEFycmF5LCBsb25nVmFsdWUsIGxvbmdBcnJheSwgZG91YmxlVmFsdWUsIGRvdWJsZUFycmF5LCBmbG9hdFZhbHVlLCBmbG9hdEFycmF5LCBieXRlVmFsdWUsIGJ5dGVBcnJheSwgYm9vbGVhblZhbHVlLCBib29sZWFuQXJyYXksIHN0cmluZ1ZhbHVlLCBzdHJpbmdBcnJheSwgc3RyaW5nTGlzdCwgcGFyY2VsYWJsZVZhbHVlLCBwYXJjZWxhYmxlQXJyYXksIGVudW1WYWx1ZSwgZW51bUFycmF5LCBudWxsQXJyYXksIG51bGxMaXN0LCBwYXJjZWxhYmxlR2VuZXJpYywgdW5pb25WYWx1ZSkgPj0gc3RkOjp0aWUocmhzLmludFZhbHVlLCByaHMuaW50QXJyYXksIHJocy5sb25nVmFsdWUsIHJocy5sb25nQXJyYXksIHJocy5kb3VibGVWYWx1ZSwgcmhzLmRvdWJsZUFycmF5LCByaHMuZmxvYXRWYWx1ZSwgcmhzLmZsb2F0QXJyYXksIHJocy5ieXRlVmFsdWUsIHJocy5ieXRlQXJyYXksIHJocy5ib29sZWFuVmFsdWUsIHJocy5ib29sZWFuQXJyYXksIHJocy5zdHJpbmdWYWx1ZSwgcmhzLnN0cmluZ0FycmF5LCByaHMuc3RyaW5nTGlzdCwgcmhzLnBhcmNlbGFibGVWYWx1ZSwgcmhzLnBhcmNlbGFibGVBcnJheSwgcmhzLmVudW1WYWx1ZSwgcmhzLmVudW1BcnJheSwgcmhzLm51bGxBcnJheSwgcmhzLm51bGxMaXN0LCByaHMucGFyY2VsYWJsZUdlbmVyaWMsIHJocy51bmlvblZhbHVlKTsKICAgfQogCi0gIGludDMyX3QgaW50VmFsdWUgPSBpbnQzMl90KDApOwotICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IGludEFycmF5OwotICBpbnQ2NF90IGxvbmdWYWx1ZSA9IGludDY0X3QoMEwpOwotICA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+IGxvbmdBcnJheTsKLSAgZG91YmxlIGRvdWJsZVZhbHVlID0gZG91YmxlKDAuMDAwMDAwKTsKLSAgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+IGRvdWJsZUFycmF5OwotICBmbG9hdCBmbG9hdFZhbHVlID0gZmxvYXQoMC4wMDAwMDBmKTsKLSAgOjpzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRBcnJheTsKLSAgaW50OF90IGJ5dGVWYWx1ZSA9IGludDhfdCgwKTsKLSAgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlQXJyYXk7Ci0gIGJvb2wgYm9vbGVhblZhbHVlID0gYm9vbChmYWxzZSk7Ci0gIDo6c3RkOjp2ZWN0b3I8Ym9vbD4gYm9vbGVhbkFycmF5OwotICA6OmFuZHJvaWQ6OlN0cmluZzE2IHN0cmluZ1ZhbHVlOwotICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IHN0cmluZ0FycmF5OwotICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IHN0cmluZ0xpc3Q7Ci0gIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Ok90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHBhcmNlbGFibGVWYWx1ZTsKLSAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZz4gcGFyY2VsYWJsZUFycmF5OwotICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGVudW1WYWx1ZSA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0oOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bTo6Rk9PKTsKLSAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBlbnVtQXJyYXk7Ci0gIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4gbnVsbEFycmF5OwotICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IG51bGxMaXN0OwotICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU8aW50MzJfdCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUsIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+IHBhcmNlbGFibGVHZW5lcmljOwotICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbiB1bmlvblZhbHVlOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTk5LDkgKzk2LDYgQEAKICAgICByZXR1cm4gb3Muc3RyKCk7CiAgIH0KIH07ICAvLyBjbGFzcyBQYXJjZWxhYmxlRm9yVG9TdHJpbmcKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODc0ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaApAQCAtMCwwICsxLDU1IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBSZWN1cnNpdmVMaXN0IDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGludDMyX3QgdmFsdWUgPSAwOworICA6OnN0ZDo6dW5pcXVlX3B0cjw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0PiBuZXh0OworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgIT0gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPCBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPD0gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpID09IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpID4gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSZWN1cnNpdmVMaXN0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUodmFsdWUsIG5leHQpID49IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0Iik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJSZWN1cnNpdmVMaXN0eyI7CisgICAgb3MgPDwgInZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHZhbHVlKTsKKyAgICBvcyA8PCAiLCBuZXh0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG5leHQpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBSZWN1cnNpdmVMaXN0Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaAppbmRleCBiZmQxZTU4Li4zMzljNTE2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KQEAgLTE3LDM0ICsxOCw0NiBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIGNsYXNzIFN0cnVjdHVyZWRQYXJjZWxhYmxlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CiBwdWJsaWM6Ci0gIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pICE9IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pIDwgc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pIDw9IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA9PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA+IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA+PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KKyAgY2xhc3MgRW1wdHkgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICB9CiAKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlLkVtcHR5Iik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRW1wdHl7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBFbXB0eQogICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IHNob3VsZENvbnRhaW5UaHJlZUZzOwotICBpbnQzMl90IGYgPSBpbnQzMl90KDApOworICBpbnQzMl90IGYgPSAwOwogICA6OnN0ZDo6c3RyaW5nIHNob3VsZEJlSmVycnk7CiAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIHNob3VsZEJlQnl0ZUJhciA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtKDApOwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIHNob3VsZEJlSW50QmFyID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSgwKTsKQEAgLTUyLDM0ICs2NSwzNiBAQAogICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiBzaG91bGRDb250YWluVHdvQnl0ZUZvb3M7CiAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gc2hvdWxkQ29udGFpblR3b0ludEZvb3M7CiAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IHNob3VsZENvbnRhaW5Ud29Mb25nRm9vczsKLSAgOjphbmRyb2lkOjpTdHJpbmcxNiBzdHJpbmdEZWZhdWx0c1RvRm9vID0gOjphbmRyb2lkOjpTdHJpbmcxNig6OmFuZHJvaWQ6OlN0cmluZzE2KCJmb28iKSk7Ci0gIGludDhfdCBieXRlRGVmYXVsdHNUb0ZvdXIgPSBpbnQ4X3QoNCk7Ci0gIGludDMyX3QgaW50RGVmYXVsdHNUb0ZpdmUgPSBpbnQzMl90KDUpOwotICBpbnQ2NF90IGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiA9IGludDY0X3QoLTdMKTsKLSAgYm9vbCBib29sZWFuRGVmYXVsdHNUb1RydWUgPSBib29sKHRydWUpOwotICBjaGFyMTZfdCBjaGFyRGVmYXVsdHNUb0MgPSBjaGFyMTZfdCgnQycpOwotICBmbG9hdCBmbG9hdERlZmF1bHRzVG9QaSA9IGZsb2F0KDMuMTQwMDAwZik7Ci0gIGRvdWJsZSBkb3VibGVXaXRoRGVmYXVsdCA9IGRvdWJsZSgtMzE0MDAwMDAwMDAwMDAwMDAwLjAwMDAwMCk7Ci0gIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4gYXJyYXlEZWZhdWx0c1RvMTIzID0gOjpzdGQ6OnZlY3RvcjxpbnQzMl90Pih7MSwgMiwgM30pOwotICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUb0VtcHR5ID0gOjpzdGQ6OnZlY3RvcjxpbnQzMl90Pih7fSk7Ci0gIGJvb2wgYm9vbERlZmF1bHQgPSBib29sKGZhbHNlKTsKLSAgaW50OF90IGJ5dGVEZWZhdWx0ID0gaW50OF90KDApOwotICBpbnQzMl90IGludERlZmF1bHQgPSBpbnQzMl90KDApOwotICBpbnQ2NF90IGxvbmdEZWZhdWx0ID0gaW50NjRfdCgwTCk7Ci0gIGZsb2F0IGZsb2F0RGVmYXVsdCA9IGZsb2F0KDAuMDAwMDAwZik7Ci0gIGRvdWJsZSBkb3VibGVEZWZhdWx0ID0gZG91YmxlKDAuMDAwMDAwKTsKLSAgZG91YmxlIGNoZWNrRG91YmxlRnJvbUZsb2F0ID0gZG91YmxlKDMuMTQwMDAwKTsKLSAgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiBjaGVja1N0cmluZ0FycmF5MSA9IDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4oezo6YW5kcm9pZDo6U3RyaW5nMTYoImEiKSwgOjphbmRyb2lkOjpTdHJpbmcxNigiYiIpfSk7Ci0gIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTIgPSA6OnN0ZDo6dmVjdG9yPDo6c3RkOjpzdHJpbmc+KHsiYSIsICJiIn0pOwotICBpbnQzMl90IGludDMyX21pbiA9IGludDMyX3QoLTIxNDc0ODM2NDgpOwotICBpbnQzMl90IGludDMyX21heCA9IGludDMyX3QoMjE0NzQ4MzY0Nyk7Ci0gIGludDY0X3QgaW50NjRfbWF4ID0gaW50NjRfdCg5MjIzMzcyMDM2ODU0Nzc1ODA3TCk7Ci0gIGludDMyX3QgaGV4SW50MzJfbmVnXzEgPSBpbnQzMl90KC0xKTsKKyAgOjphbmRyb2lkOjpTdHJpbmcxNiBzdHJpbmdEZWZhdWx0c1RvRm9vID0gOjphbmRyb2lkOjpTdHJpbmcxNigiZm9vIik7CisgIGludDhfdCBieXRlRGVmYXVsdHNUb0ZvdXIgPSA0OworICBpbnQzMl90IGludERlZmF1bHRzVG9GaXZlID0gNTsKKyAgaW50NjRfdCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4gPSAtN0w7CisgIGJvb2wgYm9vbGVhbkRlZmF1bHRzVG9UcnVlID0gdHJ1ZTsKKyAgY2hhcjE2X3QgY2hhckRlZmF1bHRzVG9DID0gJ0MnOworICBmbG9hdCBmbG9hdERlZmF1bHRzVG9QaSA9IDMuMTQwMDAwZjsKKyAgZG91YmxlIGRvdWJsZVdpdGhEZWZhdWx0ID0gLTMxNDAwMDAwMDAwMDAwMDAwMC4wMDAwMDA7CisgIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4gYXJyYXlEZWZhdWx0c1RvMTIzID0gezEsIDIsIDN9OworICA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUb0VtcHR5ID0ge307CisgIGJvb2wgYm9vbERlZmF1bHQgPSBmYWxzZTsKKyAgaW50OF90IGJ5dGVEZWZhdWx0ID0gMDsKKyAgaW50MzJfdCBpbnREZWZhdWx0ID0gMDsKKyAgaW50NjRfdCBsb25nRGVmYXVsdCA9IDBMOworICBmbG9hdCBmbG9hdERlZmF1bHQgPSAwLjAwMDAwMGY7CisgIGRvdWJsZSBkb3VibGVEZWZhdWx0ID0gMC4wMDAwMDA7CisgIGRvdWJsZSBjaGVja0RvdWJsZUZyb21GbG9hdCA9IDMuMTQwMDAwOworICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+IGNoZWNrU3RyaW5nQXJyYXkxID0gezo6YW5kcm9pZDo6U3RyaW5nMTYoImEiKSwgOjphbmRyb2lkOjpTdHJpbmcxNigiYiIpfTsKKyAgOjpzdGQ6OnZlY3Rvcjw6OnN0ZDo6c3RyaW5nPiBjaGVja1N0cmluZ0FycmF5MiA9IHsiYSIsICJiIn07CisgIGludDMyX3QgaW50MzJfbWluID0gLTIxNDc0ODM2NDg7CisgIGludDMyX3QgaW50MzJfbWF4ID0gMjE0NzQ4MzY0NzsKKyAgaW50NjRfdCBpbnQ2NF9tYXggPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TDsKKyAgaW50MzJfdCBoZXhJbnQzMl9uZWdfMSA9IC0xOwogICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4gaWJpbmRlcjsKLSAgOjpzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbnQzMl8xID0gOjpzdGQ6OnZlY3RvcjxpbnQzMl90Pih7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0pOwotICA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+IGludDY0XzEgPSA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KHsxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTH0pOwotICBpbnQzMl90IGhleEludDMyX3Bvc18xID0gaW50MzJfdCgxKTsKLSAgaW50MzJfdCBoZXhJbnQ2NF9wb3NfMSA9IGludDMyX3QoMSk7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlOjpFbXB0eSBlbXB0eTsKKyAgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnQ4XzEgPSB7MSwgMSwgMSwgMSwgMX07CisgIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50MzJfMSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKKyAgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnQ2NF8xID0gezFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMfTsKKyAgaW50MzJfdCBoZXhJbnQzMl9wb3NfMSA9IDE7CisgIGludDMyX3QgaGV4SW50NjRfcG9zXzEgPSAxOwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGNvbnN0X2V4cHJzXzEgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtKDApOwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGNvbnN0X2V4cHJzXzIgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtKDApOwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGNvbnN0X2V4cHJzXzMgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtKDApOwpAQCAtOTAsMTcgKzEwNSwzNCBAQAogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGNvbnN0X2V4cHJzXzggPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtKDApOwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGNvbnN0X2V4cHJzXzkgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtKDApOwogICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpDb25zdGFudEV4cHJlc3Npb25FbnVtIGNvbnN0X2V4cHJzXzEwID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjpzdGQ6OnN0cmluZyBhZGRTdHJpbmcxID0gOjpzdGQ6OnN0cmluZygiaGVsbG8gd29ybGQhIik7Ci0gIDo6c3RkOjpzdHJpbmcgYWRkU3RyaW5nMiA9IDo6c3RkOjpzdHJpbmcoIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuIik7Ci0gIGludDMyX3Qgc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSBpbnQzMl90KDApOworICA6OnN0ZDo6c3RyaW5nIGFkZFN0cmluZzEgPSAiaGVsbG8gd29ybGQhIjsKKyAgOjpzdGQ6OnN0cmluZyBhZGRTdHJpbmcyID0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuIjsKKyAgaW50MzJfdCBzaG91bGRTZXRCaXQwQW5kQml0MiA9IDA7CiAgIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpVbmlvbj4gdTsKICAgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiBzaG91bGRCZUNvbnN0UzE7Ci0gIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gZGVmYXVsdFdpdGhGb28gPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkZPTyk7Ci0gIGVudW0gIDogaW50MzJfdCB7Ci0gICAgQklUMCA9IDEsCi0gICAgQklUMSA9IDIsCi0gICAgQklUMiA9IDQsCi0gIH07CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gZGVmYXVsdFdpdGhGb28gPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT087CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pICE9IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPCBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA8PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA9PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID4gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPj0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKworICBlbnVtIDogaW50MzJfdCB7IEJJVDAgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQklUMSA9IDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBCSVQyID0gNCB9OwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTE0Myw2ICsxNzUsOCBAQAogICAgIG9zIDw8ICIsIGludDY0X21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQ2NF9tYXgpOwogICAgIG9zIDw8ICIsIGhleEludDMyX25lZ18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDMyX25lZ18xKTsKICAgICBvcyA8PCAiLCBpYmluZGVyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGliaW5kZXIpOworICAgIG9zIDw8ICIsIGVtcHR5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGVtcHR5KTsKKyAgICBvcyA8PCAiLCBpbnQ4XzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50OF8xKTsKICAgICBvcyA8PCAiLCBpbnQzMl8xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludDMyXzEpOwogICAgIG9zIDw8ICIsIGludDY0XzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50NjRfMSk7CiAgICAgb3MgPDwgIiwgaGV4SW50MzJfcG9zXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaGV4SW50MzJfcG9zXzEpOwpAQCAtMTY3LDkgKzIwMSw2IEBACiAgICAgcmV0dXJuIG9zLnN0cigpOwogICB9CiB9OyAgLy8gY2xhc3MgU3RydWN0dXJlZFBhcmNlbGFibGUKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oCmluZGV4IDFkZmZhYmIuLjYyYzFiZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oCkBAIC0xOSwzMiArMTksMTAgQEAKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgVW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKLSAgfQotCiAgIGVudW0gVGFnIDogaW50MzJfdCB7CiAgICAgbnMgPSAwLCAgLy8gaW50W10gbnM7CiAgICAgbiwgIC8vIGludCBuOwpAQCAtNTksMTAgKzM3LDYgQEAKICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbj47CiAKICAgVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PG5zPiwgOjpzdGQ6OnZlY3RvcjxpbnQzMl90Pih7fSkpIHsgfQotICBVbmlvbihjb25zdCBVbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb24oVW5pb24mJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KFVuaW9uJiYpID0gZGVmYXVsdDsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCkBAIC0xMDQsNiArNzgsMjUgQEAKICAgICBfdmFsdWUuZW1wbGFjZTxfdGFnPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKKyAgfQorCiAgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTMSgpOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CkBAIC0xMjksOSArMTIyLDYgQEAKIHByaXZhdGU6CiAgIHN0ZDo6dmFyaWFudDw6OnN0ZDo6dmVjdG9yPGludDMyX3Q+LCBpbnQzMl90LCBpbnQzMl90LCA6OnN0ZDo6c3RyaW5nLCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4sIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiBfdmFsdWU7CiB9OyAgLy8gY2xhc3MgVW5pb24KLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCmluZGV4IDdlNDAyMWYuLjM3M2FiYTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCkBAIC0xNiwzMiArMTYsMTAgQEAKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogY2xhc3MgVW5pb25XaXRoRmQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbldpdGhGZCYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVbmlvbldpdGhGZCYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBVbmlvbldpdGhGZCYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb25XaXRoRmQmIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgVW5pb25XaXRoRmQmIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5pb25XaXRoRmQmIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKLSAgfQotCiAgIGVudW0gVGFnIDogaW50MzJfdCB7CiAgICAgbnVtID0gMCwgIC8vIGludCBudW07CiAgICAgcGZkLCAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkOwpAQCAtNTEsMTAgKzI5LDYgQEAKICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBVbmlvbldpdGhGZD47CiAKICAgVW5pb25XaXRoRmQoKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PG51bT4sIGludDMyX3QoMCkpIHsgfQotICBVbmlvbldpdGhGZChjb25zdCBVbmlvbldpdGhGZCYpID0gZGVmYXVsdDsKLSAgVW5pb25XaXRoRmQoVW5pb25XaXRoRmQmJikgPSBkZWZhdWx0OwotICBVbmlvbldpdGhGZCYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uV2l0aEZkJikgPSBkZWZhdWx0OwotICBVbmlvbldpdGhGZCYgb3BlcmF0b3I9KFVuaW9uV2l0aEZkJiYpID0gZGVmYXVsdDsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCkBAIC05Niw2ICs3MCwyNSBAQAogICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CiAgIH0KIAorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVuaW9uV2l0aEZkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlICE9IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFVuaW9uV2l0aEZkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFVuaW9uV2l0aEZkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbmlvbldpdGhGZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA9PSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBVbmlvbldpdGhGZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVbmlvbldpdGhGZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOworICB9CisKICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CkBAIC0xMTUsOSArMTA4LDYgQEAKIHByaXZhdGU6CiAgIHN0ZDo6dmFyaWFudDxpbnQzMl90LCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gX3ZhbHVlOwogfTsgIC8vIGNsYXNzIFVuaW9uV2l0aEZkCi0KIH0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CbkV4dGVuZGFibGVQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CbkV4dGVuZGFibGVQYXJjZWxhYmxlLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHQuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dDIuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0Mi5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0TGlrZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0TGlrZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuTXlFeHRMaWtlLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwRXh0ZW5kYWJsZVBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBFeHRlbmRhYmxlUGFyY2VsYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dC5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0Mi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQyLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHRMaWtlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHRMaWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZjZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBNeUV4dExpa2UuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjcwOWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oCkBAIC0wLDAgKzEsNjMgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlSG9sZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NsYXNzIEV4dGVuZGFibGVQYXJjZWxhYmxlIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIGludDMyX3QgYSA9IDA7CisgIDo6c3RkOjpzdHJpbmcgYjsKKyAgOjphbmRyb2lkOjpvczo6UGFyY2VsYWJsZUhvbGRlciBleHQgeyA6OmFuZHJvaWQ6OlBhcmNlbGFibGU6OlN0YWJpbGl0eTo6U1RBQklMSVRZX0xPQ0FMIH07CisgIGludDY0X3QgYyA9IDBMOworICA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxhYmxlSG9sZGVyIGV4dDIgeyA6OmFuZHJvaWQ6OlBhcmNlbGFibGU6OlN0YWJpbGl0eTo6U1RBQklMSVRZX0xPQ0FMIH07CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRXh0ZW5kYWJsZVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBleHQsIGMsIGV4dDIpICE9IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRXh0ZW5kYWJsZVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBleHQsIGMsIGV4dDIpIDwgc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuZXh0LCByaHMuYywgcmhzLmV4dDIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRXh0ZW5kYWJsZVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBleHQsIGMsIGV4dDIpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA9PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA+IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKworICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZSIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRXh0ZW5kYWJsZVBhcmNlbGFibGV7IjsKKyAgICBvcyA8PCAiYTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhKTsKKyAgICBvcyA8PCAiLCBiOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGIpOworICAgIG9zIDw8ICIsIGV4dDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhleHQpOworICAgIG9zIDw8ICIsIGM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYyk7CisgICAgb3MgPDwgIiwgZXh0MjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhleHQyKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgRXh0ZW5kYWJsZVBhcmNlbGFibGUKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5OTU0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaApAQCAtMCwwICsxLDU2IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBleHRlbnNpb24geworY2xhc3MgTXlFeHQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgaW50MzJfdCBhID0gMDsKKyAgOjpzdGQ6OnN0cmluZyBiOworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgIT0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID09IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPiBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uTXlFeHQiKTsKKyAgICByZXR1cm4gREVTQ0lQVE9SOworICB9CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIk15RXh0eyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgTXlFeHQKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2ZjZDAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaApAQCAtMCwwICsxLDU5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NsYXNzIE15RXh0MiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICBpbnQzMl90IGEgPSAwOworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246Ok15RXh0IGI7CisgIDo6c3RkOjpzdHJpbmcgYzsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgPCBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpID4gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0MiIpOworICAgIHJldHVybiBERVNDSVBUT1I7CisgIH0KKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTXlFeHQyeyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAiLCBjOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGMpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBNeUV4dDIKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMyYmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuaApAQCAtMCwwICsxLDU1IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7CitjbGFzcyBNeUV4dExpa2UgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgaW50MzJfdCBhID0gMDsKKyAgOjphbmRyb2lkOjpTdHJpbmcxNiBiOworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15RXh0TGlrZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpICE9IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15RXh0TGlrZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpIDwgc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15RXh0TGlrZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA9PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA+IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeUV4dExpa2UmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uTXlFeHRMaWtlIik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJNeUV4dExpa2V7IjsKKyAgICBvcyA8PCAiYTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhKTsKKyAgICBvcyA8PCAiLCBiOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGIpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307ICAvLyBjbGFzcyBNeUV4dExpa2UKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuRGVlcGx5TmVzdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuRGVlcGx5TmVzdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5EZWVwbHlOZXN0ZWQuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYm4gY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5OZXN0ZWRTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzhhZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oCkBAIC0wLDAgKzEsMzQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIEJuTmVzdGVkU2VydmljZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElOZXN0ZWRTZXJ2aWNlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZmxpcFN0YXR1cyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZmxpcFN0YXR1c1dpdGhDYWxsYmFjayA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgIGV4cGxpY2l0IEJuTmVzdGVkU2VydmljZSgpOworICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOworfTsgIC8vIGNsYXNzIEJuTmVzdGVkU2VydmljZQorCitjbGFzcyBJTmVzdGVkU2VydmljZURlbGVnYXRvciA6IHB1YmxpYyBCbk5lc3RlZFNlcnZpY2UgeworcHVibGljOgorICBleHBsaWNpdCBJTmVzdGVkU2VydmljZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElOZXN0ZWRTZXJ2aWNlPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZmxpcFN0YXR1cyhjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiBwLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+ZmxpcFN0YXR1cyhwLCBfYWlkbF9yZXR1cm4pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGNiKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKHN0YXR1cywgY2IpOworICB9Citwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElOZXN0ZWRTZXJ2aWNlPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJTmVzdGVkU2VydmljZURlbGVnYXRvcgorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5QYXJjZWxhYmxlV2l0aE5lc3RlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CblBhcmNlbGFibGVXaXRoTmVzdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5QYXJjZWxhYmxlV2l0aE5lc3RlZC5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBwYXJjZWxhYmxlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcERlZXBseU5lc3RlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcERlZXBseU5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwRGVlcGx5TmVzdGVkLmgKQEAgLTAsMCArMSBAQAorI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIHBhcmNlbGFibGVzIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwTmVzdGVkU2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY5YTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaApAQCAtMCwwICsxLDIyIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIEJwTmVzdGVkU2VydmljZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElOZXN0ZWRTZXJ2aWNlPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJwTmVzdGVkU2VydmljZShjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICB2aXJ0dWFsIH5CcE5lc3RlZFNlcnZpY2UoKSA9IGRlZmF1bHQ7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZmxpcFN0YXR1cyhjb25zdCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiBwLCA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGNiKSBvdmVycmlkZTsKK307ICAvLyBjbGFzcyBCcE5lc3RlZFNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBQYXJjZWxhYmxlV2l0aE5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApAQCAtMCwwICsxIEBACisjZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgcGFyY2VsYWJsZXMgZG8gbm90IGhhdmUgYnAgY2xhc3NlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oCkBAIC0wLDAgKzEsMjIzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YmluZGVyL0VudW1zLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBEZWVwbHlOZXN0ZWQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgY2xhc3MgQiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgY2xhc3MgQyA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgIGNsYXNzIEQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBjbGFzcyBFIDogaW50OF90IHsKKyAgICAgICAgICBPSyA9IDAsCisgICAgICAgIH07CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKworICAgICAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgICAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQi5DLkQiKTsKKyAgICAgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgICAgICB9CisgICAgICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgICAgb3MgPDwgIkR7IjsKKyAgICAgICAgICBvcyA8PCAifSI7CisgICAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgICAgICB9CisgICAgICB9OyAgLy8gY2xhc3MgRAorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgICAgfQorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgICB9CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgICB9CisKKyAgICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5CLkMiKTsKKyAgICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICAgIH0KKyAgICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAiQ3siOworICAgICAgICBvcyA8PCAifSI7CisgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgIH0KKyAgICB9OyAgLy8gY2xhc3MgQworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdGF0aWNTdHJpbmcxNiBERVNDSVBUT1IgKHUiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQiIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkJ7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBCCisgIGNsYXNzIEEgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFIGUgPSA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RTo6T0s7CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShlKSAhPSBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShlKSA8IHN0ZDo6dGllKHJocy5lKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShlKSA8PSBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPT0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPiBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPj0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5BIik7CisgICAgICByZXR1cm4gREVTQ0lQVE9SOworICAgIH0KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiQXsiOworICAgICAgb3MgPDwgImU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZSk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OyAgLy8gY2xhc3MgQQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPCBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID4gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICB9CisKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CisgICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RhdGljU3RyaW5nMTYgREVTQ0lQVE9SICh1ImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkIik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJEZWVwbHlOZXN0ZWR7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgRGVlcGx5TmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKERlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIERlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RTo6T0s6CisgICAgcmV0dXJuICJPSyI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFLCAxPiBlbnVtX3ZhbHVlczw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RT4gPSB7CisgIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFOjpPSywKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiNzI2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaApAQCAtMCwwICsxLDExNCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBJTmVzdGVkU2VydmljZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworcHVibGljOgorICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE5lc3RlZFNlcnZpY2UpCisgIGNsYXNzIFJlc3VsdCA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cyA9IDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0s7CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgIT0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPCBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPD0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID09IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID4gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID49IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKKyAgICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLlJlc3VsdCIpOworICAgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgICB9CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIlJlc3VsdHsiOworICAgICAgb3MgPDwgInN0YXR1czogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdGF0dXMpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsgIC8vIGNsYXNzIFJlc3VsdAorICBjbGFzcyBJQ2FsbGJhY2sgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FsbGJhY2spCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGRvbmUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cykgPSAwOworICB9OyAgLy8gY2xhc3MgSUNhbGxiYWNrCisKKyAgY2xhc3MgSUNhbGxiYWNrRGVmYXVsdCA6IHB1YmxpYyBJQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZG9uZSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgLypzdGF0dXMqLykgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgICAgfQorICB9OyAgLy8gY2xhc3MgSUNhbGxiYWNrRGVmYXVsdAorICBjbGFzcyBCcENhbGxiYWNrIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUNhbGxiYWNrPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcENhbGxiYWNrKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBDYWxsYmFjaygpID0gZGVmYXVsdDsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGRvbmUoOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCcENhbGxiYWNrCisgIGNsYXNzIEJuQ2FsbGJhY2sgOiBwdWJsaWMgOjphbmRyb2lkOjpCbkludGVyZmFjZTxJQ2FsbGJhY2s+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZG9uZSA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisgICAgZXhwbGljaXQgQm5DYWxsYmFjaygpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgIH07ICAvLyBjbGFzcyBCbkNhbGxiYWNrCisKKyAgY2xhc3MgSUNhbGxiYWNrRGVsZWdhdG9yIDogcHVibGljIEJuQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSUNhbGxiYWNrRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SUNhbGxiYWNrPiAmaW1wbCkgOiBfYWlkbF9kZWxlZ2F0ZShpbXBsKSB7fQorCisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBkb25lKDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+ZG9uZShzdGF0dXMpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICA6OmFuZHJvaWQ6OnNwPElDYWxsYmFjaz4gX2FpZGxfZGVsZWdhdGU7CisgIH07ICAvLyBjbGFzcyBJQ2FsbGJhY2tEZWxlZ2F0b3IKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXMoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcCwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBjYikgPSAwOworfTsgIC8vIGNsYXNzIElOZXN0ZWRTZXJ2aWNlCisKK2NsYXNzIElOZXN0ZWRTZXJ2aWNlRGVmYXVsdCA6IHB1YmxpYyBJTmVzdGVkU2VydmljZSB7CitwdWJsaWM6CisgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGZsaXBTdGF0dXMoY29uc3QgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCYgLypwKi8sIDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgLypzdGF0dXMqLywgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiAvKmNiKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorfTsgIC8vIGNsYXNzIElOZXN0ZWRTZXJ2aWNlRGVmYXVsdAorfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEzYzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oCkBAIC0wLDAgKzEsOTEgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpbmRlci9FbnVtcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY2xhc3MgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgZW51bSBjbGFzcyBTdGF0dXMgOiBpbnQ4X3QgeworICAgIE9LID0gMCwKKyAgICBOT1RfT0sgPSAxLAorICB9OworICA6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgc3RhdHVzID0gOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSzsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgIT0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA8IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpIDw9IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID09IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPiBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA+PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorCisgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CisgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKKyAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgeworICAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0YXRpY1N0cmluZzE2IERFU0NJUFRPUiAodSJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkIik7CisgICAgcmV0dXJuIERFU0NJUFRPUjsKKyAgfQorICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJQYXJjZWxhYmxlV2l0aE5lc3RlZHsiOworICAgIG9zIDw8ICJzdGF0dXM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RhdHVzKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OyAgLy8gY2xhc3MgUGFyY2VsYWJsZVdpdGhOZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok9LOgorICAgIHJldHVybiAiT0siOworICBjYXNlIFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok5PVF9PSzoKKyAgICByZXR1cm4gIk5PVF9PSyI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cywgMj4gZW51bV92YWx1ZXM8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzPiA9IHsKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSywKKyAgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpOT1RfT0ssCit9OworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQm5Qcm90ZWN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JuUHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzNDBhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JuUHJvdGVjdGVkLmgKQEAgLTAsMCArMSwzOCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBwZXJtaXNzaW9uIHsKK2NsYXNzIEJuUHJvdGVjdGVkIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SVByb3RlY3RlZD4geworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGwgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbnkgPSA6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworICBleHBsaWNpdCBCblByb3RlY3RlZCgpOworICA6OmFuZHJvaWQ6OnN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgX2FpZGxfY29kZSwgY29uc3QgOjphbmRyb2lkOjpQYXJjZWwmIF9haWRsX2RhdGEsIDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9yZXBseSwgdWludDMyX3QgX2FpZGxfZmxhZ3MpIG92ZXJyaWRlOworfTsgIC8vIGNsYXNzIEJuUHJvdGVjdGVkCisKK2NsYXNzIElQcm90ZWN0ZWREZWxlZ2F0b3IgOiBwdWJsaWMgQm5Qcm90ZWN0ZWQgeworcHVibGljOgorICBleHBsaWNpdCBJUHJvdGVjdGVkRGVsZWdhdG9yKDo6YW5kcm9pZDo6c3A8SVByb3RlY3RlZD4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFBlcm1pc3Npb25Qcm90ZWN0ZWQoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9haWRsX2RlbGVnYXRlLT5QZXJtaXNzaW9uUHJvdGVjdGVkKCk7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+TXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgfQorcHJpdmF0ZToKKyAgOjphbmRyb2lkOjpzcDxJUHJvdGVjdGVkPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJUHJvdGVjdGVkRGVsZWdhdG9yCit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JuUHJvdGVjdGVkSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTZhMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZEludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CitjbGFzcyBCblByb3RlY3RlZEludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElQcm90ZWN0ZWRJbnRlcmZhY2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9NZXRob2QxID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9NZXRob2QyID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKKyAgZXhwbGljaXQgQm5Qcm90ZWN0ZWRJbnRlcmZhY2UoKTsKKyAgOjphbmRyb2lkOjpzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IF9haWRsX2NvZGUsIGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsJiBfYWlkbF9kYXRhLCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcmVwbHksIHVpbnQzMl90IF9haWRsX2ZsYWdzKSBvdmVycmlkZTsKK307ICAvLyBjbGFzcyBCblByb3RlY3RlZEludGVyZmFjZQorCitjbGFzcyBJUHJvdGVjdGVkSW50ZXJmYWNlRGVsZWdhdG9yIDogcHVibGljIEJuUHJvdGVjdGVkSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSVByb3RlY3RlZEludGVyZmFjZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElQcm90ZWN0ZWRJbnRlcmZhY2U+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNZXRob2QxKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBfYWlkbF9kZWxlZ2F0ZS0+TWV0aG9kMSgpOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTWV0aG9kMigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPk1ldGhvZDIoKTsKKyAgfQorcHJpdmF0ZToKKyAgOjphbmRyb2lkOjpzcDxJUHJvdGVjdGVkSW50ZXJmYWNlPiBfYWlkbF9kZWxlZ2F0ZTsKK307ICAvLyBjbGFzcyBJUHJvdGVjdGVkSW50ZXJmYWNlRGVsZWdhdG9yCit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JwUHJvdGVjdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODNlZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBwZXJtaXNzaW9uIHsKK2NsYXNzIEJwUHJvdGVjdGVkIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SVByb3RlY3RlZD4geworcHVibGljOgorICBleHBsaWNpdCBCcFByb3RlY3RlZChjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIF9haWRsX2ltcGwpOworICB2aXJ0dWFsIH5CcFByb3RlY3RlZCgpID0gZGVmYXVsdDsKKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBQZXJtaXNzaW9uUHJvdGVjdGVkKCkgb3ZlcnJpZGU7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE11bHRpcGxlUGVybWlzc2lvbnNBbnkoKSBvdmVycmlkZTsKK307ICAvLyBjbGFzcyBCcFByb3RlY3RlZAorfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZEludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdiNTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDIyIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CitjbGFzcyBCcFByb3RlY3RlZEludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElQcm90ZWN0ZWRJbnRlcmZhY2U+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQnBQcm90ZWN0ZWRJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKKyAgdmlydHVhbCB+QnBQcm90ZWN0ZWRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTWV0aG9kMSgpIG92ZXJyaWRlOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE1ldGhvZDIoKSBvdmVycmlkZTsKK307ICAvLyBjbGFzcyBCcFByb3RlY3RlZEludGVyZmFjZQorfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiMDViOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuaApAQCAtMCwwICsxLDM4IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHBlcm1pc3Npb24geworY2xhc3MgSVByb3RlY3RlZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworcHVibGljOgorICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFByb3RlY3RlZCkKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFBlcm1pc3Npb25Qcm90ZWN0ZWQoKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgPSAwOworICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpID0gMDsKK307ICAvLyBjbGFzcyBJUHJvdGVjdGVkCisKK2NsYXNzIElQcm90ZWN0ZWREZWZhdWx0IDogcHVibGljIElQcm90ZWN0ZWQgeworcHVibGljOgorICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBQZXJtaXNzaW9uUHJvdGVjdGVkKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE11bHRpcGxlUGVybWlzc2lvbnNBbnkoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KK307ICAvLyBjbGFzcyBJUHJvdGVjdGVkRGVmYXVsdAorfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhYWNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDM0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHBlcm1pc3Npb24geworY2xhc3MgSVByb3RlY3RlZEludGVyZmFjZSA6IHB1YmxpYyA6OmFuZHJvaWQ6OklJbnRlcmZhY2UgeworcHVibGljOgorICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFByb3RlY3RlZEludGVyZmFjZSkKKyAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE1ldGhvZDEoKSA9IDA7CisgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNZXRob2QyKCkgPSAwOworfTsgIC8vIGNsYXNzIElQcm90ZWN0ZWRJbnRlcmZhY2UKKworY2xhc3MgSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSVByb3RlY3RlZEludGVyZmFjZSB7CitwdWJsaWM6CisgIDo6YW5kcm9pZDo6SUJpbmRlciogb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE1ldGhvZDEoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKDo6YW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTik7CisgIH0KKyAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNZXRob2QyKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCg6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04pOworICB9Cit9OyAgLy8gY2xhc3MgSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHQKK30gIC8vIG5hbWVzcGFjZSBwZXJtaXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmgKaW5kZXggM2RmN2RlMi4uMzQ4ZTM0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5oCkBAIC0xNiwzNCArMTYsMTEgQEAKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIHRlc3RzIHsKLQogbmFtZXNwYWNlIHVuaW9ucyB7Ci0KIGNsYXNzIEVudW1VbmlvbiA6IHB1YmxpYyA6OmFuZHJvaWQ6OlBhcmNlbGFibGUgewogcHVibGljOgotICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOwotICB9Ci0KICAgZW51bSBUYWcgOiBpbnQzMl90IHsKICAgICBpbnRFbnVtID0gMCwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtIGludEVudW07CiAgICAgbG9uZ0VudW0sICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW0gbG9uZ0VudW07CkBAIC01MywxMCArMzAsNiBAQAogICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIEVudW1Vbmlvbj47CiAKICAgRW51bVVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxpbnRFbnVtPiwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSg6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT08pKSB7IH0KLSAgRW51bVVuaW9uKGNvbnN0IEVudW1VbmlvbiYpID0gZGVmYXVsdDsKLSAgRW51bVVuaW9uKEVudW1VbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIEVudW1VbmlvbiYgb3BlcmF0b3I9KGNvbnN0IEVudW1VbmlvbiYpID0gZGVmYXVsdDsKLSAgRW51bVVuaW9uJiBvcGVyYXRvcj0oRW51bVVuaW9uJiYpID0gZGVmYXVsdDsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCkBAIC05OCw2ICs3MSwyNSBAQAogICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CiAgIH0KIAorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlIDw9IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbnVtVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW51bVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVudW1VbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA+PSByaHMuX3ZhbHVlOworICB9CisKICAgOjphbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBmaW5hbDsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IGZpbmFsOwogICBzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZ2V0UGFyY2VsYWJsZURlc2NyaXB0b3IoKSB7CkBAIC0xMTcsMTEgKzEwOSw3IEBACiBwcml2YXRlOgogICBzdGQ6OnZhcmlhbnQ8OjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IF92YWx1ZTsKIH07ICAvLyBjbGFzcyBFbnVtVW5pb24KLQogfSAgLy8gbmFtZXNwYWNlIHVuaW9ucwotCiB9ICAvLyBuYW1lc3BhY2UgdGVzdHMKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5oCmluZGV4IDU5MmNmZTMuLmQ4MzkzNWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaApAQCAtMTYsMzQgKzE2LDExIEBACiAjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSB0ZXN0cyB7Ci0KIG5hbWVzcGFjZSB1bmlvbnMgewotCiBjbGFzcyBVbmlvbkluVW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbkluVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5pb25JblVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFVuaW9uSW5VbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb25JblVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFVuaW9uSW5VbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVbmlvbkluVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKLSAgfQotCiAgIGVudW0gVGFnIDogaW50MzJfdCB7CiAgICAgZmlyc3QgPSAwLCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24gZmlyc3Q7CiAgICAgc2Vjb25kLCAgLy8gaW50IHNlY29uZDsKQEAgLTUzLDEwICszMCw2IEBACiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb25JblVuaW9uPjsKIAogICBVbmlvbkluVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PGZpcnN0PiwgOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb24oKSkgeyB9Ci0gIFVuaW9uSW5Vbmlvbihjb25zdCBVbmlvbkluVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uSW5VbmlvbihVbmlvbkluVW5pb24mJikgPSBkZWZhdWx0OwotICBVbmlvbkluVW5pb24mIG9wZXJhdG9yPShjb25zdCBVbmlvbkluVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uSW5VbmlvbiYgb3BlcmF0b3I9KFVuaW9uSW5VbmlvbiYmKSA9IGRlZmF1bHQ7CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KICAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQpAQCAtOTgsNiArNzEsMjUgQEAKICAgICBfdmFsdWUuZW1wbGFjZTxfdGFnPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOwogICB9CiAKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbkluVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5pb25JblVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFVuaW9uSW5VbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb25JblVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFVuaW9uSW5VbmlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVbmlvbkluVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKKyAgfQorCiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgZmluYWw7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCg6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCBmaW5hbDsKICAgc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGdldFBhcmNlbGFibGVEZXNjcmlwdG9yKCkgewpAQCAtMTE3LDExICsxMDksNyBAQAogcHJpdmF0ZToKICAgc3RkOjp2YXJpYW50PDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uLCBpbnQzMl90PiBfdmFsdWU7CiB9OyAgLy8gY2xhc3MgVW5pb25JblVuaW9uCi0KIH0gIC8vIG5hbWVzcGFjZSB1bmlvbnMKLQogfSAgLy8gbmFtZXNwYWNlIHRlc3RzCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YQpAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworcHVibGljIGNsYXNzIEFycmF5T2ZJbnRlcmZhY2VzIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8QXJyYXlPZkludGVyZmFjZXM+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8QXJyYXlPZkludGVyZmFjZXM+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcnJheU9mSW50ZXJmYWNlcyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgQXJyYXlPZkludGVyZmFjZXMgX2FpZGxfb3V0ID0gbmV3IEFycmF5T2ZJbnRlcmZhY2VzKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcnJheU9mSW50ZXJmYWNlc1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IEFycmF5T2ZJbnRlcmZhY2VzW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgIH0KKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICB9CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICBpbnQgX21hc2sgPSAwOworICAgIHJldHVybiBfbWFzazsKKyAgfQorICBwdWJsaWMgaW50ZXJmYWNlIElFbXB0eUludGVyZmFjZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQorICB7CisgICAgLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElFbXB0eUludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGludGVyZmFjZSwKKyAgICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKWlpbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZQorICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRBcnJheU9mSW50ZXJmYWNlcyRJRW1wdHlJbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICB9CisgIHB1YmxpYyBpbnRlcmZhY2UgSU15SW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCisgIHsKKyAgICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSU15SW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBtZXRob2RXaXRoSW50ZXJmYWNlcyhhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGlmYWNlLCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlLCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXlfaW4sIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbm91dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5X2luLCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZQorICAgIHsKKyAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHN0dWIgYXQgYXR0YWNoIGl0IHRvIHRoZSBpbnRlcmZhY2UuICovCisgICAgICBwdWJsaWMgU3R1YigpCisgICAgICB7CisgICAgICAgIHRoaXMuYXR0YWNoSW50ZXJmYWNlKHRoaXMsIERFU0NSSVBUT1IpOworICAgICAgfQorICAgICAgLyoqCisgICAgICAgKiBDYXN0IGFuIElCaW5kZXIgb2JqZWN0IGludG8gYW4gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICAgIHsKKyAgICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSkpKSB7CisgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSlpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZS5TdHViLlByb3h5KG9iaik7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgICAgeworICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlczoKKyAgICAgICAgICB7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuYXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBfYXJnMjsKKyAgICAgICAgICAgIF9hcmcyID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX2FyZzM7CisgICAgICAgICAgICBpbnQgX2FyZzNfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAoX2FyZzNfbGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICBfYXJnMyA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBfYXJnMyA9IG5ldyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW19hcmczX2xlbmd0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX2FyZzQ7CisgICAgICAgICAgICBfYXJnNCA9IGRhdGEuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF9hcmc1OworICAgICAgICAgICAgX2FyZzUgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBfYXJnNjsKKyAgICAgICAgICAgIGludCBfYXJnNl9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChfYXJnNl9sZW5ndGggPCAwKSB7CisgICAgICAgICAgICAgIF9hcmc2ID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIF9hcmc2ID0gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbX2FyZzZfbGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBfYXJnNzsKKyAgICAgICAgICAgIF9hcmc3ID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF9yZXN1bHQgPSB0aGlzLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmcwLCBfYXJnMSwgX2FyZzIsIF9hcmczLCBfYXJnNCwgX2FyZzUsIF9hcmc2LCBfYXJnNyk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUFycmF5KF9yZXN1bHQpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VBcnJheShfYXJnMyk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUFycmF5KF9hcmc0KTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlQXJyYXkoX2FyZzYpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VBcnJheShfYXJnNyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZQorICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbiwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKGlmYWNlKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlQXJyYXkoaWZhY2VfYXJyYXlfaW4pOworICAgICAgICAgICAgaWYgKChpZmFjZV9hcnJheV9vdXQ9PW51bGwpKSB7CisgICAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBfZGF0YS53cml0ZUludChpZmFjZV9hcnJheV9vdXQubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlQXJyYXkoaWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VBcnJheShudWxsYWJsZV9pZmFjZV9hcnJheV9pbik7CisgICAgICAgICAgICBpZiAoKG51bGxhYmxlX2lmYWNlX2FycmF5X291dD09bnVsbCkpIHsKKyAgICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KG51bGxhYmxlX2lmYWNlX2FycmF5X291dC5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VBcnJheShudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fbWV0aG9kV2l0aEludGVyZmFjZXMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VBcnJheShpZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VBcnJheShpZmFjZV9hcnJheV9pbm91dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEludGVyZmFjZUFycmF5KG51bGxhYmxlX2lmYWNlX2FycmF5X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEludGVyZmFjZUFycmF5KG51bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlcyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkQXJyYXlPZkludGVyZmFjZXMkSU15SW50ZXJmYWNlIi5yZXBsYWNlKCckJywgJy4nKTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheV9pbiwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBudWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlQYXJjZWxhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCisgIHsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIGlmYWNlX2FycmF5OworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeVBhcmNlbGFibGU+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlQYXJjZWxhYmxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15UGFyY2VsYWJsZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBNeVBhcmNlbGFibGUgX2FpZGxfb3V0ID0gbmV3IE15UGFyY2VsYWJsZSgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15UGFyY2VsYWJsZVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlQYXJjZWxhYmxlW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nSW50ZXJmYWNlKGlmYWNlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShudWxsYWJsZV9pZmFjZSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VBcnJheShpZmFjZV9hcnJheSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VBcnJheShudWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGlmYWNlID0gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9pZmFjZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgaWZhY2VfYXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdOjpuZXcsIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9pZmFjZV9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyIF9haWRsX3NqID0gbmV3IGphdmEudXRpbC5TdHJpbmdKb2luZXIoIiwgIiwgInsiLCAifSIpOworICAgICAgX2FpZGxfc2ouYWRkKCJpZmFjZTogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhpZmFjZSkpKTsKKyAgICAgIF9haWRsX3NqLmFkZCgibnVsbGFibGVfaWZhY2U6ICIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcobnVsbGFibGVfaWZhY2UpKSk7CisgICAgICBfYWlkbF9zai5hZGQoImlmYWNlX2FycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoaWZhY2VfYXJyYXkpKSk7CisgICAgICBfYWlkbF9zai5hZGQoIm51bGxhYmxlX2lmYWNlX2FycmF5OiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcobnVsbGFibGVfaWZhY2VfYXJyYXkpKSk7CisgICAgICByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVBhcmNlbGFibGUiICsgX2FpZGxfc2oudG9TdHJpbmcoKSAgOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBNeVBhcmNlbGFibGUpKSByZXR1cm4gZmFsc2U7CisgICAgICBNeVBhcmNlbGFibGUgdGhhdCA9IChNeVBhcmNlbGFibGUpb3RoZXI7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaWZhY2UsIHRoYXQuaWZhY2UpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMobnVsbGFibGVfaWZhY2UsIHRoYXQubnVsbGFibGVfaWZhY2UpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaWZhY2VfYXJyYXksIHRoYXQuaWZhY2VfYXJyYXkpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMobnVsbGFibGVfaWZhY2VfYXJyYXksIHRoYXQubnVsbGFibGVfaWZhY2VfYXJyYXkpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KS50b0FycmF5KCkpOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgfQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE15VW5pb24gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgeworICAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGlmYWNlID0gMDsgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVsbGFibGVfaWZhY2UgPSAxOyAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpZmFjZV9hcnJheSA9IDI7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXk7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnVsbGFibGVfaWZhY2VfYXJyYXkgPSAzOyAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5OworCisgICAgcHJpdmF0ZSBpbnQgX3RhZzsKKyAgICBwcml2YXRlIE9iamVjdCBfdmFsdWU7CisKKyAgICBwdWJsaWMgTXlVbmlvbigpIHsKKyAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX3ZhbHVlID0gbnVsbDsKKyAgICAgIHRoaXMuX3RhZyA9IGlmYWNlOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBNeVVuaW9uKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgcmVhZEZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE15VW5pb24oaW50IF90YWcsIE9iamVjdCBfdmFsdWUpIHsKKyAgICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRhZygpIHsKKyAgICAgIHJldHVybiBfdGFnOworICAgIH0KKworICAgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gaWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgTXlVbmlvbihpZmFjZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBnZXRJZmFjZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoaWZhY2UpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfdmFsdWUpIHsKKyAgICAgIF9zZXQoaWZhY2UsIF92YWx1ZSk7CisgICAgfQorCisgICAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKworICAgIHB1YmxpYyBzdGF0aWMgTXlVbmlvbiBudWxsYWJsZV9pZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKG51bGxhYmxlX2lmYWNlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGdldE51bGxhYmxlX2lmYWNlKCkgeworICAgICAgX2Fzc2VydFRhZyhudWxsYWJsZV9pZmFjZSk7CisgICAgICByZXR1cm4gKGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UpIF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdWxsYWJsZV9pZmFjZShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgX3NldChudWxsYWJsZV9pZmFjZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gaWZhY2VfYXJyYXk7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gaWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKGlmYWNlX2FycmF5LCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gZ2V0SWZhY2VfYXJyYXkoKSB7CisgICAgICBfYXNzZXJ0VGFnKGlmYWNlX2FycmF5KTsKKyAgICAgIHJldHVybiAoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgX3NldChpZmFjZV9hcnJheSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gbnVsbGFibGVfaWZhY2VfYXJyYXk7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gbnVsbGFibGVfaWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKG51bGxhYmxlX2lmYWNlX2FycmF5LCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gZ2V0TnVsbGFibGVfaWZhY2VfYXJyYXkoKSB7CisgICAgICBfYXNzZXJ0VGFnKG51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICAgIHJldHVybiAoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbGFibGVfaWZhY2VfYXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF92YWx1ZSkgeworICAgICAgX3NldChudWxsYWJsZV9pZmFjZV9hcnJheSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15VW5pb24+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlVbmlvbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNeVVuaW9uIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlVbmlvbihfYWlkbF9zb3VyY2UpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTXlVbmlvbltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlVbmlvbltfYWlkbF9zaXplXTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKSB7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX3RhZyk7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgaWZhY2U6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShnZXRJZmFjZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJvbmdJbnRlcmZhY2UoZ2V0TnVsbGFibGVfaWZhY2UoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9hcnJheToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50ZXJmYWNlQXJyYXkoZ2V0SWZhY2VfYXJyYXkoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50ZXJmYWNlQXJyYXkoZ2V0TnVsbGFibGVfaWZhY2VfYXJyYXkoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgaW50IF9haWRsX3RhZzsKKyAgICAgIF9haWRsX3RhZyA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBzd2l0Y2ggKF9haWRsX3RhZykgeworICAgICAgY2FzZSBpZmFjZTogeworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOiB7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgaWZhY2VfYXJyYXk6IHsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogeworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlW10gX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmlvbjogdW5rbm93biB0YWc6ICIgKyBfYWlkbF90YWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CisgICAgICB9CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHN3aXRjaCAoX3RhZykgeworICAgICAgY2FzZSBpZmFjZTogcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuTXlVbmlvbi5pZmFjZSgiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGdldElmYWNlKCkpKSArICIpIjsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLk15VW5pb24ubnVsbGFibGVfaWZhY2UoIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhnZXROdWxsYWJsZV9pZmFjZSgpKSkgKyAiKSI7CisgICAgICBjYXNlIGlmYWNlX2FycmF5OiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uLmlmYWNlX2FycmF5KCIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhnZXRJZmFjZV9hcnJheSgpKSkgKyAiKSI7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlX2FycmF5OiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uLm51bGxhYmxlX2lmYWNlX2FycmF5KCIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhnZXROdWxsYWJsZV9pZmFjZV9hcnJheSgpKSkgKyAiKSI7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIE15VW5pb24pKSByZXR1cm4gZmFsc2U7CisgICAgICBNeVVuaW9uIHRoYXQgPSAoTXlVbmlvbilvdGhlcjsKKyAgICAgIGlmIChfdGFnICE9IHRoYXQuX3RhZykgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKF92YWx1ZSwgdGhhdC5fdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KF90YWcsIF92YWx1ZSkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2Fzc2VydFRhZyhpbnQgdGFnKSB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gdGFnKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJhZCBhY2Nlc3M6ICIgKyBfdGFnU3RyaW5nKHRhZykgKyAiLCAiICsgX3RhZ1N0cmluZyhnZXRUYWcoKSkgKyAiIGlzIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBfdGFnU3RyaW5nKGludCBfdGFnKSB7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgaWZhY2U6IHJldHVybiAiaWZhY2UiOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogcmV0dXJuICJudWxsYWJsZV9pZmFjZSI7CisgICAgICBjYXNlIGlmYWNlX2FycmF5OiByZXR1cm4gImlmYWNlX2FycmF5IjsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IHJldHVybiAibnVsbGFibGVfaWZhY2VfYXJyYXkiOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBmaWVsZDogIiArIF90YWcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfc2V0KGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgICB0aGlzLl90YWcgPSBfdGFnOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwNWZiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmphdmEuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5qYXZhCmluZGV4IDBmNWEzZWEuLjQyZmUxZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uamF2YQpAQCAtMiw5ICsyLDcgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOwotLyoqCi0gKiBIZWxsbywgd29ybGQhCi0gKi8KKy8qKiBIZWxsbywgd29ybGQhICovCiBwdWJsaWMgQGludGVyZmFjZSBCeXRlRW51bSB7CiAgIC8vIENvbW1lbnQgYWJvdXQgRk9PLgogICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRk9PID0gMTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5qYXZhCmluZGV4IGYxNDQ0YmEuLmNiMTczNjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgdHJ5IHsKLSAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm47CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CiAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0Y2EzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CitwdWJsaWMgY2xhc3MgRml4ZWRTaXplIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rml4ZWRTaXplPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEZpeGVkU2l6ZT4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpeGVkU2l6ZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgRml4ZWRTaXplIF9haWRsX291dCA9IG5ldyBGaXhlZFNpemUoKTsKKyAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpeGVkU2l6ZVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZVtfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGaXhlZFBhcmNlbGFibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgeworICAgIHB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSA9IGZhbHNlOworICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSA9IDA7CisgICAgcHVibGljIGNoYXIgY2hhclZhbHVlID0gJ1wwJzsKKyAgICBwdWJsaWMgaW50IGludFZhbHVlID0gMDsKKyAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUgPSAwTDsKKyAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSA9IDAuMDAwMDAwZjsKKyAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlID0gMC4wMDAwMDA7CisgICAgcHVibGljIGxvbmcgZW51bVZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLkxvbmdFbnVtLkZPTzsKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLkZpeGVkU2l6ZS5GaXhlZFVuaW9uIHBhcmNlbGFibGVWYWx1ZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEZpeGVkUGFyY2VsYWJsZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGaXhlZFBhcmNlbGFibGU+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgRml4ZWRQYXJjZWxhYmxlIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIEZpeGVkUGFyY2VsYWJsZSBfYWlkbF9vdXQgPSBuZXcgRml4ZWRQYXJjZWxhYmxlKCk7CisgICAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgRml4ZWRQYXJjZWxhYmxlW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFBhcmNlbGFibGVbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCb29sZWFuKGJvb2xlYW5WYWx1ZSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCeXRlKGJ5dGVWYWx1ZSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoKChpbnQpY2hhclZhbHVlKSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoaW50VmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZyhsb25nVmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlRmxvYXQoZmxvYXRWYWx1ZSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVEb3VibGUoZG91YmxlVmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZyhlbnVtVmFsdWUpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QocGFyY2VsYWJsZVZhbHVlLCAwKTsKKyAgICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgYm9vbGVhblZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRCb29sZWFuKCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGJ5dGVWYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkQnl0ZSgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBjaGFyVmFsdWUgPSAoY2hhcilfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBpbnRWYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGxvbmdWYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkTG9uZygpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBmbG9hdFZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRGbG9hdCgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBkb3VibGVWYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkRG91YmxlKCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGVudW1WYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkTG9uZygpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBwYXJjZWxhYmxlVmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRVbmlvbi5DUkVBVE9SKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMocGFyY2VsYWJsZVZhbHVlKTsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgICAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICAgIGlmIChfdiA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgIGlmIChfdiBpbnN0YW5jZW9mIGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLm9zLlBhcmNlbGFibGUpIF92KS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaXhlZFVuaW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKKyAgICAvLyB0YWdzIGZvciB1bmlvbiBmaWVsZHMKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBib29sZWFuVmFsdWUgPSAwOyAgLy8gYm9vbGVhbiBib29sZWFuVmFsdWU7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgYnl0ZVZhbHVlID0gMTsgIC8vIGJ5dGUgYnl0ZVZhbHVlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGNoYXJWYWx1ZSA9IDI7ICAvLyBjaGFyIGNoYXJWYWx1ZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpbnRWYWx1ZSA9IDM7ICAvLyBpbnQgaW50VmFsdWU7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbG9uZ1ZhbHVlID0gNDsgIC8vIGxvbmcgbG9uZ1ZhbHVlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGZsb2F0VmFsdWUgPSA1OyAgLy8gZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBkb3VibGVWYWx1ZSA9IDY7ICAvLyBkb3VibGUgZG91YmxlVmFsdWU7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgZW51bVZhbHVlID0gNzsgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5Mb25nRW51bSBlbnVtVmFsdWU7CisKKyAgICBwcml2YXRlIGludCBfdGFnOworICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKKworICAgIHB1YmxpYyBGaXhlZFVuaW9uKCkgeworICAgICAgYm9vbGVhbiBfdmFsdWUgPSBmYWxzZTsKKyAgICAgIHRoaXMuX3RhZyA9IGJvb2xlYW5WYWx1ZTsKKyAgICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgRml4ZWRVbmlvbihhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpIHsKKyAgICAgIHJlYWRGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaXhlZFVuaW9uKGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgICB0aGlzLl90YWcgPSBfdGFnOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUYWcoKSB7CisgICAgICByZXR1cm4gX3RhZzsKKyAgICB9CisKKyAgICAvLyBib29sZWFuIGJvb2xlYW5WYWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRVbmlvbiBib29sZWFuVmFsdWUoYm9vbGVhbiBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihib29sZWFuVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhib29sZWFuVmFsdWUpOworICAgICAgcmV0dXJuIChib29sZWFuKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gX3ZhbHVlKSB7CisgICAgICBfc2V0KGJvb2xlYW5WYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBieXRlIGJ5dGVWYWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRVbmlvbiBieXRlVmFsdWUoYnl0ZSBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihieXRlVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhieXRlVmFsdWUpOworICAgICAgcmV0dXJuIChieXRlKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgX3ZhbHVlKSB7CisgICAgICBfc2V0KGJ5dGVWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBjaGFyIGNoYXJWYWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRVbmlvbiBjaGFyVmFsdWUoY2hhciBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihjaGFyVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgZ2V0Q2hhclZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhjaGFyVmFsdWUpOworICAgICAgcmV0dXJuIChjaGFyKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hhclZhbHVlKGNoYXIgX3ZhbHVlKSB7CisgICAgICBfc2V0KGNoYXJWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBpbnQgaW50VmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpeGVkVW5pb24gaW50VmFsdWUoaW50IF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBGaXhlZFVuaW9uKGludFZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW50VmFsdWUoKSB7CisgICAgICBfYXNzZXJ0VGFnKGludFZhbHVlKTsKKyAgICAgIHJldHVybiAoaW50KSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50VmFsdWUoaW50IF92YWx1ZSkgeworICAgICAgX3NldChpbnRWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBsb25nIGxvbmdWYWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRVbmlvbiBsb25nVmFsdWUobG9uZyBfdmFsdWUpIHsKKyAgICAgIHJldHVybiBuZXcgRml4ZWRVbmlvbihsb25nVmFsdWUsIF92YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKCkgeworICAgICAgX2Fzc2VydFRhZyhsb25nVmFsdWUpOworICAgICAgcmV0dXJuIChsb25nKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgX3ZhbHVlKSB7CisgICAgICBfc2V0KGxvbmdWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBmbG9hdCBmbG9hdFZhbHVlOworCisgICAgcHVibGljIHN0YXRpYyBGaXhlZFVuaW9uIGZsb2F0VmFsdWUoZmxvYXQgX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IEZpeGVkVW5pb24oZmxvYXRWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpIHsKKyAgICAgIF9hc3NlcnRUYWcoZmxvYXRWYWx1ZSk7CisgICAgICByZXR1cm4gKGZsb2F0KSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZShmbG9hdCBfdmFsdWUpIHsKKyAgICAgIF9zZXQoZmxvYXRWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBkb3VibGUgZG91YmxlVmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpeGVkVW5pb24gZG91YmxlVmFsdWUoZG91YmxlIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBGaXhlZFVuaW9uKGRvdWJsZVZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKSB7CisgICAgICBfYXNzZXJ0VGFnKGRvdWJsZVZhbHVlKTsKKyAgICAgIHJldHVybiAoZG91YmxlKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIF92YWx1ZSkgeworICAgICAgX3NldChkb3VibGVWYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW0gZW51bVZhbHVlOworCisgICAgcHVibGljIHN0YXRpYyBGaXhlZFVuaW9uIGVudW1WYWx1ZShsb25nIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBGaXhlZFVuaW9uKGVudW1WYWx1ZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRFbnVtVmFsdWUoKSB7CisgICAgICBfYXNzZXJ0VGFnKGVudW1WYWx1ZSk7CisgICAgICByZXR1cm4gKGxvbmcpIF92YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbnVtVmFsdWUobG9uZyBfdmFsdWUpIHsKKyAgICAgIF9zZXQoZW51bVZhbHVlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rml4ZWRVbmlvbj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGaXhlZFVuaW9uPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEZpeGVkVW5pb24gY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFVuaW9uKF9haWRsX3NvdXJjZSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBGaXhlZFVuaW9uW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFVuaW9uW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpIHsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfdGFnKTsKKyAgICAgIHN3aXRjaCAoX3RhZykgeworICAgICAgY2FzZSBib29sZWFuVmFsdWU6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUJvb2xlYW4oZ2V0Qm9vbGVhblZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYnl0ZVZhbHVlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCeXRlKGdldEJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGNoYXJWYWx1ZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KCgoaW50KWdldENoYXJWYWx1ZSgpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpbnRWYWx1ZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGdldEludFZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbG9uZ1ZhbHVlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGdldExvbmdWYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGZsb2F0VmFsdWU6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUZsb2F0KGdldEZsb2F0VmFsdWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBkb3VibGVWYWx1ZToKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlRG91YmxlKGdldERvdWJsZVZhbHVlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZW51bVZhbHVlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGdldEVudW1WYWx1ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKSB7CisgICAgICBpbnQgX2FpZGxfdGFnOworICAgICAgX2FpZGxfdGFnID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CisgICAgICBjYXNlIGJvb2xlYW5WYWx1ZTogeworICAgICAgICBib29sZWFuIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkQm9vbGVhbigpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgYnl0ZVZhbHVlOiB7CisgICAgICAgIGJ5dGUgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRCeXRlKCk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBjaGFyVmFsdWU6IHsKKyAgICAgICAgY2hhciBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSAoY2hhcilfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgaW50VmFsdWU6IHsKKyAgICAgICAgaW50IF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBsb25nVmFsdWU6IHsKKyAgICAgICAgbG9uZyBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZExvbmcoKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICBjYXNlIGZsb2F0VmFsdWU6IHsKKyAgICAgICAgZmxvYXQgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRGbG9hdCgpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgZG91YmxlVmFsdWU6IHsKKyAgICAgICAgZG91YmxlIF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkRG91YmxlKCk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBlbnVtVmFsdWU6IHsKKyAgICAgICAgbG9uZyBfYWlkbF92YWx1ZTsKKyAgICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZExvbmcoKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmlvbjogdW5rbm93biB0YWc6ICIgKyBfYWlkbF90YWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CisgICAgICB9CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9hc3NlcnRUYWcoaW50IHRhZykgeworICAgICAgaWYgKGdldFRhZygpICE9IHRhZykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYWQgYWNjZXNzOiAiICsgX3RhZ1N0cmluZyh0YWcpICsgIiwgIiArIF90YWdTdHJpbmcoZ2V0VGFnKCkpICsgIiBpcyBhdmFpbGFibGUuIik7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhZ1N0cmluZyhpbnQgX3RhZykgeworICAgICAgc3dpdGNoIChfdGFnKSB7CisgICAgICBjYXNlIGJvb2xlYW5WYWx1ZTogcmV0dXJuICJib29sZWFuVmFsdWUiOworICAgICAgY2FzZSBieXRlVmFsdWU6IHJldHVybiAiYnl0ZVZhbHVlIjsKKyAgICAgIGNhc2UgY2hhclZhbHVlOiByZXR1cm4gImNoYXJWYWx1ZSI7CisgICAgICBjYXNlIGludFZhbHVlOiByZXR1cm4gImludFZhbHVlIjsKKyAgICAgIGNhc2UgbG9uZ1ZhbHVlOiByZXR1cm4gImxvbmdWYWx1ZSI7CisgICAgICBjYXNlIGZsb2F0VmFsdWU6IHJldHVybiAiZmxvYXRWYWx1ZSI7CisgICAgICBjYXNlIGRvdWJsZVZhbHVlOiByZXR1cm4gImRvdWJsZVZhbHVlIjsKKyAgICAgIGNhc2UgZW51bVZhbHVlOiByZXR1cm4gImVudW1WYWx1ZSI7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGZpZWxkOiAiICsgX3RhZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9zZXQoaW50IF90YWcsIE9iamVjdCBfdmFsdWUpIHsKKyAgICAgIHRoaXMuX3RhZyA9IF90YWc7CisgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjA5MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuamF2YS5kCkBAIC0wLDAgKzEsMyBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmphdmEKaW5kZXggOTRiNmEyZS4uZWU5Mzk1NiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOwogICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgIHRyeSB7Ci0gICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuOworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGEgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5qYXZhCmluZGV4IDAyOTBjN2EuLjA5NTc4ZjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuamF2YQpAQCAtNzUsMjMgKzc1LDYgQEAKICAgICAgIHsKICAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CiAgICAgICB9Ci0gICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JRGVwcmVjYXRlZCBzRGVmYXVsdEltcGw7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0SW1wbChhbmRyb2lkLmFpZGwudGVzdHMuSURlcHJlY2F0ZWQgaW1wbCkgewotICAgICAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KLSAgICAgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAotICAgICAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KLSAgICAgIGlmIChTdHViLlByb3h5LnNEZWZhdWx0SW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldERlZmF1bHRJbXBsKCkgY2FsbGVkIHR3aWNlIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsID0gaW1wbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklEZXByZWNhdGVkIGdldERlZmF1bHRJbXBsKCkgewotICAgICAgcmV0dXJuIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsOwogICAgIH0KICAgfQogICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkSURlcHJlY2F0ZWQiLnJlcGxhY2UoJyQnLCAnLicpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmphdmEKaW5kZXggNjBkZGM3YS4uMzUwMDI3MSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5qYXZhCkBAIC00Niw2ICs0Niw5IEBACiAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgfQogICAgICAgc3dpdGNoIChjb2RlKQogICAgICAgewogICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKQEAgLTU4LDE3ICs2MSwxNyBAQAogICAgICAgewogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0dldE5hbWU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0ID0gdGhpcy5HZXROYW1lKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sKICAgICB7CkBAIC04NywxNyArOTAsMTIgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBHZXROYW1lKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOwogICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CiAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX0dldE5hbWUsIF9kYXRhLCBfcmVwbHksIDApOwotICAgICAgICAgIGlmICghX3N0YXR1cykgewotICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5HZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQogICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIH0KQEAgLTEwNywyNSArMTA1LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gX3Jlc3VsdDsKICAgICAgIH0KLSAgICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIHNEZWZhdWx0SW1wbDsKICAgICB9CiAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXROYW1lID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRJbXBsKGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBpbXBsKSB7Ci0gICAgICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgotICAgICAgLy8gYXQgYSB0aW1lLiBUaGlzIGlzIGEgaGV1cmlzdGljIHRvIGRldGVjdCBpZiB0d28gZGlmZmVyZW50Ci0gICAgICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgotICAgICAgaWYgKFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsICE9IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RGVmYXVsdEltcGwoKSBjYWxsZWQgdHdpY2UiKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbXBsICE9IG51bGwpIHsKLSAgICAgICAgU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgPSBpbXBsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgZ2V0RGVmYXVsdEltcGwoKSB7Ci0gICAgICByZXR1cm4gU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGw7Ci0gICAgfQogICB9CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRJTmFtZWRDYWxsYmFjayIucmVwbGFjZSgnJCcsICcuJyk7CiAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIEdldE5hbWUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuamF2YQppbmRleCA4OTNlNDNmLi4yNjVmOGVmIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmphdmEKQEAgLTQ2LDYgKzQ2LDkgQEAKICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CiAgICAgICBzd2l0Y2ggKGNvZGUpCiAgICAgICB7CiAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgpAQCAtNTgsMTcgKzYxLDE3IEBACiAgICAgICB7CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVhbE5hbWU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0ID0gdGhpcy5SZWFsTmFtZSgpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lCiAgICAgewpAQCAtODcsMTcgKzkwLDEyIEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVhbE5hbWUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CiAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVhbE5hbWUsIF9kYXRhLCBfcmVwbHksIDApOwotICAgICAgICAgIGlmICghX3N0YXR1cykgewotICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5SZWFsTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOwogICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZFN0cmluZygpOwogICAgICAgICB9CkBAIC0xMDcsMjUgKzEwNSw4IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICAgICB9Ci0gICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmV3TmFtZSBzRGVmYXVsdEltcGw7CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVhbE5hbWUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdEltcGwoYW5kcm9pZC5haWRsLnRlc3RzLklOZXdOYW1lIGltcGwpIHsKLSAgICAgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCi0gICAgICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKLSAgICAgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uCi0gICAgICBpZiAoU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgIT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXREZWZhdWx0SW1wbCgpIGNhbGxlZCB0d2ljZSIpOwotICAgICAgfQotICAgICAgaWYgKGltcGwgIT0gbnVsbCkgewotICAgICAgICBTdHViLlByb3h5LnNEZWZhdWx0SW1wbCA9IGltcGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmV3TmFtZSBnZXREZWZhdWx0SW1wbCgpIHsKLSAgICAgIHJldHVybiBTdHViLlByb3h5LnNEZWZhdWx0SW1wbDsKLSAgICB9CiAgIH0KICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJElPbGROYW1lIi5yZXBsYWNlKCckJywgJy4nKTsKICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVhbE5hbWUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuamF2YQppbmRleCBjNTIzODdjLi43MDEzZmNlIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmphdmEKQEAgLTQ2LDYgKzQ2LDkgQEAKICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CiAgICAgICBzd2l0Y2ggKGNvZGUpCiAgICAgICB7CiAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgpAQCAtNTgsMTcgKzYxLDE3IEBACiAgICAgICB7CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVhbE5hbWU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0ID0gdGhpcy5SZWFsTmFtZSgpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lCiAgICAgewpAQCAtODcsMTcgKzkwLDEyIEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVhbE5hbWUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CiAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVhbE5hbWUsIF9kYXRhLCBfcmVwbHksIDApOwotICAgICAgICAgIGlmICghX3N0YXR1cykgewotICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5SZWFsTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOwogICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZFN0cmluZygpOwogICAgICAgICB9CkBAIC0xMDcsMjUgKzEwNSw4IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICAgICB9Ci0gICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBzRGVmYXVsdEltcGw7CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVhbE5hbWUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdEltcGwoYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIGltcGwpIHsKLSAgICAgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCi0gICAgICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKLSAgICAgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uCi0gICAgICBpZiAoU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgIT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXREZWZhdWx0SW1wbCgpIGNhbGxlZCB0d2ljZSIpOwotICAgICAgfQotICAgICAgaWYgKGltcGwgIT0gbnVsbCkgewotICAgICAgICBTdHViLlByb3h5LnNEZWZhdWx0SW1wbCA9IGltcGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBnZXREZWZhdWx0SW1wbCgpIHsKLSAgICAgIHJldHVybiBTdHViLlByb3h5LnNEZWZhdWx0SW1wbDsKLSAgICB9CiAgIH0KICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJElPbGROYW1lIi5yZXBsYWNlKCckJywgJy4nKTsKICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVhbE5hbWUoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhCmluZGV4IDRkNmY5ZmQuLjUwZDY1YTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhCkBAIC0yLDYgKzIsNyBAQAogICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KICAqLwogcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisvKiogaW50ZXJmYWNlIGNvbW1lbnQgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVRlc3RTZXJ2aWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCiB7CiAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJVGVzdFNlcnZpY2UuICovCkBAIC0yMyw5ICsyNCw5IEBACiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjawotICAgICAgICAgKiAgICAgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMKLSAgICAgICAgICovCisgICAgICogQGRlcHJlY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrCisgICAgICogICAgIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zCisgICAgICovCiAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIERlcHJlY2F0ZWQoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgfQpAQCAtMTMxLDYgKzEzMiwzMCBAQAogICAgIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBHZXRJbnRlcmZhY2VBcnJheShqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gR2V0SW50ZXJmYWNlTGlzdChqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2s+IHNlcnZpY2VzLCBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgLy8gVGVzdCB0aGF0IExpc3Q8VD4gdHlwZXMgd29yayBjb3JyZWN0bHkuCiAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBSZXZlcnNlU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCwgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKQEAgLTE3Myw3ICsxOTgsMTUgQEAKICAgICB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0xODMsNiArMjE2LDEyIEBACiAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlcihhbmRyb2lkLm9zLklCaW5kZXIgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CiAgICAgLy8gVGVzdCB1dGY4IGRlY29kaW5nIGZyb20gdXRmMTYgd2lyZSBmb3JtYXQKICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVwZWF0VXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CkBAIC0yMDQsNiArMjQzLDcgQEAKICAgICB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisgICAgLyoqIGNvbW1lbnQgYmVmb3JlIGFubm90YXRpb24gKi8KICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBHZXRDYWxsYmFjayhib29sZWFuIHJldHVybl9udWxsKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTIxMyw2ICsyNTMsMjEgQEAKICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBwYXJjZWwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgUmV2ZXJzZUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgbGlzdCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gUmV2ZXJzZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBHZXRPbGROYW1lSW50ZXJmYWNlKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgewogICAgICAgcmV0dXJuIG51bGw7CkBAIC0yMzUsNiArMjkwLDMwMCBAQAogICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICB9CisgIC8qKiBEZWxlZ2F0b3IgaW1wbGVtZW50YXRpb24gZm9yIElUZXN0U2VydmljZS4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWxlZ2F0b3IgZXh0ZW5kcyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLlN0dWIKKyAgeworICAgIHB1YmxpYyBEZWxlZ2F0b3IoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZSBpbXBsKSB7CisgICAgICB0aGlzLm1JbXBsID0gaW1wbDsKKyAgICB9CisgICAgLy8gVGhpcyBpcyB0byBlbXVsYXRlIGEgbWV0aG9kIHRoYXQgaXMgYWRkZWQgYWZ0ZXIgdGhlIHNlcnZpY2UgaXMgaW1wbGVtZW50ZWQuCisgICAgLy8gU28gdGhlIGNsaWVudCBjYW5ub3QgYXNzdW1lIHRoYXQgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgYmUgc3VjY2Vzc2Z1bAorICAgIC8vIG9yIG5vdC4gSG93ZXZlciwgaW5zaWRlIHRoZSB0ZXN0IGVudmlyb25tZW50LCB3ZSBjYW4ndCBidWlsZCBjbGllbnQgYW5kCisgICAgLy8gdGhlIHNlcnZlciB3aXRoIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoaXMgQUlETCBmaWxlLiBTbywgd2UgbGV0IHRoZSBzZXJ2ZXIKKyAgICAvLyBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcyBhbmQgaW50ZXJjZXB0IHRoZSBkaXNwYXRjaCB0byB0aGUgbWV0aG9kCisgICAgLy8gaW5zaWRlIG9uVHJhbnNhY3QoKS4KKyAgICAvLyBXQVJOSU5HOiBNdXN0IGJlIGZpcnN0IG1ldGhvZC4KKyAgICAvLyBUaGlzIHJlcXVpcmVzIGhhcmQgY29kaW5nIHRoZSB0cmFuc2FjdGlvbiBudW1iZXIuIEFzIGxvbmcgYXMgdGhpcyBtZXRob2QgaXMKKyAgICAvLyB0aGUgZmlyc3QgaW4gdGhpcyBpbnRlcmZhY2UsIGl0IGNhbiBrZWVwIHRoZQorICAgIC8vICI6OmFuZHJvaWQ6OklCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIiB2YWx1ZSBhbmQgYWxsb3cKKyAgICAvLyBtZXRob2RzIHRvIGJlIGFkZGVkIGFuZCByZW1vdmVkLgorICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IFVuaW1wbGVtZW50ZWRNZXRob2QoaW50IGFyZykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlVuaW1wbGVtZW50ZWRNZXRob2QoYXJnKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrCisgICAgICogICAgIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zCisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIERlcHJlY2F0ZWQoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBtSW1wbC5EZXByZWNhdGVkKCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUZXN0T25ld2F5KCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuVGVzdE9uZXdheSgpOworICAgIH0KKyAgICAvLyBUZXN0IHRoYXQgcHJpbWl0aXZlcyB3b3JrIGFzIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcy4KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gUmVwZWF0Qm9vbGVhbihib29sZWFuIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0Qm9vbGVhbih0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBSZXBlYXRCeXRlKGJ5dGUgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXRCeXRlKHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBjaGFyIFJlcGVhdENoYXIoY2hhciB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdENoYXIodG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBSZXBlYXRJbnQoaW50IHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0SW50KHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIFJlcGVhdExvbmcobG9uZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdExvbmcodG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0IFJlcGVhdEZsb2F0KGZsb2F0IHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0RmxvYXQodG9rZW4pOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBSZXBlYXREb3VibGUoZG91YmxlIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0RG91YmxlKHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0U3RyaW5nKHRva2VuKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBieXRlIFJlcGVhdEJ5dGVFbnVtKGJ5dGUgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXRCeXRlRW51bSh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IFJlcGVhdEludEVudW0oaW50IHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0SW50RW51bSh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZyBSZXBlYXRMb25nRW51bShsb25nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TG9uZ0VudW0odG9rZW4pOworICAgIH0KKyAgICAvLyBUZXN0IHRoYXQgYXJyYXlzIHdvcmsgYXMgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzLgorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbltdIFJldmVyc2VCb29sZWFuKGJvb2xlYW5bXSBpbnB1dCwgYm9vbGVhbltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUJvb2xlYW4oaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXZlcnNlQnl0ZShieXRlW10gaW5wdXQsIGJ5dGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VCeXRlKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBjaGFyW10gUmV2ZXJzZUNoYXIoY2hhcltdIGlucHV0LCBjaGFyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlQ2hhcihpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmV2ZXJzZUludChpbnRbXSBpbnB1dCwgaW50W10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlSW50KGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nW10gUmV2ZXJzZUxvbmcobG9uZ1tdIGlucHV0LCBsb25nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlTG9uZyhpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXRbXSBSZXZlcnNlRmxvYXQoZmxvYXRbXSBpbnB1dCwgZmxvYXRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VGbG9hdChpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZG91YmxlW10gUmV2ZXJzZURvdWJsZShkb3VibGVbXSBpbnB1dCwgZG91YmxlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlRG91YmxlKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gUmV2ZXJzZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VTdHJpbmcoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXZlcnNlQnl0ZUVudW0oYnl0ZVtdIGlucHV0LCBieXRlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlQnl0ZUVudW0oaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludFtdIFJldmVyc2VJbnRFbnVtKGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VJbnRFbnVtKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nW10gUmV2ZXJzZUxvbmdFbnVtKGxvbmdbXSBpbnB1dCwgbG9uZ1tdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZUxvbmdFbnVtKGlucHV0LHJlcGVhdGVkKTsKKyAgICB9CisgICAgLy8gVGVzdCB0aGF0IGNsaWVudHMgY2FuIHNlbmQgYW5kIHJlY2VpdmUgQmluZGVycy4KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBHZXRPdGhlclRlc3RTZXJ2aWNlKGphdmEubGFuZy5TdHJpbmcgbmFtZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldE90aGVyVGVzdFNlcnZpY2UobmFtZSk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lKGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBzZXJ2aWNlLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5WZXJpZnlOYW1lKHNlcnZpY2UsbmFtZSk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gR2V0SW50ZXJmYWNlQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuR2V0SW50ZXJmYWNlQXJyYXkobmFtZXMpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KHNlcnZpY2VzLG5hbWVzKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkobmFtZXMpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcyxuYW1lcyk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBHZXRJbnRlcmZhY2VMaXN0KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldEludGVyZmFjZUxpc3QobmFtZXMpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2s+IHNlcnZpY2VzLCBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KHNlcnZpY2VzLG5hbWVzKTsKKyAgICB9CisgICAgLy8gVGVzdCB0aGF0IExpc3Q8VD4gdHlwZXMgd29yayBjb3JyZWN0bHkuCisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBSZXZlcnNlU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCwgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlU3RyaW5nTGlzdChpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIHJlYWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihyZWFkKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIGlucHV0LCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIC8vIFRlc3QgdGhhdCBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbnMgd29yayBjb3JyZWN0bHkuCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRocm93U2VydmljZUV4Y2VwdGlvbihpbnQgY29kZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKGNvZGUpOworICAgIH0KKyAgICAvLyBUZXN0IG51bGxhYmlsaXR5CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXBlYXROdWxsYWJsZUludEFycmF5KGludFtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVJbnRBcnJheShpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZVtdIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShieXRlW10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludFtdIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGludFtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmdbXSBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkobG9uZ1tdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdE51bGxhYmxlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXROdWxsYWJsZVN0cmluZyhpbnB1dCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyKGFuZHJvaWQub3MuSUJpbmRlciBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuVGFrZXNBbklCaW5kZXIoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyKGFuZHJvaWQub3MuSUJpbmRlciBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgbUltcGwuVGFrZXNBTnVsbGFibGVJQmluZGVyKGlucHV0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBtSW1wbC5UYWtlc0FuSUJpbmRlckxpc3QoaW5wdXQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBtSW1wbC5UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGlucHV0KTsKKyAgICB9CisgICAgLy8gVGVzdCB1dGY4IGRlY29kaW5nIGZyb20gdXRmMTYgd2lyZSBmb3JtYXQKKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVwZWF0VXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmVwZWF0VXRmOENwcFN0cmluZyh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyh0b2tlbik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmdbXSBpbnB1dCwgamF2YS5sYW5nLlN0cmluZ1tdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmdbXSBpbnB1dCwgamF2YS5sYW5nLlN0cmluZ1tdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0LCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChpbnB1dCxyZXBlYXRlZCk7CisgICAgfQorICAgIC8qKiBjb21tZW50IGJlZm9yZSBhbm5vdGF0aW9uICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgR2V0Q2FsbGJhY2soYm9vbGVhbiByZXR1cm5fbnVsbCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldENhbGxiYWNrKHJldHVybl9udWxsKTsKKyAgICB9CisgICAgLy8gU2luY2UgdGhpcyBwYXJhY2VsYWJsZSBoYXMgY2xlYXJseSBkZWZpbmVkIGRlZmF1bHQgdmFsdWVzLCBpdCB3b3VsZCBiZQorICAgIC8vIGluZWZmaWNpZW50IHRvIHVzZSBhbiBJUEMgdG8gZmlsbCBpdCBvdXQgaW4gcHJhY3RpY2UuCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgcGFyY2VsKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBtSW1wbC5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUocGFyY2VsKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBtSW1wbC5SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShlcCxlcDIpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IFJldmVyc2VMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IGxpc3QpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlTGlzdChsaXN0KTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXZlcnNlSUJpbmRlckFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLlJldmVyc2VJQmluZGVyQXJyYXkoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShhbmRyb2lkLm9zLklCaW5kZXJbXSBpbnB1dCwgYW5kcm9pZC5vcy5JQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5wdXQscmVwZWF0ZWQpOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBHZXRPbGROYW1lSW50ZXJmYWNlKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgcmV0dXJuIG1JbXBsLkdldE9sZE5hbWVJbnRlcmZhY2UoKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUgR2V0TmV3TmFtZUludGVyZmFjZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5HZXROZXdOYW1lSW50ZXJmYWNlKCk7CisgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBJQ3BwSmF2YVRlc3RzIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQKKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBHZXRDcHBKYXZhVGVzdHMoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gbUltcGwuR2V0Q3BwSmF2YVRlc3RzKCk7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBnZXRCYWNrZW5kVHlwZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBtSW1wbC5nZXRCYWNrZW5kVHlwZSgpOworICAgIH0KKyAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIG1JbXBsOworICB9CiAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLwogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UKICAgewpAQCAtMjY1LDYgKzYxNCw5IEBACiAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgfQogICAgICAgc3dpdGNoIChjb2RlKQogICAgICAgewogICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKQEAgLTI3Nyw2NjggKzYyOSw3NzggQEAKICAgICAgIHsKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9VbmltcGxlbWVudGVkTWV0aG9kOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGludCBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgaW50IF9yZXN1bHQgPSB0aGlzLlVuaW1wbGVtZW50ZWRNZXRob2QoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgdGhpcy5EZXByZWNhdGVkKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVGVzdE9uZXdheToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICB0aGlzLlRlc3RPbmV3YXkoKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEJvb2xlYW46CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYm9vbGVhbiBfYXJnMDsKLSAgICAgICAgICBfYXJnMCA9ICgwIT1kYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBib29sZWFuIF9yZXN1bHQgPSB0aGlzLlJlcGVhdEJvb2xlYW4oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZUludCgoKF9yZXN1bHQpPygxKTooMCkpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICByZXBseS53cml0ZUJvb2xlYW4oX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRCeXRlOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGJ5dGUgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCeXRlKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBieXRlIF9yZXN1bHQgPSB0aGlzLlJlcGVhdEJ5dGUoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUJ5dGUoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRDaGFyOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGNoYXIgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSAoY2hhcilkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGNoYXIgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0Q2hhcihfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50KCgoaW50KV9yZXN1bHQpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEludDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBpbnQgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGludCBfcmVzdWx0ID0gdGhpcy5SZXBlYXRJbnQoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdExvbmc6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZyBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZExvbmcoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGxvbmcgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TG9uZyhfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlTG9uZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdEZsb2F0OgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGZsb2F0IF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGZsb2F0IF9yZXN1bHQgPSB0aGlzLlJlcGVhdEZsb2F0KF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVGbG9hdChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdERvdWJsZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBkb3VibGUgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWREb3VibGUoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGRvdWJsZSBfcmVzdWx0ID0gdGhpcy5SZXBlYXREb3VibGUoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZURvdWJsZShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdFN0cmluZyhfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0Qnl0ZUVudW06CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYnl0ZSBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEJ5dGUoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGJ5dGUgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0Qnl0ZUVudW0oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUJ5dGUoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRJbnRFbnVtOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGludCBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgaW50IF9yZXN1bHQgPSB0aGlzLlJlcGVhdEludEVudW0oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludChfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdExvbmdFbnVtOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGxvbmcgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRMb25nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBsb25nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdExvbmdFbnVtKF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVMb25nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUJvb2xlYW46CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYm9vbGVhbltdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCb29sZWFuQXJyYXkoKTsKICAgICAgICAgICBib29sZWFuW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGJvb2xlYW5bX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBib29sZWFuW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUJvb2xlYW4oX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUJ5dGU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYnl0ZVtdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCeXRlQXJyYXkoKTsKICAgICAgICAgICBieXRlW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGJ5dGVbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBieXRlW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUJ5dGUoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUNoYXI6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgY2hhcltdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVDaGFyQXJyYXkoKTsKICAgICAgICAgICBjaGFyW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGNoYXJbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBjaGFyW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUNoYXIoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVDaGFyQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVDaGFyQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUludDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBpbnRbXSBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlSW50QXJyYXkoKTsKICAgICAgICAgICBpbnRbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgaW50W19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgaW50W10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUludChfYXJnMCwgX2FyZzEpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUludEFycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50QXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUxvbmc6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVMb25nQXJyYXkoKTsKICAgICAgICAgICBsb25nW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGxvbmdbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBsb25nW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUxvbmcoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVMb25nQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVMb25nQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUZsb2F0OgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGZsb2F0W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUZsb2F0QXJyYXkoKTsKICAgICAgICAgICBmbG9hdFtdIF9hcmcxOwogICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICBpZiAoKF9hcmcxX2xlbmd0aDwwKSkgeworICAgICAgICAgIGlmIChfYXJnMV9sZW5ndGggPCAwKSB7CiAgICAgICAgICAgICBfYXJnMSA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfYXJnMSA9IG5ldyBmbG9hdFtfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGZsb2F0W10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUZsb2F0KF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlRmxvYXRBcnJheShfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZUZsb2F0QXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZURvdWJsZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBkb3VibGVbXSBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlRG91YmxlQXJyYXkoKTsKICAgICAgICAgICBkb3VibGVbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgZG91YmxlW19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgZG91YmxlW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZURvdWJsZShfYXJnMCwgX2FyZzEpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZURvdWJsZUFycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlRG91YmxlQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVN0cmluZ0FycmF5KCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcxOwogICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICBpZiAoKF9hcmcxX2xlbmd0aDwwKSkgeworICAgICAgICAgIGlmIChfYXJnMV9sZW5ndGggPCAwKSB7CiAgICAgICAgICAgICBfYXJnMSA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfYXJnMSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VTdHJpbmcoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheShfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9hcmcxKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VCeXRlRW51bToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBieXRlW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUJ5dGVBcnJheSgpOwogICAgICAgICAgIGJ5dGVbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgYnl0ZVtfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGJ5dGVbXSBfcmVzdWx0ID0gdGhpcy5SZXZlcnNlQnl0ZUVudW0oX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUludEVudW06CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgaW50W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludEFycmF5KCk7CiAgICAgICAgICAgaW50W10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGludFtfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGludFtdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VJbnRFbnVtKF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50QXJyYXkoX3Jlc3VsdCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVJbnRBcnJheShfYXJnMSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW06CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVMb25nQXJyYXkoKTsKICAgICAgICAgICBsb25nW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGxvbmdbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBsb25nW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZUxvbmdFbnVtKF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlTG9uZ0FycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlTG9uZ0FycmF5KF9hcmcxKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0dldE90aGVyVGVzdFNlcnZpY2U6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIF9yZXN1bHQgPSB0aGlzLkdldE90aGVyVGVzdFNlcnZpY2UoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcigoKChfcmVzdWx0IT1udWxsKSk/KF9yZXN1bHQuYXNCaW5kZXIoKSk6KG51bGwpKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdJbnRlcmZhY2UoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9WZXJpZnlOYW1lOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjay5TdHViLmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcxOwogICAgICAgICAgIF9hcmcxID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBib29sZWFuIF9yZXN1bHQgPSB0aGlzLlZlcmlmeU5hbWUoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgcmVwbHkud3JpdGVJbnQoKChfcmVzdWx0KT8oMSk6KDApKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuKF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlQXJyYXk6CisgICAgICAgIHsKKyAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVN0cmluZ0FycmF5KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBfcmVzdWx0ID0gdGhpcy5HZXRJbnRlcmZhY2VBcnJheShfYXJnMCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlQXJyYXkoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdCA9IHRoaXMuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVCb29sZWFuKF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9yZXN1bHQgPSB0aGlzLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUFycmF5KF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdCA9IHRoaXMuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnMCwgX2FyZzEpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUJvb2xlYW4oX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0OgorICAgICAgICB7CisgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVTdHJpbmdBcnJheSgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBfcmVzdWx0ID0gdGhpcy5HZXRJbnRlcmZhY2VMaXN0KF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VMaXN0KF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdDoKKyAgICAgICAgeworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdCA9IHRoaXMuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChfYXJnMCwgX2FyZzEpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZUJvb2xlYW4oX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nTGlzdDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX2FyZzE7CiAgICAgICAgICAgX2FyZzEgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuU3RyaW5nPigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZVN0cmluZ0xpc3QoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdMaXN0KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nTGlzdChfYXJnMSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcjoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIF9hcmcwOwotICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9hcmcwID0gbnVsbDsKLSAgICAgICAgICB9CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBfcmVzdWx0ID0gdGhpcy5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgIGlmICgoX3Jlc3VsdCE9bnVsbCkpIHsKLSAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOwotICAgICAgICAgICAgX3Jlc3VsdC53cml0ZVRvUGFyY2VsKHJlcGx5LCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDApOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX2FyZzE7CiAgICAgICAgICAgaW50IF9hcmcxX2xlbmd0aCA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgIGlmICgoX2FyZzFfbGVuZ3RoPDApKSB7CisgICAgICAgICAgaWYgKF9hcmcxX2xlbmd0aCA8IDApIHsKICAgICAgICAgICAgIF9hcmcxID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZEFycmF5KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZEFycmF5KF9hcmcxLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGludCBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgdGhpcy5UaHJvd1NlcnZpY2VFeGNlcHRpb24oX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50QXJyYXk6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgaW50W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVJbnRBcnJheShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBieXRlW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUJ5dGVBcnJheSgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgYnl0ZVtdIF9yZXN1bHQgPSB0aGlzLlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlQnl0ZUFycmF5KF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXk6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgaW50W10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBpbnRbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlSW50QXJyYXkoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXk6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgbG9uZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVMb25nQXJyYXkoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGxvbmdbXSBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZUxvbmdBcnJheShfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nTGlzdDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfcmVzdWx0ID0gdGhpcy5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0xpc3QoX3Jlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIF9hcmcwOwotICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX2FyZzAgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmcwKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgaWYgKChfcmVzdWx0IT1udWxsKSkgewotICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMSk7Ci0gICAgICAgICAgICBfcmVzdWx0LndyaXRlVG9QYXJjZWwocmVwbHksIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIHJlcGx5LndyaXRlVHlwZWRPYmplY3QoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5OgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gX3Jlc3VsdCA9IHRoaXMuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkQXJyYXkoX3Jlc3VsdCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3Q6CisgICAgICAgIHsKKyAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlVHlwZWRBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IF9yZXN1bHQgPSB0aGlzLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkTGlzdChfcmVzdWx0KTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlciBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgdGhpcy5UYWtlc0FuSUJpbmRlcihfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlciBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgdGhpcy5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdDoKKyAgICAgICAgeworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZUJpbmRlckFycmF5TGlzdCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgdGhpcy5UYWtlc0FuSUJpbmRlckxpc3QoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3Q6CisgICAgICAgIHsKKyAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCaW5kZXJBcnJheUxpc3QoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIHRoaXMuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnMCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnMCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmc6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcwOwogICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVTdHJpbmdBcnJheSgpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfYXJnMTsKICAgICAgICAgICBpbnQgX2FyZzFfbGVuZ3RoID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgaWYgKChfYXJnMV9sZW5ndGg8MCkpIHsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgX2FyZzEgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX2FyZzEgPSBuZXcgamF2YS5sYW5nLlN0cmluZ1tfYXJnMV9sZW5ndGhdOwogICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfcmVzdWx0ID0gdGhpcy5SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnMCwgX2FyZzEpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9yZXN1bHQpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nQXJyYXkoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZzoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10gX2FyZzA7CiAgICAgICAgICAgX2FyZzAgPSBkYXRhLmNyZWF0ZVN0cmluZ0FycmF5KCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9hcmcxOwogICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICBpZiAoKF9hcmcxX2xlbmd0aDwwKSkgeworICAgICAgICAgIGlmIChfYXJnMV9sZW5ndGggPCAwKSB7CiAgICAgICAgICAgICBfYXJnMSA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfYXJnMSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW19hcmcxX2xlbmd0aF07CiAgICAgICAgICAgfQorICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZzAsIF9hcmcxKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheShfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9hcmcxKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdDoKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBfYXJnMDsKICAgICAgICAgICBfYXJnMCA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXlMaXN0KCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX2FyZzE7CiAgICAgICAgICAgX2FyZzEgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuU3RyaW5nPigpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CiAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX3Jlc3VsdCA9IHRoaXMuUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KF9hcmcwLCBfYXJnMSk7CiAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nTGlzdChfcmVzdWx0KTsKICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0xpc3QoX2FyZzEpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2s6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYm9vbGVhbiBfYXJnMDsKLSAgICAgICAgICBfYXJnMCA9ICgwIT1kYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgX3Jlc3VsdCA9IHRoaXMuR2V0Q2FsbGJhY2soX2FyZzApOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcigoKChfcmVzdWx0IT1udWxsKSk/KF9yZXN1bHQuYXNCaW5kZXIoKSk6KG51bGwpKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdJbnRlcmZhY2UoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGU6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIF9hcmcwOwotICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX2FyZzAgPSBudWxsOwotICAgICAgICAgIH0KKyAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOwogICAgICAgICAgIHRoaXMuRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKF9hcmcwKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgaWYgKChfYXJnMCE9bnVsbCkpIHsKLSAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOwotICAgICAgICAgICAgX2FyZzAud3JpdGVUb1BhcmNlbChyZXBseSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9hcmcwLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGU6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZS5DUkVBVE9SKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIF9hcmcxOworICAgICAgICAgIF9hcmcxID0gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUoKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIHRoaXMuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZE9iamVjdChfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VMaXN0OgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdC5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IF9yZXN1bHQgPSB0aGlzLlJldmVyc2VMaXN0KF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZE9iamVjdChfcmVzdWx0LCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCaW5kZXJBcnJheSgpOworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcxOworICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgX2FyZzEgPSBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfYXJnMSA9IG5ldyBhbmRyb2lkLm9zLklCaW5kZXJbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXBseS53cml0ZUludCgwKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9yZXN1bHQgPSB0aGlzLlJldmVyc2VJQmluZGVyQXJyYXkoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVCaW5kZXJBcnJheShfcmVzdWx0KTsKKyAgICAgICAgICByZXBseS53cml0ZUJpbmRlckFycmF5KF9hcmcxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheToKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVCaW5kZXJBcnJheSgpOworICAgICAgICAgIGFuZHJvaWQub3MuSUJpbmRlcltdIF9hcmcxOworICAgICAgICAgIGludCBfYXJnMV9sZW5ndGggPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICBpZiAoX2FyZzFfbGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgX2FyZzEgPSBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfYXJnMSA9IG5ldyBhbmRyb2lkLm9zLklCaW5kZXJbX2FyZzFfbGVuZ3RoXTsKICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfcmVzdWx0ID0gdGhpcy5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZzAsIF9hcmcxKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVCaW5kZXJBcnJheShfcmVzdWx0KTsKKyAgICAgICAgICByZXBseS53cml0ZUJpbmRlckFycmF5KF9hcmcxKTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIF9yZXN1bHQgPSB0aGlzLkdldE9sZE5hbWVJbnRlcmZhY2UoKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdCaW5kZXIoKCgoX3Jlc3VsdCE9bnVsbCkpPyhfcmVzdWx0LmFzQmluZGVyKCkpOihudWxsKSkpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIHJlcGx5LndyaXRlU3Ryb25nSW50ZXJmYWNlKF9yZXN1bHQpOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fR2V0TmV3TmFtZUludGVyZmFjZToKICAgICAgICAgewotICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUgX3Jlc3VsdCA9IHRoaXMuR2V0TmV3TmFtZUludGVyZmFjZSgpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcigoKChfcmVzdWx0IT1udWxsKSk/KF9yZXN1bHQuYXNCaW5kZXIoKSk6KG51bGwpKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdJbnRlcmZhY2UoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9HZXRDcHBKYXZhVGVzdHM6CiAgICAgICAgIHsKLSAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CiAgICAgICAgICAgYW5kcm9pZC5vcy5JQmluZGVyIF9yZXN1bHQgPSB0aGlzLkdldENwcEphdmFUZXN0cygpOwogICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcihfcmVzdWx0KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldEJhY2tlbmRUeXBlOgogICAgICAgICB7Ci0gICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgIGJ5dGUgX3Jlc3VsdCA9IHRoaXMuZ2V0QmFja2VuZFR5cGUoKTsKICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgcmVwbHkud3JpdGVCeXRlKF9yZXN1bHQpOwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlCiAgICAgewpAQCAtOTY4LDggKzE0MzAsOSBAQAogICAgICAgLy8gbWV0aG9kcyB0byBiZSBhZGRlZCBhbmQgcmVtb3ZlZC4KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IFVuaW1wbGVtZW50ZWRNZXRob2QoaW50IGFyZykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGludCBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC05OTAsMTMgKzE0NTMsMTQgQEAKICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICAgICB9CiAgICAgICAvKioKLSAgICAgICAgICAgKiBAZGVwcmVjYXRlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sKLSAgICAgICAgICAgKiAgICAgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMKLSAgICAgICAgICAgKi8KKyAgICAgICAqIEBkZXByZWNhdGVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjaworICAgICAgICogICAgIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zCisgICAgICAgKi8KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBEZXByZWNhdGVkKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fRGVwcmVjYXRlZCwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKQEAgLTEwMTUsOCArMTQ3OSw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGVzdE9uZXdheSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7dHJ5IHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9UZXN0T25ld2F5LCBfZGF0YSwgbnVsbCwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfT05FV0FZIHwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKICAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKQEAgLTEwMzMsMTIgKzE0OTgsMTMgQEAKICAgICAgIC8vIFRlc3QgdGhhdCBwcmltaXRpdmVzIHdvcmsgYXMgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzLgogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFJlcGVhdEJvb2xlYW4oYm9vbGVhbiB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGJvb2xlYW4gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwotICAgICAgICAgIF9kYXRhLndyaXRlSW50KCgodG9rZW4pPygxKTooMCkpKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJvb2xlYW4odG9rZW4pOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXRCb29sZWFuLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOwogICAgICAgICAgIGlmICghX3N0YXR1cykgewogICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewpAQCAtMTA0Niw3ICsxNTEyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKLSAgICAgICAgICBfcmVzdWx0ID0gKDAhPV9yZXBseS5yZWFkSW50KCkpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZEJvb2xlYW4oKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOwpAQCAtMTA1Niw4ICsxNTIyLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBSZXBlYXRCeXRlKGJ5dGUgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBieXRlIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTEwNzksOCArMTU0Niw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGNoYXIgUmVwZWF0Q2hhcihjaGFyIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgY2hhciBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMTAyLDggKzE1NzAsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgUmVwZWF0SW50KGludCB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGludCBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMTI1LDggKzE1OTQsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIFJlcGVhdExvbmcobG9uZyB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGxvbmcgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTE0OCw4ICsxNjE4LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgUmVwZWF0RmxvYXQoZmxvYXQgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBmbG9hdCBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMTcxLDggKzE2NDIsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBkb3VibGUgUmVwZWF0RG91YmxlKGRvdWJsZSB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGRvdWJsZSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMTk0LDggKzE2NjYsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRva2VuKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMjE3LDggKzE2OTAsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBieXRlIFJlcGVhdEJ5dGVFbnVtKGJ5dGUgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBieXRlIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTEyNDAsOCArMTcxNCw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBSZXBlYXRJbnRFbnVtKGludCB0b2tlbikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGludCBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMjYzLDggKzE3MzgsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIFJlcGVhdExvbmdFbnVtKGxvbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBsb25nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTEyODcsOCArMTc2Myw5IEBACiAgICAgICAvLyBUZXN0IHRoYXQgYXJyYXlzIHdvcmsgYXMgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzLgogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuW10gUmV2ZXJzZUJvb2xlYW4oYm9vbGVhbltdIGlucHV0LCBib29sZWFuW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBib29sZWFuW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTMxNyw4ICsxNzk0LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZVtdIFJldmVyc2VCeXRlKGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYnl0ZVtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTEzNDcsOCArMTgyNSw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGNoYXJbXSBSZXZlcnNlQ2hhcihjaGFyW10gaW5wdXQsIGNoYXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGNoYXJbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xMzc3LDggKzE4NTYsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXZlcnNlSW50KGludFtdIGlucHV0LCBpbnRbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGludFtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE0MDcsOCArMTg4Nyw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmdbXSBSZXZlcnNlTG9uZyhsb25nW10gaW5wdXQsIGxvbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGxvbmdbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNDM3LDggKzE5MTgsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBmbG9hdFtdIFJldmVyc2VGbG9hdChmbG9hdFtdIGlucHV0LCBmbG9hdFtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZmxvYXRbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNDY3LDggKzE5NDksOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBkb3VibGVbXSBSZXZlcnNlRG91YmxlKGRvdWJsZVtdIGlucHV0LCBkb3VibGVbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGRvdWJsZVtdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE0OTcsOCArMTk4MCw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBSZXZlcnNlU3RyaW5nKGphdmEubGFuZy5TdHJpbmdbXSBpbnB1dCwgamF2YS5sYW5nLlN0cmluZ1tdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE1MjcsOCArMjAxMSw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJ5dGVbXSBSZXZlcnNlQnl0ZUVudW0oYnl0ZVtdIGlucHV0LCBieXRlW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBieXRlW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTU1Nyw4ICsyMDQyLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmV2ZXJzZUludEVudW0oaW50W10gaW5wdXQsIGludFtdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgaW50W10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTU4Nyw4ICsyMDczLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZ1tdIFJldmVyc2VMb25nRW51bShsb25nW10gaW5wdXQsIGxvbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGxvbmdbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNjE4LDEzICsyMTA1LDE1IEBACiAgICAgICAvLyBUZXN0IHRoYXQgY2xpZW50cyBjYW4gc2VuZCBhbmQgcmVjZWl2ZSBCaW5kZXJzLgogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgR2V0T3RoZXJUZXN0U2VydmljZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwogICAgICAgICAgIF9kYXRhLndyaXRlU3RyaW5nKG5hbWUpOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9HZXRPdGhlclRlc3RTZXJ2aWNlLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIF9yZXBseS5zZXRQcm9wYWdhdGVBbGxvd0Jsb2NraW5nKCk7CiAgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CiAgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLkdldE90aGVyVGVzdFNlcnZpY2UobmFtZSk7CkBAIC0xNjQxLDEyICsyMTMwLDEzIEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gVmVyaWZ5TmFtZShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgc2VydmljZSwgamF2YS5sYW5nLlN0cmluZyBuYW1lKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgYm9vbGVhbiBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7Ci0gICAgICAgICAgX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIoKCgoc2VydmljZSE9bnVsbCkpPyhzZXJ2aWNlLmFzQmluZGVyKCkpOihudWxsKSkpOworICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKHNlcnZpY2UpOwogICAgICAgICAgIF9kYXRhLndyaXRlU3RyaW5nKG5hbWUpOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9WZXJpZnlOYW1lLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOwogICAgICAgICAgIGlmICghX3N0YXR1cykgewpAQCAtMTY1NSw3ICsyMTQ1LDE1NCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOwotICAgICAgICAgIF9yZXN1bHQgPSAoMCE9X3JlcGx5LnJlYWRJbnQoKSk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkQm9vbGVhbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBHZXRJbnRlcmZhY2VBcnJheShqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlU3RyaW5nQXJyYXkobmFtZXMpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuR2V0SW50ZXJmYWNlQXJyYXkobmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW106Om5ldywgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXSBzZXJ2aWNlcywgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGJvb2xlYW4gX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlQXJyYXkoc2VydmljZXMpOworICAgICAgICAgIF9kYXRhLndyaXRlU3RyaW5nQXJyYXkobmFtZXMpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRCb29sZWFuKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KG5hbWVzKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVJbnRlcmZhY2VBcnJheShhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2tbXTo6bmV3LCBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2suU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBib29sZWFuIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZUFycmF5KHNlcnZpY2VzKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KG5hbWVzKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBHZXRJbnRlcmZhY2VMaXN0KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2s+IF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KG5hbWVzKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fR2V0SW50ZXJmYWNlTGlzdCwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuR2V0SW50ZXJmYWNlTGlzdChuYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBib29sZWFuIF9yZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZUxpc3Qoc2VydmljZXMpOworICAgICAgICAgIF9kYXRhLndyaXRlU3RyaW5nQXJyYXkobmFtZXMpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0LCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KHNlcnZpY2VzLCBuYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkQm9vbGVhbigpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CkBAIC0xNjY2LDggKzIzMDMsOSBAQAogICAgICAgLy8gVGVzdCB0aGF0IExpc3Q8VD4gdHlwZXMgd29yayBjb3JyZWN0bHkuCiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJldmVyc2VTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0LCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE2OTAsMTggKzIzMjgsMTMgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIHJlYWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKLSAgICAgICAgICBpZiAoKHJlYWQhPW51bGwpKSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgxKTsKLSAgICAgICAgICAgIHJlYWQud3JpdGVUb1BhcmNlbChfZGF0YSwgMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoMCk7Ci0gICAgICAgICAgfQorICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3QocmVhZCwgMCk7CiAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOwogICAgICAgICAgIGlmICghX3N0YXR1cykgewogICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewpAQCAtMTcwOSwxMiArMjM0Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgaWYgKCgwIT1fcmVwbHkucmVhZEludCgpKSkgewotICAgICAgICAgICAgX3Jlc3VsdCA9IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9yZXBseSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX3Jlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgfQorICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKQEAgLTE3MjQsOCArMjM1Miw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gaW5wdXQsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xNzU1LDggKzIzODQsOSBAQAogICAgICAgLy8gVGVzdCB0aGF0IHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9ucyB3b3JrIGNvcnJlY3RseS4KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50IGNvZGUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnQoY29kZSk7CkBAIC0xNzc3LDggKzI0MDcsOSBAQAogICAgICAgLy8gVGVzdCBudWxsYWJpbGl0eQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnRbXSBSZXBlYXROdWxsYWJsZUludEFycmF5KGludFtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgaW50W10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTgwMCw4ICsyNDMxLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZVtdIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShieXRlW10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBieXRlW10gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMTgyMyw4ICsyNDU1LDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50W10gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoaW50W10gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBpbnRbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xODQ2LDggKzI0NzksOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nW10gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGxvbmdbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGxvbmdbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0xODY5LDggKzI1MDMsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIFJlcGVhdE51bGxhYmxlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE4OTIsOCArMjUyNyw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTE5MTMsMjAgKzI1NDksMTUgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gX3Jlc3VsdDsKICAgICAgIH0KLSAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUgX3Jlc3VsdDsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwotICAgICAgICAgIGlmICgoaW5wdXQhPW51bGwpKSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgxKTsKLSAgICAgICAgICAgIGlucHV0LndyaXRlVG9QYXJjZWwoX2RhdGEsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KDApOwotICAgICAgICAgIH0KKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkT2JqZWN0KGlucHV0LCAwKTsKICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlLCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOwogICAgICAgICAgIGlmICghX3N0YXR1cykgewogICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgewpAQCAtMTkzNCwxMiArMjU2NSw1NSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOwotICAgICAgICAgIGlmICgoMCE9X3JlcGx5LnJlYWRJbnQoKSkpIHsKLSAgICAgICAgICAgIF9yZXN1bHQgPSBhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9yZXBseSk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHlbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRBcnJheShpbnB1dCwgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbnB1dCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgX3Jlc3VsdCA9IG51bGw7CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eS5DUkVBVE9SKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZExpc3QoaW5wdXQpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0LCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGlucHV0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZVR5cGVkQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKQEAgLTE5NDksOCArMjYyMyw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXIoYW5kcm9pZC5vcy5JQmluZGVyIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwogICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nQmluZGVyKGlucHV0KTsKQEAgLTE5NzAsOCArMjY0NSw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyKGFuZHJvaWQub3MuSUJpbmRlciBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKICAgICAgICAgICBfZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihpbnB1dCk7CkBAIC0xOTg5LDExICsyNjY1LDU2IEBACiAgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlQmluZGVyTGlzdChpbnB1dCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdCwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZ2V0RGVmYXVsdEltcGwoKS5UYWtlc0FuSUJpbmRlckxpc3QoaW5wdXQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuSUJpbmRlcj4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlQmluZGVyTGlzdChpbnB1dCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGdldERlZmF1bHRJbXBsKCkuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbnB1dCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgLy8gVGVzdCB1dGY4IGRlY29kaW5nIGZyb20gdXRmMTYgd2lyZSBmb3JtYXQKICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTIwMTUsOCArMjczNiw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTIwMzgsOCArMjc2MCw5IEBACiAgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBSZXZlcnNlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0yMDY4LDggKzI3OTEsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0yMDk4LDggKzI4MjIsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gaW5wdXQsIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICAgIHsKLSAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpO2FuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgX2RhdGEubWFya1NlbnNpdGl2ZSgpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjEyMCwxNCArMjg0NSwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBfcmVzdWx0OwogICAgICAgfQorICAgICAgLyoqIGNvbW1lbnQgYmVmb3JlIGFubm90YXRpb24gKi8KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIEdldENhbGxiYWNrKGJvb2xlYW4gcmV0dXJuX251bGwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2sgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwotICAgICAgICAgIF9kYXRhLndyaXRlSW50KCgocmV0dXJuX251bGwpPygxKTooMCkpKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJvb2xlYW4ocmV0dXJuX251bGwpOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9HZXRDYWxsYmFjaywgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKICAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKICAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKQEAgLTIxNDcsMTcgKzI4NzQsMTIgQEAKICAgICAgIC8vIGluZWZmaWNpZW50IHRvIHVzZSBhbiBJUEMgdG8gZmlsbCBpdCBvdXQgaW4gcHJhY3RpY2UuCiAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBwYXJjZWwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7Ci0gICAgICAgICAgaWYgKChwYXJjZWwhPW51bGwpKSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgxKTsKLSAgICAgICAgICAgIHBhcmNlbC53cml0ZVRvUGFyY2VsKF9kYXRhLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgwKTsKLSAgICAgICAgICB9CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChwYXJjZWwsIDApOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CiAgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CiAgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CkBAIC0yMTc1LDEwICsyODk3LDEyMiBAQAogICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkT2JqZWN0KGVwLCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGdldERlZmF1bHRJbXBsKCkuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoZXAsIGVwMik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBpZiAoKDAhPV9yZXBseS5yZWFkSW50KCkpKSB7CisgICAgICAgICAgICBlcDIucmVhZEZyb21QYXJjZWwoX3JlcGx5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgUmV2ZXJzZUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QgbGlzdCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChsaXN0LCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmV2ZXJzZUxpc3QsIF9kYXRhLCBfcmVwbHksIGFuZHJvaWQub3MuSUJpbmRlci5GTEFHX0NMRUFSX0JVRik7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEltcGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SW1wbCgpLlJldmVyc2VMaXN0KGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0LkNSRUFUT1IpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVzdWx0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXZlcnNlSUJpbmRlckFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVCaW5kZXJBcnJheShpbnB1dCk7CisgICAgICAgICAgaWYgKChyZXBlYXRlZD09bnVsbCkpIHsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KC0xKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludChyZXBlYXRlZC5sZW5ndGgpOworICAgICAgICAgIH0KKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmV2ZXJzZUlCaW5kZXJBcnJheSwgX2RhdGEsIF9yZXBseSwgYW5kcm9pZC5vcy5JQmluZGVyLkZMQUdfQ0xFQVJfQlVGKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuUmV2ZXJzZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlQmluZGVyQXJyYXkoKTsKKyAgICAgICAgICBfcmVwbHkucmVhZEJpbmRlckFycmF5KHJlcGVhdGVkKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGFuZHJvaWQub3MuSUJpbmRlcltdIGlucHV0LCBhbmRyb2lkLm9zLklCaW5kZXJbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXJbXSBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVCaW5kZXJBcnJheShpbnB1dCk7CisgICAgICAgICAgaWYgKChyZXBlYXRlZD09bnVsbCkpIHsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KC0xKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludChyZXBlYXRlZC5sZW5ndGgpOworICAgICAgICAgIH0KKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5LCBfZGF0YSwgX3JlcGx5LCBhbmRyb2lkLm9zLklCaW5kZXIuRkxBR19DTEVBUl9CVUYpOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgaWYgKGdldERlZmF1bHRJbXBsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEltcGwoKS5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5wdXQsIHJlcGVhdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LmNyZWF0ZUJpbmRlckFycmF5KCk7CisgICAgICAgICAgX3JlcGx5LnJlYWRCaW5kZXJBcnJheShyZXBlYXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CiAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBHZXRPbGROYW1lSW50ZXJmYWNlKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiAgICAgICB7Ci0gICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTthbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIF9kYXRhLm1hcmtTZW5zaXRpdmUoKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSBfcmVzdWx0OwogICAgICAgICB0cnkgewogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CkBAIC0yMTk5LDggKzMwMzMsOSBAQAogICAgICAgfQogICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUgR2V0TmV3TmFtZUludGVyZmFjZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuSU5ld05hbWUgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjIyMiw4ICszMDU3LDkgQEAKICAgICAgIC8vIFJldHJpZXZlIHRoZSBJQ3BwSmF2YVRlc3RzIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQKICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIEdldENwcEphdmFUZXN0cygpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXIgX3Jlc3VsdDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOwpAQCAtMjI0NCw4ICszMDgwLDkgQEAKICAgICAgIH0KICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYnl0ZSBnZXRCYWNrZW5kVHlwZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgogICAgICAgewotICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwotICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7YW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBfZGF0YS5tYXJrU2Vuc2l0aXZlKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOwogICAgICAgICBieXRlIF9yZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKQEAgLTIyOTMsMzAgKzMxMzAsNDQgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VMb25nRW51bSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI0KTsKICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldE90aGVyVGVzdFNlcnZpY2UgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNSk7CiAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjYpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZ0xpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNyk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvciA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjkpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzApOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVJbnRBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMyKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzMpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNSk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNik7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNyk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlciA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Rha2VzQU51bGxhYmxlSUJpbmRlciA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM5KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdFV0ZjhDcHBTdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MSk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlVXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQyKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0Myk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXRDYWxsYmFjayA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2KTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2UgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0Nyk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXROZXdOYW1lSW50ZXJmYWNlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDgpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0Q3BwSmF2YVRlc3RzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDkpOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QmFja2VuZFR5cGUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjgpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzEpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMyKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VTdHJpbmdMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzMpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM1KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Rocm93U2VydmljZUV4Y2VwdGlvbiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50QXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNyk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM5KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlU3RyaW5nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDEpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDIpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDMpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXIgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0Nik7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXIgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0Nyk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlckxpc3QgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDkpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUxKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTIpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUzKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU0KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldENhbGxiYWNrID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTYpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1Nyk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlTGlzdCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU4KTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JldmVyc2VJQmluZGVyQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OSk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9HZXRPbGROYW1lSW50ZXJmYWNlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjEpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fR2V0TmV3TmFtZUludGVyZmFjZSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYyKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0dldENwcEphdmFUZXN0cyA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYzKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEJhY2tlbmRUeXBlID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjQpOwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0SW1wbChhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIGltcGwpIHsKICAgICAgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCiAgICAgICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKQEAgLTIzMzYsNiArMzE4NywxMCBAQAogICB9CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRJVGVzdFNlcnZpY2UiLnJlcGxhY2UoJyQnLCAnLicpOwogICAvLyBUZXN0IHRoYXQgY29uc3RhbnRzIGFyZSBhY2Nlc3NpYmxlCisgIC8qKiBleHRyYSBkb2MgY29tbWVudCAqLworICAvLyBleHRyYSBsaW5lIGNvbW1lbnQKKyAgLyogZXh0cmEgcmVndWxhciBjb21tZW50ICovCisgIC8qKiBjb25zdCBjb21tZW50ICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ09OU1RBTlQgPSA0MjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9DT05TVEFOVDIgPSAtNDI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ09OU1RBTlQzID0gNDI7CkBAIC0yNDI2LDkgKzMyODEsOSBAQAogICAvLyBtZXRob2RzIHRvIGJlIGFkZGVkIGFuZCByZW1vdmVkLgogICBwdWJsaWMgaW50IFVuaW1wbGVtZW50ZWRNZXRob2QoaW50IGFyZykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICAvKioKLSAgICAgICAqIEBkZXByZWNhdGVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjawotICAgICAgICogICAgIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zCi0gICAgICAgKi8KKyAgICogQGRlcHJlY2F0ZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrCisgICAqICAgICBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucworICAgKi8KICAgQERlcHJlY2F0ZWQKICAgcHVibGljIHZvaWQgRGVwcmVjYXRlZCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIHZvaWQgVGVzdE9uZXdheSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTI0NTksNiArMzMxNCwxMiBAQAogICAvLyBUZXN0IHRoYXQgY2xpZW50cyBjYW4gc2VuZCBhbmQgcmVjZWl2ZSBCaW5kZXJzLgogICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIEdldE90aGVyVGVzdFNlcnZpY2UoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWUoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIHNlcnZpY2UsIGphdmEubGFuZy5TdHJpbmcgbmFtZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gR2V0SW50ZXJmYWNlQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzLCBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFja1tdIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrPiBHZXRJbnRlcmZhY2VMaXN0KGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjaz4gc2VydmljZXMsIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICAvLyBUZXN0IHRoYXQgTGlzdDxUPiB0eXBlcyB3b3JrIGNvcnJlY3RseS4KICAgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJldmVyc2VTdHJpbmdMaXN0KGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IGlucHV0LCBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIHJlYWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTI0NzIsMjIgKzMzMzMsMjM3IEBACiAgIHB1YmxpYyBsb25nW10gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGxvbmdbXSBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXROdWxsYWJsZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gaW5wdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLSAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eVtdIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHk+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyKGFuZHJvaWQub3MuSUJpbmRlciBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgdm9pZCBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoYW5kcm9pZC5vcy5JQmluZGVyIGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyTGlzdChqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGlucHV0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5JQmluZGVyPiBpbnB1dCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICAvLyBUZXN0IHV0ZjggZGVjb2RpbmcgZnJvbSB1dGYxNiB3aXJlIGZvcm1hdAogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdG9rZW4pIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBSZXZlcnNlVXRmOENwcFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nW10gaW5wdXQsIGphdmEubGFuZy5TdHJpbmdbXSByZXBlYXRlZCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoamF2YS5sYW5nLlN0cmluZ1tdIGlucHV0LCBqYXZhLmxhbmcuU3RyaW5nW10gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBpbnB1dCwgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gcmVwZWF0ZWQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgLyoqIGNvbW1lbnQgYmVmb3JlIGFubm90YXRpb24gKi8KICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayBHZXRDYWxsYmFjayhib29sZWFuIHJldHVybl9udWxsKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIC8vIFNpbmNlIHRoaXMgcGFyYWNlbGFibGUgaGFzIGNsZWFybHkgZGVmaW5lZCBkZWZhdWx0IHZhbHVlcywgaXQgd291bGQgYmUKICAgLy8gaW5lZmZpY2llbnQgdG8gdXNlIGFuIElQQyB0byBmaWxsIGl0IG91dCBpbiBwcmFjdGljZS4KICAgcHVibGljIHZvaWQgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSBwYXJjZWwpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIHZvaWQgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZSBlcCwgYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5FeHRlbmRhYmxlUGFyY2VsYWJsZSBlcDIpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IFJldmVyc2VMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IGxpc3QpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIFJldmVyc2VJQmluZGVyQXJyYXkoYW5kcm9pZC5vcy5JQmluZGVyW10gaW5wdXQsIGFuZHJvaWQub3MuSUJpbmRlcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXJbXSBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoYW5kcm9pZC5vcy5JQmluZGVyW10gaW5wdXQsIGFuZHJvaWQub3MuSUJpbmRlcltdIHJlcGVhdGVkKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUgR2V0T2xkTmFtZUludGVyZmFjZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JTmV3TmFtZSBHZXROZXdOYW1lSW50ZXJmYWNlKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICAvLyBSZXRyaWV2ZSB0aGUgSUNwcEphdmFUZXN0cyBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0CiAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgR2V0Q3BwSmF2YVRlc3RzKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogICBwdWJsaWMgYnl0ZSBnZXRCYWNrZW5kVHlwZSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgLy8gU21hbGwgZW1wdHkgcGFyY2VsYWJsZSBmb3IgbnVsbGFiaWxpdHkgY2hlY2sKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxFbXB0eT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxFbXB0eT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbXB0eSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBFbXB0eSBfYWlkbF9vdXQgPSBuZXcgRW1wdHkoKTsKKyAgICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbXB0eVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEVtcHR5KSkgcmV0dXJuIGZhbHNlOworICAgICAgRW1wdHkgdGhhdCA9IChFbXB0eSlvdGhlcjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5kZWVwSGFzaENvZGUoamF2YS51dGlsLkFycmF5cy5hc0xpc3QoKS50b0FycmF5KCkpOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgfQorICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBpbGVyQ2hlY2tzIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCisgIHsKKyAgICAvLyBJQmluZGVyCisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBiaW5kZXI7CisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBudWxsYWJsZV9iaW5kZXI7CisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlcltdIGJpbmRlcl9hcnJheTsKKyAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyW10gbnVsbGFibGVfYmluZGVyX2FycmF5OworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IGJpbmRlcl9saXN0OworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLklCaW5kZXI+IG51bGxhYmxlX2JpbmRlcl9saXN0OworICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9yCisgICAgcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkOworICAgIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIG51bGxhYmxlX3BmZDsKKyAgICBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZF9hcnJheTsKKyAgICBwdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIG51bGxhYmxlX3BmZF9hcnJheTsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcj4gcGZkX2xpc3Q7CisgICAgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I+IG51bGxhYmxlX3BmZF9saXN0OworICAgIC8vIHBhcmNlbGFibGUKKyAgICBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eSBwYXJjZWw7CisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkgbnVsbGFibGVfcGFyY2VsOworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gcGFyY2VsX2FycmF5OworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5W10gbnVsbGFibGVfcGFyY2VsX2FycmF5OworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5PiBwYXJjZWxfbGlzdDsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZS5FbXB0eT4gbnVsbGFibGVfcGFyY2VsX2xpc3Q7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxDb21waWxlckNoZWNrcz4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxDb21waWxlckNoZWNrcz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBDb21waWxlckNoZWNrcyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBDb21waWxlckNoZWNrcyBfYWlkbF9vdXQgPSBuZXcgQ29tcGlsZXJDaGVja3MoKTsKKyAgICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBDb21waWxlckNoZWNrc1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZXJDaGVja3NbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJvbmdCaW5kZXIoYmluZGVyKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0JpbmRlcihudWxsYWJsZV9iaW5kZXIpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQmluZGVyQXJyYXkoYmluZGVyX2FycmF5KTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUJpbmRlckFycmF5KG51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVCaW5kZXJMaXN0KGJpbmRlcl9saXN0KTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUJpbmRlckxpc3QobnVsbGFibGVfYmluZGVyX2xpc3QpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QocGZkLCAwKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KG51bGxhYmxlX3BmZCwgMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZEFycmF5KHBmZF9hcnJheSwgMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZEFycmF5KG51bGxhYmxlX3BmZF9hcnJheSwgMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZExpc3QocGZkX2xpc3QpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRMaXN0KG51bGxhYmxlX3BmZF9saXN0KTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KHBhcmNlbCwgMCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChudWxsYWJsZV9wYXJjZWwsIDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRBcnJheShwYXJjZWxfYXJyYXksIDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRBcnJheShudWxsYWJsZV9wYXJjZWxfYXJyYXksIDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRMaXN0KHBhcmNlbF9saXN0KTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkTGlzdChudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGJpbmRlciA9IF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX2JpbmRlciA9IF9haWRsX3BhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGJpbmRlcl9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVCaW5kZXJBcnJheSgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9iaW5kZXJfYXJyYXkgPSBfYWlkbF9wYXJjZWwuY3JlYXRlQmluZGVyQXJyYXkoKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgYmluZGVyX2xpc3QgPSBfYWlkbF9wYXJjZWwuY3JlYXRlQmluZGVyQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX2JpbmRlcl9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUJpbmRlckFycmF5TGlzdCgpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBwZmQgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX3BmZCA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgcGZkX2FycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgbnVsbGFibGVfcGZkX2FycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgcGZkX2xpc3QgPSBfYWlkbF9wYXJjZWwuY3JlYXRlVHlwZWRBcnJheUxpc3QoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgbnVsbGFibGVfcGZkX2xpc3QgPSBfYWlkbF9wYXJjZWwuY3JlYXRlVHlwZWRBcnJheUxpc3QoYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvci5DUkVBVE9SKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgcGFyY2VsID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkVtcHR5LkNSRUFUT1IpOworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBudWxsYWJsZV9wYXJjZWwgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIHBhcmNlbF9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX3BhcmNlbF9hcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIHBhcmNlbF9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIG51bGxhYmxlX3BhcmNlbF9saXN0ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkuQ1JFQVRPUik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBmZCk7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG51bGxhYmxlX3BmZCk7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBmZF9hcnJheSk7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG51bGxhYmxlX3BmZF9hcnJheSk7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKHBmZF9saXN0KTsKKyAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobnVsbGFibGVfcGZkX2xpc3QpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwYXJjZWwpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhudWxsYWJsZV9wYXJjZWwpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwYXJjZWxfYXJyYXkpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhudWxsYWJsZV9wYXJjZWxfYXJyYXkpOworICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhwYXJjZWxfbGlzdCk7CisgICAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKG51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgICAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICAgIGlmIChfdiA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgIGlmIChfdiBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisgICAgICAgIGludCBfbWFzayA9IDA7CisgICAgICAgIGZvciAoT2JqZWN0IG8gOiAoT2JqZWN0W10pIF92KSB7CisgICAgICAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhvKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX21hc2s7CisgICAgICB9CisgICAgICBpZiAoX3YgaW5zdGFuY2VvZiBqYXZhLnV0aWwuQ29sbGVjdGlvbikgeworICAgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgICBmb3IgKE9iamVjdCBvIDogKGphdmEudXRpbC5Db2xsZWN0aW9uKSBfdikgeworICAgICAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9tYXNrOworICAgICAgfQorICAgICAgaWYgKF92IGluc3RhbmNlb2YgYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSB7CisgICAgICAgIHJldHVybiAoKGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgX3YpLmRlc2NyaWJlQ29udGVudHMoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5qYXZhLmQKaW5kZXggMWRjNTI1Yi4uZjgyYjI2NCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmphdmEuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuamF2YS5kCkBAIC03LDQgKzcsOCBAQAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmJhMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmphdmEKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKK3B1YmxpYyBjbGFzcyBMaXN0T2ZJbnRlcmZhY2VzIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TGlzdE9mSW50ZXJmYWNlcz4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxMaXN0T2ZJbnRlcmZhY2VzPigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdE9mSW50ZXJmYWNlcyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgTGlzdE9mSW50ZXJmYWNlcyBfYWlkbF9vdXQgPSBuZXcgTGlzdE9mSW50ZXJmYWNlcygpOworICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdE9mSW50ZXJmYWNlc1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IExpc3RPZkludGVyZmFjZXNbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICB9CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgcmV0dXJuIF9tYXNrOworICB9CisgIHB1YmxpYyBpbnRlcmZhY2UgSUVtcHR5SW50ZXJmYWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCisgIHsKKyAgICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUVtcHR5SW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZQorICAgIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaW50ZXJmYWNlLAorICAgICAgICogZ2VuZXJhdGluZyBhIHByb3h5IGlmIG5lZWRlZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICAgIHsKKyAgICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UpaWluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLlByb3h5KG9iaik7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZQorICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRMaXN0T2ZJbnRlcmZhY2VzJElFbXB0eUludGVyZmFjZSIucmVwbGFjZSgnJCcsICcuJyk7CisgIH0KKyAgcHVibGljIGludGVyZmFjZSBJTXlJbnRlcmZhY2UgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJTXlJbnRlcmZhY2UuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlCisgICAgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG1ldGhvZFdpdGhJbnRlcmZhY2VzKGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZSwgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW4sIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9vdXQsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdF9pbm91dCwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2luLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICAgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UgaW50ZXJmYWNlLAorICAgICAgICogZ2VuZXJhdGluZyBhIHByb3h5IGlmIG5lZWRlZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICAgIHsKKyAgICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UpaWluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZS5TdHViLlByb3h5KG9iaik7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgICAgeworICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlczoKKyAgICAgICAgICB7CisgICAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX2FyZzA7CisgICAgICAgICAgICBfYXJnMCA9IGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViLmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBfYXJnMTsKKyAgICAgICAgICAgIF9hcmcxID0gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuYXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfYXJnMjsKKyAgICAgICAgICAgIF9hcmcyID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX2FyZzM7CisgICAgICAgICAgICBfYXJnMyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4oKTsKKyAgICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX2FyZzQ7CisgICAgICAgICAgICBfYXJnNCA9IGRhdGEuY3JlYXRlSW50ZXJmYWNlQXJyYXlMaXN0KGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF9hcmc1OworICAgICAgICAgICAgX2FyZzUgPSBkYXRhLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfYXJnNjsKKyAgICAgICAgICAgIF9hcmc2ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPigpOworICAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfYXJnNzsKKyAgICAgICAgICAgIF9hcmc3ID0gZGF0YS5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF9yZXN1bHQgPSB0aGlzLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmcwLCBfYXJnMSwgX2FyZzIsIF9hcmczLCBfYXJnNCwgX2FyZzUsIF9hcmc2LCBfYXJnNyk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUxpc3QoX3Jlc3VsdCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUxpc3QoX2FyZzMpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnRlcmZhY2VMaXN0KF9hcmc0KTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50ZXJmYWNlTGlzdChfYXJnNik7CisgICAgICAgICAgICByZXBseS53cml0ZUludGVyZmFjZUxpc3QoX2FyZzcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZQorICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBtZXRob2RXaXRoSW50ZXJmYWNlcyhhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZSwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0X2luLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3Rfb3V0LCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW5vdXQsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX3Jlc3VsdDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKGlmYWNlKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlU3Ryb25nSW50ZXJmYWNlKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlTGlzdChpZmFjZV9saXN0X2luKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlTGlzdChpZmFjZV9saXN0X2lub3V0KTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlTGlzdChudWxsYWJsZV9pZmFjZV9saXN0X2luKTsKKyAgICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlTGlzdChudWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9tZXRob2RXaXRoSW50ZXJmYWNlcywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkSW50ZXJmYWNlTGlzdChpZmFjZV9saXN0X291dCwgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIF9yZXBseS5yZWFkSW50ZXJmYWNlTGlzdChpZmFjZV9saXN0X2lub3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VMaXN0KG51bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICAgICAgX3JlcGx5LnJlYWRJbnRlcmZhY2VMaXN0KG51bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZS5TdHViOjphc0ludGVyZmFjZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbWV0aG9kV2l0aEludGVyZmFjZXMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJExpc3RPZkludGVyZmFjZXMkSU15SW50ZXJmYWNlIi5yZXBsYWNlKCckJywgJy4nKTsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBtZXRob2RXaXRoSW50ZXJmYWNlcyhhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2UsIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZSwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0X2luLCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3Rfb3V0LCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IGlmYWNlX2xpc3RfaW5vdXQsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X291dCwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIH0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVBhcmNlbGFibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgeworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0OworICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Q7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeVBhcmNlbGFibGU+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlQYXJjZWxhYmxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15UGFyY2VsYWJsZSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBNeVBhcmNlbGFibGUgX2FpZGxfb3V0ID0gbmV3IE15UGFyY2VsYWJsZSgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE15UGFyY2VsYWJsZVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlQYXJjZWxhYmxlW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3Ryb25nSW50ZXJmYWNlKGlmYWNlKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShudWxsYWJsZV9pZmFjZSk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VMaXN0KGlmYWNlX2xpc3QpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50ZXJmYWNlTGlzdChudWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgaWZhY2UgPSBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgbnVsbGFibGVfaWZhY2UgPSBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yi5hc0ludGVyZmFjZShfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgaWZhY2VfbGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgICAgbnVsbGFibGVfaWZhY2VfbGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIGphdmEudXRpbC5TdHJpbmdKb2luZXIgX2FpZGxfc2ogPSBuZXcgamF2YS51dGlsLlN0cmluZ0pvaW5lcigiLCAiLCAieyIsICJ9Iik7CisgICAgICBfYWlkbF9zai5hZGQoImlmYWNlOiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGlmYWNlKSkpOworICAgICAgX2FpZGxfc2ouYWRkKCJudWxsYWJsZV9pZmFjZTogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhudWxsYWJsZV9pZmFjZSkpKTsKKyAgICAgIF9haWRsX3NqLmFkZCgiaWZhY2VfbGlzdDogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhpZmFjZV9saXN0KSkpOworICAgICAgX2FpZGxfc2ouYWRkKCJudWxsYWJsZV9pZmFjZV9saXN0OiAiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKG51bGxhYmxlX2lmYWNlX2xpc3QpKSk7CisgICAgICByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15UGFyY2VsYWJsZSIgKyBfYWlkbF9zai50b1N0cmluZygpICA7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIE15UGFyY2VsYWJsZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIE15UGFyY2VsYWJsZSB0aGF0ID0gKE15UGFyY2VsYWJsZSlvdGhlcjsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhpZmFjZSwgdGhhdC5pZmFjZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhudWxsYWJsZV9pZmFjZSwgdGhhdC5udWxsYWJsZV9pZmFjZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhpZmFjZV9saXN0LCB0aGF0LmlmYWNlX2xpc3QpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMobnVsbGFibGVfaWZhY2VfbGlzdCwgdGhhdC5udWxsYWJsZV9pZmFjZV9saXN0KSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmRlZXBIYXNoQ29kZShqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2xpc3QsIG51bGxhYmxlX2lmYWNlX2xpc3QpLnRvQXJyYXkoKSk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTXlVbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CisgICAgLy8gdGFncyBmb3IgdW5pb24gZmllbGRzCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgaWZhY2UgPSAwOyAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIGlmYWNlOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IG51bGxhYmxlX2lmYWNlID0gMTsgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBudWxsYWJsZV9pZmFjZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpZmFjZV9saXN0ID0gMjsgIC8vIExpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IG51bGxhYmxlX2lmYWNlX2xpc3QgPSAzOyAgLy8gTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IG51bGxhYmxlX2lmYWNlX2xpc3Q7CisKKyAgICBwcml2YXRlIGludCBfdGFnOworICAgIHByaXZhdGUgT2JqZWN0IF92YWx1ZTsKKworICAgIHB1YmxpYyBNeVVuaW9uKCkgeworICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSA9IG51bGw7CisgICAgICB0aGlzLl90YWcgPSBpZmFjZTsKKyAgICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgTXlVbmlvbihhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpIHsKKyAgICAgIHJlYWRGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNeVVuaW9uKGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgICB0aGlzLl90YWcgPSBfdGFnOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUYWcoKSB7CisgICAgICByZXR1cm4gX3RhZzsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gaWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKGlmYWNlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgZ2V0SWZhY2UoKSB7CisgICAgICBfYXNzZXJ0VGFnKGlmYWNlKTsKKyAgICAgIHJldHVybiAoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgX3NldChpZmFjZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2U7CisKKyAgICBwdWJsaWMgc3RhdGljIE15VW5pb24gbnVsbGFibGVfaWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeVVuaW9uKG51bGxhYmxlX2lmYWNlLCBfdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgZ2V0TnVsbGFibGVfaWZhY2UoKSB7CisgICAgICBfYXNzZXJ0VGFnKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgIHJldHVybiAoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlKSBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVsbGFibGVfaWZhY2UoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIF92YWx1ZSkgeworICAgICAgX3NldChudWxsYWJsZV9pZmFjZSwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBMaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gaWZhY2VfbGlzdDsKKworICAgIHB1YmxpYyBzdGF0aWMgTXlVbmlvbiBpZmFjZV9saXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IE15VW5pb24oaWZhY2VfbGlzdCwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBnZXRJZmFjZV9saXN0KCkgeworICAgICAgX2Fzc2VydFRhZyhpZmFjZV9saXN0KTsKKyAgICAgIHJldHVybiAoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPikgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElmYWNlX2xpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfdmFsdWUpIHsKKyAgICAgIF9zZXQoaWZhY2VfbGlzdCwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBMaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKworICAgIHB1YmxpYyBzdGF0aWMgTXlVbmlvbiBudWxsYWJsZV9pZmFjZV9saXN0KGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX3ZhbHVlKSB7CisgICAgICByZXR1cm4gbmV3IE15VW5pb24obnVsbGFibGVfaWZhY2VfbGlzdCwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBnZXROdWxsYWJsZV9pZmFjZV9saXN0KCkgeworICAgICAgX2Fzc2VydFRhZyhudWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICAgIHJldHVybiAoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPikgX3ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bGxhYmxlX2lmYWNlX2xpc3QoamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBfdmFsdWUpIHsKKyAgICAgIF9zZXQobnVsbGFibGVfaWZhY2VfbGlzdCwgX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15VW5pb24+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlVbmlvbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNeVVuaW9uIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlVbmlvbihfYWlkbF9zb3VyY2UpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTXlVbmlvbltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlVbmlvbltfYWlkbF9zaXplXTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKSB7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX3RhZyk7CisgICAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICAgIGNhc2UgaWZhY2U6CisgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0ludGVyZmFjZShnZXRJZmFjZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG51bGxhYmxlX2lmYWNlOgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJvbmdJbnRlcmZhY2UoZ2V0TnVsbGFibGVfaWZhY2UoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9saXN0OgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VMaXN0KGdldElmYWNlX2xpc3QoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OgorICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRlcmZhY2VMaXN0KGdldE51bGxhYmxlX2lmYWNlX2xpc3QoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgICAgaW50IF9haWRsX3RhZzsKKyAgICAgIF9haWRsX3RhZyA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBzd2l0Y2ggKF9haWRsX3RhZykgeworICAgICAgY2FzZSBpZmFjZTogeworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuYXNJbnRlcmZhY2UoX2FpZGxfcGFyY2VsLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogeworICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWIuYXNJbnRlcmZhY2UoX2FpZGxfcGFyY2VsLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIF9zZXQoX2FpZGxfdGFnLCBfYWlkbF92YWx1ZSk7CisgICAgICAgIHJldHVybjsgfQorICAgICAgY2FzZSBpZmFjZV9saXN0OiB7CisgICAgICAgIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZT4gX2FpZGxfdmFsdWU7CisgICAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludGVyZmFjZUFycmF5TGlzdChhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UuU3R1Yjo6YXNJbnRlcmZhY2UpOworICAgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgICByZXR1cm47IH0KKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfbGlzdDogeworICAgICAgICBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgICAgICBfYWlkbF92YWx1ZSA9IF9haWRsX3BhcmNlbC5jcmVhdGVJbnRlcmZhY2VBcnJheUxpc3QoYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlLlN0dWI6OmFzSW50ZXJmYWNlKTsKKyAgICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOyB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmlvbjogdW5rbm93biB0YWc6ICIgKyBfYWlkbF90YWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgIGludCBfbWFzayA9IDA7CisgICAgICBzd2l0Y2ggKGdldFRhZygpKSB7CisgICAgICB9CisgICAgICByZXR1cm4gX21hc2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHN3aXRjaCAoX3RhZykgeworICAgICAgY2FzZSBpZmFjZTogcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVVuaW9uLmlmYWNlKCIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcoZ2V0SWZhY2UoKSkpICsgIikiOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVVuaW9uLm51bGxhYmxlX2lmYWNlKCIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcoZ2V0TnVsbGFibGVfaWZhY2UoKSkpICsgIikiOworICAgICAgY2FzZSBpZmFjZV9saXN0OiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15VW5pb24uaWZhY2VfbGlzdCgiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGdldElmYWNlX2xpc3QoKSkpICsgIikiOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiByZXR1cm4gImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLk15VW5pb24ubnVsbGFibGVfaWZhY2VfbGlzdCgiICsgKGphdmEudXRpbC5PYmplY3RzLnRvU3RyaW5nKGdldE51bGxhYmxlX2lmYWNlX2xpc3QoKSkpICsgIikiOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBmaWVsZDogIiArIF90YWcpOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBNeVVuaW9uKSkgcmV0dXJuIGZhbHNlOworICAgICAgTXlVbmlvbiB0aGF0ID0gKE15VW5pb24pb3RoZXI7CisgICAgICBpZiAoX3RhZyAhPSB0aGF0Ll90YWcpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhfdmFsdWUsIHRoYXQuX3ZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmRlZXBIYXNoQ29kZShqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChfdGFnLCBfdmFsdWUpLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9hc3NlcnRUYWcoaW50IHRhZykgeworICAgICAgaWYgKGdldFRhZygpICE9IHRhZykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYWQgYWNjZXNzOiAiICsgX3RhZ1N0cmluZyh0YWcpICsgIiwgIiArIF90YWdTdHJpbmcoZ2V0VGFnKCkpICsgIiBpcyBhdmFpbGFibGUuIik7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgX3RhZ1N0cmluZyhpbnQgX3RhZykgeworICAgICAgc3dpdGNoIChfdGFnKSB7CisgICAgICBjYXNlIGlmYWNlOiByZXR1cm4gImlmYWNlIjsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiAibnVsbGFibGVfaWZhY2UiOworICAgICAgY2FzZSBpZmFjZV9saXN0OiByZXR1cm4gImlmYWNlX2xpc3QiOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiByZXR1cm4gIm51bGxhYmxlX2lmYWNlX2xpc3QiOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBmaWVsZDogIiArIF90YWcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfc2V0KGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgICB0aGlzLl90YWcgPSBfdGFnOworICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODcwMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmphdmEuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YQppbmRleCBhMjgyNGVlLi40NmExMWU3IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOwogICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgIHRyeSB7Ci0gICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuOworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGZpZWxkID0gX2FpZGxfcGFyY2VsLnJlYWRTdHJpbmcoKTsKICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YQppbmRleCA5YzFiYjEzLi5jNTg4YmUxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YQpAQCAtNTMsMzcgKzUzLDE5IEBACiAgICAgX2FpZGxfcGFyY2VsLndyaXRlRmxvYXRBcnJheShmbG9hdEFycmF5KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVCeXRlKGJ5dGVWYWx1ZSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZUFycmF5KGJ5dGVBcnJheSk7Ci0gICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KCgoYm9vbGVhblZhbHVlKT8oMSk6KDApKSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlQm9vbGVhbihib29sZWFuVmFsdWUpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUJvb2xlYW5BcnJheShib29sZWFuQXJyYXkpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZyhzdHJpbmdWYWx1ZSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXkpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZ0xpc3Qoc3RyaW5nTGlzdCk7Ci0gICAgaWYgKChwYXJjZWxhYmxlVmFsdWUhPW51bGwpKSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMSk7Ci0gICAgICBwYXJjZWxhYmxlVmFsdWUud3JpdGVUb1BhcmNlbChfYWlkbF9wYXJjZWwsIDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKLSAgICB9CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QocGFyY2VsYWJsZVZhbHVlLCAwKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZEFycmF5KHBhcmNlbGFibGVBcnJheSwgMCk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGVudW1WYWx1ZSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50QXJyYXkoZW51bUFycmF5KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmdBcnJheShudWxsQXJyYXkpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZ0xpc3QobnVsbExpc3QpOwotICAgIGlmICgocGFyY2VsYWJsZUdlbmVyaWMhPW51bGwpKSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMSk7Ci0gICAgICBwYXJjZWxhYmxlR2VuZXJpYy53cml0ZVRvUGFyY2VsKF9haWRsX3BhcmNlbCwgMCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOwotICAgIH0KLSAgICBpZiAoKHVuaW9uVmFsdWUhPW51bGwpKSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMSk7Ci0gICAgICB1bmlvblZhbHVlLndyaXRlVG9QYXJjZWwoX2FpZGxfcGFyY2VsLCAwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7Ci0gICAgfQorICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KHBhcmNlbGFibGVHZW5lcmljLCAwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdCh1bmlvblZhbHVlLCAwKTsKICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOwpAQCAtOTQsNyArNzYsNyBAQAogICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgdHJ5IHsKLSAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm47CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgaW50VmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKQEAgLTExNiw3ICs5OCw3IEBACiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgYnl0ZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUJ5dGVBcnJheSgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKLSAgICAgIGJvb2xlYW5WYWx1ZSA9ICgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKTsKKyAgICAgIGJvb2xlYW5WYWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkQm9vbGVhbigpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGJvb2xlYW5BcnJheSA9IF9haWRsX3BhcmNlbC5jcmVhdGVCb29sZWFuQXJyYXkoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CkBAIC0xMjYsMTIgKzEwOCw3IEBACiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgc3RyaW5nTGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVTdHJpbmdBcnJheUxpc3QoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIHBhcmNlbGFibGVWYWx1ZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBwYXJjZWxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgfQorICAgICAgcGFyY2VsYWJsZVZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuQ1JFQVRPUik7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgcGFyY2VsYWJsZUFycmF5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZVR5cGVkQXJyYXkoYW5kcm9pZC5haWRsLnRlc3RzLk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLkNSRUFUT1IpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKQEAgLTE0MywxOSArMTIwLDkgQEAKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBudWxsTGlzdCA9IF9haWRsX3BhcmNlbC5jcmVhdGVTdHJpbmdBcnJheUxpc3QoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIHBhcmNlbGFibGVHZW5lcmljID0gYW5kcm9pZC5haWRsLnRlc3RzLkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBwYXJjZWxhYmxlR2VuZXJpYyA9IG51bGw7Ci0gICAgICB9CisgICAgICBwYXJjZWxhYmxlR2VuZXJpYyA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5DUkVBVE9SKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIHVuaW9uVmFsdWUgPSBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdW5pb25WYWx1ZSA9IG51bGw7Ci0gICAgICB9CisgICAgICB1bmlvblZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUik7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CiAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKQEAgLTIwMiw4ICsxNjksNyBAQAogICB9CiAgIHByaXZhdGUgaW50IGRlc2NyaWJlQ29udGVudHMoT2JqZWN0IF92KSB7CiAgICAgaWYgKF92ID09IG51bGwpIHJldHVybiAwOwotICAgIENsYXNzPD8+IF9jbGF6eiA9IF92LmdldENsYXNzKCk7Ci0gICAgaWYgKF9jbGF6ei5pc0FycmF5KCkgJiYgX2NsYXp6LmdldENvbXBvbmVudFR5cGUoKSA9PSBPYmplY3QuY2xhc3MpIHsKKyAgICBpZiAoX3YgaW5zdGFuY2VvZiBPYmplY3RbXSkgewogICAgICAgaW50IF9tYXNrID0gMDsKICAgICAgIGZvciAoT2JqZWN0IG8gOiAoT2JqZWN0W10pIF92KSB7CiAgICAgICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobyk7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmphdmEuZAppbmRleCA5YTE5ZWI2Li4wMTNlNjJjIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuamF2YS5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5qYXZhLmQKQEAgLTQsNCArNCw3IEBACiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzZiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworcHVibGljIGNsYXNzIFJlY3Vyc2l2ZUxpc3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgcHVibGljIGludCB2YWx1ZSA9IDA7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuUmVjdXJzaXZlTGlzdCBuZXh0OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPFJlY3Vyc2l2ZUxpc3Q+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UmVjdXJzaXZlTGlzdD4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlY3Vyc2l2ZUxpc3QgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIFJlY3Vyc2l2ZUxpc3QgX2FpZGxfb3V0ID0gbmV3IFJlY3Vyc2l2ZUxpc3QoKTsKKyAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlY3Vyc2l2ZUxpc3RbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBSZWN1cnNpdmVMaXN0W19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCh2YWx1ZSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QobmV4dCwgMCk7CisgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICB9CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICB2YWx1ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgbmV4dCA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QuQ1JFQVRPUik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgIH0KKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICB9CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICBpbnQgX21hc2sgPSAwOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMobmV4dCk7CisgICAgcmV0dXJuIF9tYXNrOworICB9CisgIHByaXZhdGUgaW50IGRlc2NyaWJlQ29udGVudHMoT2JqZWN0IF92KSB7CisgICAgaWYgKF92ID09IG51bGwpIHJldHVybiAwOworICAgIGlmIChfdiBpbnN0YW5jZW9mIGFuZHJvaWQub3MuUGFyY2VsYWJsZSkgeworICAgICAgcmV0dXJuICgoYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSBfdikuZGVzY3JpYmVDb250ZW50cygpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjZjNGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmphdmEKaW5kZXggODA2YTYzNC4uYjkwZmUyYyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5qYXZhCkBAIC0zOSw3ICszOSw5IEBACiAgIHB1YmxpYyBsb25nIGludDY0X21heCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMOwogICBwdWJsaWMgaW50IGhleEludDMyX25lZ18xID0gLTE7CiAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgaWJpbmRlcjsKKyAgcHVibGljIGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSBlbXB0eTsKICAgLy8gQ29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byAxCisgIHB1YmxpYyBieXRlW10gaW50OF8xID0gezEsIDEsIDEsIDEsIDF9OwogICBwdWJsaWMgaW50W10gaW50MzJfMSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKICAgcHVibGljIGxvbmdbXSBpbnQ2NF8xID0gezFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMfTsKICAgcHVibGljIGludCBoZXhJbnQzMl9wb3NfMSA9IDE7CkBAIC05MCwxMyArOTIsMTMgQEAKICAgICBfYWlkbF9wYXJjZWwud3JpdGVCeXRlKGJ5dGVEZWZhdWx0c1RvRm91cik7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGludERlZmF1bHRzVG9GaXZlKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7Ci0gICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KCgoYm9vbGVhbkRlZmF1bHRzVG9UcnVlKT8oMSk6KDApKSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlQm9vbGVhbihib29sZWFuRGVmYXVsdHNUb1RydWUpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgoKGludCljaGFyRGVmYXVsdHNUb0MpKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVGbG9hdChmbG9hdERlZmF1bHRzVG9QaSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlRG91YmxlKGRvdWJsZVdpdGhEZWZhdWx0KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnRBcnJheShhcnJheURlZmF1bHRzVG8xMjMpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludEFycmF5KGFycmF5RGVmYXVsdHNUb0VtcHR5KTsKLSAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoKChib29sRGVmYXVsdCk/KDEpOigwKSkpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUJvb2xlYW4oYm9vbERlZmF1bHQpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUoYnl0ZURlZmF1bHQpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludChpbnREZWZhdWx0KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGxvbmdEZWZhdWx0KTsKQEAgLTExMCw2ICsxMTIsOCBAQAogICAgIF9haWRsX3BhcmNlbC53cml0ZUxvbmcoaW50NjRfbWF4KTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoaGV4SW50MzJfbmVnXzEpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cm9uZ0JpbmRlcihpYmluZGVyKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChlbXB0eSwgMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZUFycmF5KGludDhfMSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50QXJyYXkoaW50MzJfMSk7CiAgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZ0FycmF5KGludDY0XzEpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUludChoZXhJbnQzMl9wb3NfMSk7CkBAIC0xMjcsMjAgKzEzMSw4IEBACiAgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKGFkZFN0cmluZzEpOwogICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZyhhZGRTdHJpbmcyKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoc2hvdWxkU2V0Qml0MEFuZEJpdDIpOwotICAgIGlmICgodSE9bnVsbCkpIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgIHUud3JpdGVUb1BhcmNlbChfYWlkbF9wYXJjZWwsIDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKLSAgICB9Ci0gICAgaWYgKChzaG91bGRCZUNvbnN0UzEhPW51bGwpKSB7Ci0gICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMSk7Ci0gICAgICBzaG91bGRCZUNvbnN0UzEud3JpdGVUb1BhcmNlbChfYWlkbF9wYXJjZWwsIDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKLSAgICB9CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QodSwgMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3Qoc2hvdWxkQmVDb25zdFMxLCAwKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoZGVmYXVsdFdpdGhGb28pOwogICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOwogICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKQEAgLTE1Miw3ICsxNDQsNyBAQAogICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CiAgICAgdHJ5IHsKLSAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm47CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwogICAgICAgc2hvdWxkQ29udGFpblRocmVlRnMgPSBfYWlkbF9wYXJjZWwuY3JlYXRlSW50QXJyYXkoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CkBAIC0xODAsNyArMTcyLDcgQEAKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4gPSBfYWlkbF9wYXJjZWwucmVhZExvbmcoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBib29sZWFuRGVmYXVsdHNUb1RydWUgPSAoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSk7CisgICAgICBib29sZWFuRGVmYXVsdHNUb1RydWUgPSBfYWlkbF9wYXJjZWwucmVhZEJvb2xlYW4oKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBjaGFyRGVmYXVsdHNUb0MgPSAoY2hhcilfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKQEAgLTE5Miw3ICsxODQsNyBAQAogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGFycmF5RGVmYXVsdHNUb0VtcHR5ID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUludEFycmF5KCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwotICAgICAgYm9vbERlZmF1bHQgPSAoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSk7CisgICAgICBib29sRGVmYXVsdCA9IF9haWRsX3BhcmNlbC5yZWFkQm9vbGVhbigpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGJ5dGVEZWZhdWx0ID0gX2FpZGxfcGFyY2VsLnJlYWRCeXRlKCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwpAQCAtMjIwLDYgKzIxMiwxMCBAQAogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGliaW5kZXIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGVtcHR5ID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUuRW1wdHkuQ1JFQVRPUik7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50OF8xID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUJ5dGVBcnJheSgpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGludDMyXzEgPSBfYWlkbF9wYXJjZWwuY3JlYXRlSW50QXJyYXkoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBpbnQ2NF8xID0gX2FpZGxfcGFyY2VsLmNyZWF0ZUxvbmdBcnJheSgpOwpAQCAtMjU0LDE5ICsyNTAsOSBAQAogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIHNob3VsZFNldEJpdDBBbmRCaXQyID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIHUgPSBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdSA9IG51bGw7Ci0gICAgICB9CisgICAgICB1ID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUik7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwotICAgICAgaWYgKCgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKSkgewotICAgICAgICBzaG91bGRCZUNvbnN0UzEgPSBhbmRyb2lkLmFpZGwudGVzdHMuVW5pb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc2hvdWxkQmVDb25zdFMxID0gbnVsbDsKLSAgICAgIH0KKyAgICAgIHNob3VsZEJlQ29uc3RTMSA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLlVuaW9uLkNSRUFUT1IpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIGRlZmF1bHRXaXRoRm9vID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICB9IGZpbmFsbHkgewpAQCAtMzE1LDYgKzMwMSw4IEBACiAgICAgX2FpZGxfc2ouYWRkKCJpbnQ2NF9tYXg6ICIgKyAoaW50NjRfbWF4KSk7CiAgICAgX2FpZGxfc2ouYWRkKCJoZXhJbnQzMl9uZWdfMTogIiArIChoZXhJbnQzMl9uZWdfMSkpOwogICAgIF9haWRsX3NqLmFkZCgiaWJpbmRlcjogIiArIChqYXZhLnV0aWwuT2JqZWN0cy50b1N0cmluZyhpYmluZGVyKSkpOworICAgIF9haWRsX3NqLmFkZCgiZW1wdHk6ICIgKyAoamF2YS51dGlsLk9iamVjdHMudG9TdHJpbmcoZW1wdHkpKSk7CisgICAgX2FpZGxfc2ouYWRkKCJpbnQ4XzE6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhpbnQ4XzEpKSk7CiAgICAgX2FpZGxfc2ouYWRkKCJpbnQzMl8xOiAiICsgKGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoaW50MzJfMSkpKTsKICAgICBfYWlkbF9zai5hZGQoImludDY0XzE6ICIgKyAoamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhpbnQ2NF8xKSkpOwogICAgIF9haWRsX3NqLmFkZCgiaGV4SW50MzJfcG9zXzE6ICIgKyAoaGV4SW50MzJfcG9zXzEpKTsKQEAgLTM3Niw2ICszNjQsOCBAQAogICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhpbnQ2NF9tYXgsIHRoYXQuaW50NjRfbWF4KSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhoZXhJbnQzMl9uZWdfMSwgdGhhdC5oZXhJbnQzMl9uZWdfMSkpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaWJpbmRlciwgdGhhdC5pYmluZGVyKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhlbXB0eSwgdGhhdC5lbXB0eSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaW50OF8xLCB0aGF0LmludDhfMSkpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWphdmEudXRpbC5PYmplY3RzLmRlZXBFcXVhbHMoaW50MzJfMSwgdGhhdC5pbnQzMl8xKSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICghamF2YS51dGlsLk9iamVjdHMuZGVlcEVxdWFscyhpbnQ2NF8xLCB0aGF0LmludDY0XzEpKSByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFqYXZhLnV0aWwuT2JqZWN0cy5kZWVwRXF1YWxzKGhleEludDMyX3Bvc18xLCB0aGF0LmhleEludDMyX3Bvc18xKSkgcmV0dXJuIGZhbHNlOwpAQCAtNDAxLDExICszOTEsMTIgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gamF2YS51dGlsLkFycmF5cy5kZWVwSGFzaENvZGUoamF2YS51dGlsLkFycmF5cy5hc0xpc3Qoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKS50b0FycmF5KCkpOworICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmRlZXBIYXNoQ29kZShqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pLnRvQXJyYXkoKSk7CiAgIH0KICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICBpbnQgX21hc2sgPSAwOworICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHMoZW1wdHkpOwogICAgIF9tYXNrIHw9IGRlc2NyaWJlQ29udGVudHModSk7CiAgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhzaG91bGRCZUNvbnN0UzEpOwogICAgIHJldHVybiBfbWFzazsKQEAgLTQxNyw0ICs0MDgsNjUgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBzZW5kIGFuIGVtcHR5IHBhcmNlbGFibGUKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxFbXB0eT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxFbXB0eT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbXB0eSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBFbXB0eSBfYWlkbF9vdXQgPSBuZXcgRW1wdHkoKTsKKyAgICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBFbXB0eVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlbX2FpZGxfc2l6ZV07CisgICAgICB9CisgICAgfTsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICAgIHsKKyAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgICAgfQorICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyIF9haWRsX3NqID0gbmV3IGphdmEudXRpbC5TdHJpbmdKb2luZXIoIiwgIiwgInsiLCAifSIpOworICAgICAgcmV0dXJuICJhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUuRW1wdHkiICsgX2FpZGxfc2oudG9TdHJpbmcoKSAgOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7CisgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBFbXB0eSkpIHJldHVybiBmYWxzZTsKKyAgICAgIEVtcHR5IHRoYXQgPSAoRW1wdHkpb3RoZXI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGphdmEudXRpbC5BcnJheXMuZGVlcEhhc2hDb2RlKGphdmEudXRpbC5BcnJheXMuYXNMaXN0KCkudG9BcnJheSgpKTsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5qYXZhCmluZGV4IDJlMWRlZjIuLjUwNjg4YTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uamF2YQpAQCAtMiw3ICsyLDYgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOwotCiBwdWJsaWMgZmluYWwgY2xhc3MgVW5pb24gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAvLyB0YWdzIGZvciB1bmlvbiBmaWVsZHMKICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbnMgPSAwOyAgLy8gaW50W10gbnM7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuamF2YQppbmRleCBiYTAyNWFkLi45NDFjOTQ3IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmphdmEKQEAgLTIsNyArMiw2IEBACiAgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgogICovCiBwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKLQogcHVibGljIGZpbmFsIGNsYXNzIFVuaW9uV2l0aEZkIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKICAgLy8gdGFncyBmb3IgdW5pb24gZmllbGRzCiAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IG51bSA9IDA7ICAvLyBpbnQgbnVtOwpAQCAtNzksMTMgKzc4LDcgQEAKICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChnZXROdW0oKSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHBmZDoKLSAgICAgIGlmICgoZ2V0UGZkKCkhPW51bGwpKSB7Ci0gICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgICAgZ2V0UGZkKCkud3JpdGVUb1BhcmNlbChfYWlkbF9wYXJjZWwsIDApOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKLSAgICAgIH0KKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KGdldFBmZCgpLCAwKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQpAQCAtMTAxLDEyICs5NCw3IEBACiAgICAgICByZXR1cm47IH0KICAgICBjYXNlIHBmZDogewogICAgICAgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBfYWlkbF92YWx1ZTsKLSAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKLSAgICAgICAgX2FpZGxfdmFsdWUgPSBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChfYWlkbF9wYXJjZWwpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIF9haWRsX3ZhbHVlID0gbnVsbDsKLSAgICAgIH0KKyAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOwogICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKICAgICAgIHJldHVybjsgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NjQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb247CitwdWJsaWMgY2xhc3MgRXh0ZW5kYWJsZVBhcmNlbGFibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgcHVibGljIGludCBhID0gMDsKKyAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgYjsKKyAgcHVibGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZUhvbGRlciBleHQgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlSG9sZGVyKGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1NUQUJJTElUWV9MT0NBTCk7CisgIHB1YmxpYyBsb25nIGMgPSAwTDsKKyAgcHVibGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZUhvbGRlciBleHQyID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZUhvbGRlcihhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9TVEFCSUxJVFlfTE9DQUwpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEV4dGVuZGFibGVQYXJjZWxhYmxlPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEV4dGVuZGFibGVQYXJjZWxhYmxlPigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXh0ZW5kYWJsZVBhcmNlbGFibGUgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIEV4dGVuZGFibGVQYXJjZWxhYmxlIF9haWRsX291dCA9IG5ldyBFeHRlbmRhYmxlUGFyY2VsYWJsZSgpOworICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXh0ZW5kYWJsZVBhcmNlbGFibGVbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBFeHRlbmRhYmxlUGFyY2VsYWJsZVtfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoYSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKGIpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVR5cGVkT2JqZWN0KGV4dCwgMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlTG9uZyhjKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVUeXBlZE9iamVjdChleHQyLCAwKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGEgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cmluZygpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKKyAgICAgICAgZXh0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7CisgICAgICB9CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYyA9IF9haWRsX3BhcmNlbC5yZWFkTG9uZygpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGlmICgoMCE9X2FpZGxfcGFyY2VsLnJlYWRJbnQoKSkpIHsKKyAgICAgICAgZXh0Mi5yZWFkRnJvbVBhcmNlbChfYWlkbF9wYXJjZWwpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICBfbWFzayB8PSBkZXNjcmliZUNvbnRlbnRzKGV4dCk7CisgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhleHQyKTsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaWYgKF92IGluc3RhbmNlb2YgYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSB7CisgICAgICByZXR1cm4gKChhbmRyb2lkLm9zLlBhcmNlbGFibGUpIF92KS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgfQorICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmphdmEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGVlMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmphdmEuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU2YjkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbjsKK3B1YmxpYyBjbGFzcyBNeUV4dCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgaW50IGEgPSAwOworICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15RXh0PiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15RXh0PigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTXlFeHQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIE15RXh0IF9haWRsX291dCA9IG5ldyBNeUV4dCgpOworICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTXlFeHRbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeUV4dFtfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoYSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKGIpOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYiA9IF9haWRsX3BhcmNlbC5yZWFkU3RyaW5nKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIk92ZXJmbG93IGluIHRoZSBzaXplIG9mIHBhcmNlbGFibGUiKTsKKyAgICAgIH0KKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICB9CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICBpbnQgX21hc2sgPSAwOworICAgIHJldHVybiBfbWFzazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExZWZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFjYjFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb247CitwdWJsaWMgY2xhc3MgTXlFeHQyIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCit7CisgIHB1YmxpYyBpbnQgYSA9IDA7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0IGI7CisgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8TXlFeHQyPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15RXh0Mj4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE15RXh0MiBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgTXlFeHQyIF9haWRsX291dCA9IG5ldyBNeUV4dDIoKTsKKyAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE15RXh0MltdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IE15RXh0MltfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoYSk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QoYiwgMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlU3RyaW5nKGMpOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgYiA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dC5DUkVBVE9SKTsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICBjID0gX2FpZGxfcGFyY2VsLnJlYWRTdHJpbmcoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgX21hc2sgfD0gZGVzY3JpYmVDb250ZW50cyhiKTsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHJpdmF0ZSBpbnQgZGVzY3JpYmVDb250ZW50cyhPYmplY3QgX3YpIHsKKyAgICBpZiAoX3YgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgaWYgKF92IGluc3RhbmNlb2YgYW5kcm9pZC5vcy5QYXJjZWxhYmxlKSB7CisgICAgICByZXR1cm4gKChhbmRyb2lkLm9zLlBhcmNlbGFibGUpIF92KS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgfQorICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzk5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmphdmEuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhNDg1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uOworcHVibGljIGNsYXNzIE15RXh0TGlrZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgaW50IGEgPSAwOworICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPE15RXh0TGlrZT4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxNeUV4dExpa2U+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUV4dExpa2UgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIE15RXh0TGlrZSBfYWlkbF9vdXQgPSBuZXcgTXlFeHRMaWtlKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUV4dExpa2VbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBNeUV4dExpa2VbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KGEpOworICAgIF9haWRsX3BhcmNlbC53cml0ZVN0cmluZyhiKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGEgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIGIgPSBfYWlkbF9wYXJjZWwucmVhZFN0cmluZygpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmODUyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RiOWRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkOworcHVibGljIGNsYXNzIERlZXBseU5lc3RlZCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQoreworICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPERlZXBseU5lc3RlZD4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxEZWVwbHlOZXN0ZWQ+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWVwbHlOZXN0ZWQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9zb3VyY2UpIHsKKyAgICAgIERlZXBseU5lc3RlZCBfYWlkbF9vdXQgPSBuZXcgRGVlcGx5TmVzdGVkKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWVwbHlOZXN0ZWRbXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBEZWVwbHlOZXN0ZWRbX2FpZGxfc2l6ZV07CisgICAgfQorICB9OworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwsIGludCBfYWlkbF9mbGFnKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoMCk7CisgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICB9CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgcmV0dXJuIF9tYXNrOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgLy8gQ2FuIHJlZmVyZW5jZSBkZWVwbHkgbmVzdGVkIHR5cGUgb2YgYSBzaWJsaW5nIHR5cGUuCisgICAgcHVibGljIGJ5dGUgZSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkLkIuQy5ELkUuT0s7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxBPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEE+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQSBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBBIF9haWRsX291dCA9IG5ldyBBKCk7CisgICAgICAgIF9haWRsX291dC5yZWFkRnJvbVBhcmNlbChfYWlkbF9zb3VyY2UpOworICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQVtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgQVtfYWlkbF9zaXplXTsKKyAgICAgIH0KKyAgICB9OworICAgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUoZSk7CisgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgaW50IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CisgICAgICAgIGUgPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCisgIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEI+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Qj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBCIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgIEIgX2FpZGxfb3V0ID0gbmV3IEIoKTsKKyAgICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBCW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCW19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgICAgfQorICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgcmV0dXJuIF9tYXNrOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEMgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgICB7CisgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEM+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Qz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQyBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICAgIEMgX2FpZGxfb3V0ID0gbmV3IEMoKTsKKyAgICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ1tdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBDW19haWRsX3NpemVdOworICAgICAgICB9CisgICAgICB9OworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICAgIHsKKyAgICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOworICAgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgICB9CisgICAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgICB7CisgICAgICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICAgIH0KKyAgICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICBpbnQgX21hc2sgPSAwOworICAgICAgICByZXR1cm4gX21hc2s7CisgICAgICB9CisgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEQgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKKyAgICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxEPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPEQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBEIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICAgICAgICBEIF9haWRsX291dCA9IG5ldyBEKCk7CisgICAgICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgICAgICAgfQorICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBEW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRFtfYWlkbF9zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCwgaW50IF9haWRsX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKKyAgICAgICAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICAgICAgICB7CisgICAgICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgICAgICByZXR1cm4gX21hc2s7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEUgeworICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPSyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YS5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3NmFiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmphdmEgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkY2UzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkOworcHVibGljIGludGVyZmFjZSBJTmVzdGVkU2VydmljZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSU5lc3RlZFNlcnZpY2UuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UKKyAgeworICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQgZmxpcFN0YXR1cyhhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkIHApIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhieXRlIHN0YXR1cywgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2sgY2IpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlCisgIHsKKyAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBTdHViKCkKKyAgICB7CisgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UgaW50ZXJmYWNlLAorICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgeworICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UpKSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlKWlpbik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuU3R1Yi5Qcm94eShvYmopOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2ZsaXBTdGF0dXM6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZC5DUkVBVE9SKTsKKyAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuUmVzdWx0IF9yZXN1bHQgPSB0aGlzLmZsaXBTdGF0dXMoX2FyZzApOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9yZXN1bHQsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9mbGlwU3RhdHVzV2l0aENhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgYnl0ZSBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZEJ5dGUoKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayBfYXJnMTsKKyAgICAgICAgICBfYXJnMSA9IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrLlN0dWIuYXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgdGhpcy5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKF9hcmcwLCBfYXJnMSk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlCisgICAgeworICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICB7CisgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICB7CisgICAgICAgIHJldHVybiBtUmVtb3RlOworICAgICAgfQorICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICB7CisgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLlJlc3VsdCBmbGlwU3RhdHVzKGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQgX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3QocCwgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2ZsaXBTdGF0dXMsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQuQ1JFQVRPUik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhieXRlIHN0YXR1cywgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2sgY2IpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJ5dGUoc3RhdHVzKTsKKyAgICAgICAgICBfZGF0YS53cml0ZVN0cm9uZ0ludGVyZmFjZShjYik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2ssIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9mbGlwU3RhdHVzID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9mbGlwU3RhdHVzV2l0aENhbGxiYWNrID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSk7CisgIH0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJG5lc3RlZCRJTmVzdGVkU2VydmljZSIucmVwbGFjZSgnJCcsICcuJyk7CisgIHB1YmxpYyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLlJlc3VsdCBmbGlwU3RhdHVzKGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgdm9pZCBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKGJ5dGUgc3RhdHVzLCBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayBjYikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3VsdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQorICB7CisgICAgcHVibGljIGJ5dGUgc3RhdHVzID0gYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0s7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxSZXN1bHQ+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UmVzdWx0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJlc3VsdCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgICBSZXN1bHQgX2FpZGxfb3V0ID0gbmV3IFJlc3VsdCgpOworICAgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgICAgcmV0dXJuIF9haWRsX291dDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJlc3VsdFtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0W19haWRsX3NpemVdOworICAgICAgfQorICAgIH07CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgICB7CisgICAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgICAgX2FpZGxfcGFyY2VsLndyaXRlQnl0ZShzdGF0dXMpOworICAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgICAgeworICAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgICBzdGF0dXMgPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiAoSW50ZWdlci5NQVhfVkFMVUUgLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgaW50IF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBfbWFzazsKKyAgICB9CisgIH0KKyAgcHVibGljIGludGVyZmFjZSBJQ2FsbGJhY2sgZXh0ZW5kcyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKKyAgeworICAgIC8qKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJQ2FsbGJhY2suICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2sKKyAgICB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZG9uZShieXRlIHN0YXR1cykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKyAgICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrCisgICAgeworICAgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICAgIHB1YmxpYyBTdHViKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgICB9CisgICAgICAvKioKKyAgICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgICB7CisgICAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrKSkpIHsKKyAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjaylpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5JQ2FsbGJhY2suU3R1Yi5Qcm94eShvYmopOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZG9uZToKKyAgICAgICAgICB7CisgICAgICAgICAgICBieXRlIF9hcmcwOworICAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRCeXRlKCk7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOworICAgICAgICAgICAgdGhpcy5kb25lKF9hcmcwKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjaworICAgICAgeworICAgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgICBQcm94eShhbmRyb2lkLm9zLklCaW5kZXIgcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBERVNDUklQVE9SOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBkb25lKGJ5dGUgc3RhdHVzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVCeXRlKHN0YXR1cyk7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fZG9uZSwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2RvbmUgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJHRlc3RzJG5lc3RlZCRJTmVzdGVkU2VydmljZSRJQ2FsbGJhY2siLnJlcGxhY2UoJyQnLCAnLicpOworICAgIHB1YmxpYyB2b2lkIGRvbmUoYnl0ZSBzdGF0dXMpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhOWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkMmZjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuICBETyBOT1QgTU9ESUZZLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQ7CitwdWJsaWMgY2xhc3MgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgcHVibGljIGJ5dGUgc3RhdHVzID0gYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0s7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsYWJsZVdpdGhOZXN0ZWQ+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsYWJsZVdpdGhOZXN0ZWQ+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxhYmxlV2l0aE5lc3RlZCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgX2FpZGxfb3V0ID0gbmV3IFBhcmNlbGFibGVXaXRoTmVzdGVkKCk7CisgICAgICBfYWlkbF9vdXQucmVhZEZyb21QYXJjZWwoX2FpZGxfc291cmNlKTsKKyAgICAgIHJldHVybiBfYWlkbF9vdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxhYmxlV2l0aE5lc3RlZFtdIG5ld0FycmF5KGludCBfYWlkbF9zaXplKSB7CisgICAgICByZXR1cm4gbmV3IFBhcmNlbGFibGVXaXRoTmVzdGVkW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUoc3RhdHVzKTsKKyAgICBpbnQgX2FpZGxfZW5kX3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfZW5kX3Bvcyk7CisgIH0KKyAgcHVibGljIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsKQorICB7CisgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKKyAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB0cnkgeworICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHRocm93IG5ldyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24oIlBhcmNlbGFibGUgdG9vIHNtYWxsIik7OworICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKKyAgICAgIHN0YXR1cyA9IF9haWRsX3BhcmNlbC5yZWFkQnl0ZSgpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gKEludGVnZXIuTUFYX1ZBTFVFIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSkgeworICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJPdmVyZmxvdyBpbiB0aGUgc2l6ZSBvZiBwYXJjZWxhYmxlIik7CisgICAgICB9CisgICAgICBfYWlkbF9wYXJjZWwuc2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgfQorICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgaW50IF9tYXNrID0gMDsKKyAgICByZXR1cm4gX21hc2s7CisgIH0KKyAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFN0YXR1cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9LID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTk9UX09LID0gMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3YThjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzYWQxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbjsKK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RlY3RlZCBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSVByb3RlY3RlZC4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZAorICB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFBlcm1pc3Npb25Qcm90ZWN0ZWQoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkCisgIHsKKyAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgIHB1YmxpYyBTdHViKCkKKyAgICB7CisgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQgaW50ZXJmYWNlLAorICAgICAqIGdlbmVyYXRpbmcgYSBwcm94eSBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgeworICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQpKSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkKWlpbik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQuU3R1Yi5Qcm94eShvYmopOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgbmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuUGVybWlzc2lvblByb3RlY3RlZCgpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGw6CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkpJiZ0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVklCUkFURSwgdGhpcy5nZXRDYWxsaW5nUGlkKCksIG5ldyBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UoZ2V0Q2FsbGluZ1VpZCgpLCBudWxsLCBudWxsKSkpIT10cnVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkLCByZXF1aXJlczogYWxsT2YgPSB7YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVULCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVklCUkFURX0iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhpcy5NdWx0aXBsZVBlcm1pc3Npb25zQWxsKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fTXVsdGlwbGVQZXJtaXNzaW9uc0FueToKKyAgICAgICAgeworICAgICAgICAgIGlmICgoKHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgdGhpcy5nZXRDYWxsaW5nUGlkKCksIG5ldyBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UoZ2V0Q2FsbGluZ1VpZCgpLCBudWxsLCBudWxsKSl8fHRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgbmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpKSkhPXRydWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFjY2VzcyBkZW5pZWQsIHJlcXVpcmVzOiBhbnlPZiA9IHthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFfSIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQKKyAgICB7CisgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgIHsKKyAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICB9CisgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgUGVybWlzc2lvblByb3RlY3RlZCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUGVybWlzc2lvblByb3RlY3RlZCwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIE11bHRpcGxlUGVybWlzc2lvbnNBbGwoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGwsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNdWx0aXBsZVBlcm1pc3Npb25zQW55KCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKGFzQmluZGVyKCkpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9NdWx0aXBsZVBlcm1pc3Npb25zQW55LCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICAgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9CisgICAgICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAorICAgICAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsICIiIC8qbWVzc2FnZSovKSA9PQorICAgICAgICAgIGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbGwgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX011bHRpcGxlUGVybWlzc2lvbnNBbnkgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyKTsKKyAgfQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdGVzdHMkcGVybWlzc2lvbiRJUHJvdGVjdGVkIi5yZXBsYWNlKCckJywgJy4nKTsKKyAgQGFuZHJvaWQuYW5ub3RhdGlvbi5FbmZvcmNlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSkKKyAgcHVibGljIHZvaWQgUGVybWlzc2lvblByb3RlY3RlZCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgQGFuZHJvaWQuYW5ub3RhdGlvbi5FbmZvcmNlUGVybWlzc2lvbihhbGxPZiA9IHthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFfSkKKyAgcHVibGljIHZvaWQgTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgQGFuZHJvaWQuYW5ub3RhdGlvbi5FbmZvcmNlUGVybWlzc2lvbihhbnlPZiA9IHthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFfSkKKyAgcHVibGljIHZvaWQgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjcwNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzkyZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb247CitAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTikKK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RlY3RlZEludGVyZmFjZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSVByb3RlY3RlZEludGVyZmFjZS4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZQorICB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIE1ldGhvZDEoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBNZXRob2QyKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisgIC8qKiBMb2NhbC1zaWRlIElQQyBpbXBsZW1lbnRhdGlvbiBzdHViIGNsYXNzLiAqLworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWRJbnRlcmZhY2UKKyAgeworICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHN0dWIgYXQgYXR0YWNoIGl0IHRvIHRoZSBpbnRlcmZhY2UuICovCisgICAgcHVibGljIFN0dWIoKQorICAgIHsKKyAgICAgIHRoaXMuYXR0YWNoSW50ZXJmYWNlKHRoaXMsIERFU0NSSVBUT1IpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBDYXN0IGFuIElCaW5kZXIgb2JqZWN0IGludG8gYW4gYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZSBpbnRlcmZhY2UsCisgICAgICogZ2VuZXJhdGluZyBhIHByb3h5IGlmIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWRJbnRlcmZhY2UgYXNJbnRlcmZhY2UoYW5kcm9pZC5vcy5JQmluZGVyIG9iaikKKyAgICB7CisgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICBpZiAoKChpaW4hPW51bGwpJiYoaWluIGluc3RhbmNlb2YgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZSkpKSB7CisgICAgICAgIHJldHVybiAoKGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWRJbnRlcmZhY2UpaWluKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZS5TdHViLlByb3h5KG9iaik7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEsIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICBpZiAoY29kZSA+PSBhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAmJiBjb2RlIDw9IGFuZHJvaWQub3MuSUJpbmRlci5MQVNUX0NBTExfVFJBTlNBQ1RJT04pIHsKKyAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOworICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKKyAgICAgICAgeworICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGRlc2NyaXB0b3IpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fTWV0aG9kMToKKyAgICAgICAgeworICAgICAgICAgIGlmICgodGhpcy5wZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgbmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTiIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLk1ldGhvZDEoKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9NZXRob2QyOgorICAgICAgICB7CisgICAgICAgICAgaWYgKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBuZXcgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKGdldENhbGxpbmdVaWQoKSwgbnVsbCwgbnVsbCkpIT10cnVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3MgZGVuaWVkLCByZXF1aXJlczogYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OIik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgodGhpcy5wZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVULCB0aGlzLmdldENhbGxpbmdQaWQoKSwgbmV3IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZShnZXRDYWxsaW5nVWlkKCksIG51bGwsIG51bGwpKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLk1ldGhvZDIoKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWRJbnRlcmZhY2UKKyAgICB7CisgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgIHsKKyAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICB9CisgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgTWV0aG9kMSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbihhc0JpbmRlcigpKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fTWV0aG9kMSwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIE1ldGhvZDIoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oYXNCaW5kZXIoKSk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX01ldGhvZDIsIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIHBlcm1pc3Npb25DaGVja2VyV3JhcHBlcigKKyAgICAgICAgU3RyaW5nIHBlcm1pc3Npb24sIGludCBwaWQsIGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgICAgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY3R4ID0KKyAgICAgICAgICBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZC5jdXJyZW50QWN0aXZpdHlUaHJlYWQoKS5nZXRTeXN0ZW1Db250ZXh0KCk7CisgICAgICByZXR1cm4gKGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5jaGVja1Blcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCisgICAgICAgICAgICAgIGN0eCwgcGVybWlzc2lvbiwgcGlkLCBhdHRyaWJ1dGlvblNvdXJjZSwgIiIgLyptZXNzYWdlKi8pID09CisgICAgICAgICAgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRCk7CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fTWV0aG9kMSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fTWV0aG9kMiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEpOworICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRwZXJtaXNzaW9uJElQcm90ZWN0ZWRJbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICBwdWJsaWMgdm9pZCBNZXRob2QxKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCkKKyAgcHVibGljIHZvaWQgTWV0aG9kMigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDRmNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuamF2YS5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmphdmEKaW5kZXggMGU4YWM5My4uMjhkZjZkZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uamF2YQpAQCAtMiw3ICsyLDYgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9uczsKLQogcHVibGljIGZpbmFsIGNsYXNzIEVudW1VbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpbnRFbnVtID0gMDsgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5JbnRFbnVtIGludEVudW07CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEKaW5kZXggYTE0NTdlMC4uMjQxNTExZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5qYXZhCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YQpAQCAtMiw3ICsyLDYgQEAKICAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9uczsKLQogcHVibGljIGZpbmFsIGNsYXNzIFVuaW9uSW5VbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBmaXJzdCA9IDA7ICAvLyBhbmRyb2lkLmFpZGwudGVzdHMudW5pb25zLkVudW1VbmlvbiBmaXJzdDsKQEAgLTc2LDEzICs3NSw3IEBACiAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KF90YWcpOwogICAgIHN3aXRjaCAoX3RhZykgewogICAgIGNhc2UgZmlyc3Q6Ci0gICAgICBpZiAoKGdldEZpcnN0KCkhPW51bGwpKSB7Ci0gICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgxKTsKLSAgICAgICAgZ2V0Rmlyc3QoKS53cml0ZVRvUGFyY2VsKF9haWRsX3BhcmNlbCwgMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOwotICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QoZ2V0Rmlyc3QoKSwgMCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHNlY29uZDoKICAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChnZXRTZWNvbmQoKSk7CkBAIC05NiwxMiArODksNyBAQAogICAgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CiAgICAgY2FzZSBmaXJzdDogewogICAgICAgYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24gX2FpZGxfdmFsdWU7Ci0gICAgICBpZiAoKDAhPV9haWRsX3BhcmNlbC5yZWFkSW50KCkpKSB7Ci0gICAgICAgIF9haWRsX3ZhbHVlID0gYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgX2FpZGxfdmFsdWUgPSBudWxsOwotICAgICAgfQorICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC50ZXN0cy51bmlvbnMuRW51bVVuaW9uLkNSRUFUT1IpOwogICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKICAgICAgIHJldHVybjsgfQogICAgIGNhc2Ugc2Vjb25kOiB7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YS5kCmluZGV4IGY1YzIxMjMuLjdkMjdmZGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YS5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uamF2YS5kCkBAIC0xLDMgKzEsNSBAQAogb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmphdmEgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmNjkxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuY3BwCkBAIC0wLDAgKzEsNDc3IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogQXJyYXlPZkludGVyZmFjZXM6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzIjsKKworYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19BcnJheU9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICAodm9pZClfYWlkbF9iaW5kZXI7CisgICh2b2lkKV9haWRsX2NvZGU7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9vblRyYW5zYWN0KTsKKworQXJyYXlPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6OkJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorQXJyYXlPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6On5CcEVtcHR5SW50ZXJmYWNlKCkge30KKworLy8gU291cmNlIGZvciBCbkVtcHR5SW50ZXJmYWNlCitBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Qm5FbXB0eUludGVyZmFjZSgpIHt9CitBcnJheU9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6fkJuRW1wdHlJbnRlcmZhY2UoKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgQXJyYXlPZkludGVyZmFjZXM6OkJuRW1wdHlJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19BcnJheU9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSUVtcHR5SW50ZXJmYWNlCitjb25zdCBjaGFyKiBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiOworQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlKCkge30KK0FycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6On5JRW1wdHlJbnRlcmZhY2UoKSB7fQorCisKK3N0ZDo6c2hhcmVkX3B0cjxBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJRW1wdHlJbnRlcmZhY2U+KGludGVyZmFjZSk7CisgIH0KKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEFycmF5T2ZJbnRlcmZhY2VzOjpCcEVtcHR5SW50ZXJmYWNlPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElFbXB0eUludGVyZmFjZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICByZXR1cm4gU1RBVFVTX09LOworfQorYm9vbCBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSB7CisgIHJldHVybiBJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbDsKK30KK3N0ZDo6c2hhcmVkX3B0cjxBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNwQUlCaW5kZXIgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgQXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZURlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19BcnJheU9mSW50ZXJmYWNlc19JTXlJbnRlcmZhY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworICAodm9pZClfYWlkbF9pbjsKKyAgKHZvaWQpX2FpZGxfb3V0OworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOworICBzdGQ6OnNoYXJlZF9wdHI8QXJyYXlPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QXJyYXlPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U+KDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoX2FpZGxfYmluZGVyKSk7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qbWV0aG9kV2l0aEludGVyZmFjZXMqLyk6IHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9pZmFjZTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaW5faWZhY2VfYXJyYXlfaW47CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IG91dF9pZmFjZV9hcnJheV9vdXQ7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IGluX2lmYWNlX2FycmF5X2lub3V0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbjsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faWZhY2UpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9udWxsYWJsZV9pZmFjZSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pZmFjZV9hcnJheV9pbik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X2lmYWNlX2FycmF5X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX251bGxhYmxlX2lmYWNlX2FycmF5X2luKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+bWV0aG9kV2l0aEludGVyZmFjZXMoaW5faWZhY2UsIGluX251bGxhYmxlX2lmYWNlLCBpbl9pZmFjZV9hcnJheV9pbiwgJm91dF9pZmFjZV9hcnJheV9vdXQsICZpbl9pZmFjZV9hcnJheV9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sICZvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCAmaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X2lmYWNlX2FycmF5X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5faWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfQXJyYXlPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfQXJyYXlPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX29uVHJhbnNhY3QpOworCitBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6QnBNeUludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6fkJwTXlJbnRlcmZhY2UoKSB7fQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBcnJheU9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6bWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9pZmFjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfYXJyYXlfaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9hcnJheV9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIGluX2lmYWNlX2FycmF5X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbnVsbGFibGVfaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faWZhY2VfYXJyYXlfaW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9pZmFjZV9hcnJheV9vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qbWV0aG9kV2l0aEludGVyZmFjZXMqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpLT5tZXRob2RXaXRoSW50ZXJmYWNlcyhpbl9pZmFjZSwgaW5fbnVsbGFibGVfaWZhY2UsIGluX2lmYWNlX2FycmF5X2luLCBvdXRfaWZhY2VfYXJyYXlfb3V0LCBpbl9pZmFjZV9hcnJheV9pbm91dCwgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIG91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfaWZhY2VfYXJyYXlfb3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X251bGxhYmxlX2lmYWNlX2FycmF5X291dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisvLyBTb3VyY2UgZm9yIEJuTXlJbnRlcmZhY2UKK0FycmF5T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjpCbk15SW50ZXJmYWNlKCkge30KK0FycmF5T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjp+Qm5NeUludGVyZmFjZSgpIHt9Cis6Om5kazo6U3BBSUJpbmRlciBBcnJheU9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZTo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0FycmF5T2ZJbnRlcmZhY2VzX0lNeUludGVyZmFjZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CisgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOworfQorLy8gU291cmNlIGZvciBJTXlJbnRlcmZhY2UKK2NvbnN0IGNoYXIqIEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSI7CitBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpJTXlJbnRlcmZhY2UoKSB7fQorQXJyYXlPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6fklNeUludGVyZmFjZSgpIHt9CisKKworc3RkOjpzaGFyZWRfcHRyPEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+IEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgeworICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfQXJyYXlPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElNeUludGVyZmFjZT4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8QXJyYXlPZkludGVyZmFjZXM6OkJwTXlJbnRlcmZhY2U+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSU15SW50ZXJmYWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlNeUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJTXlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+JiBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElNeUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+IEFycmF5T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6bWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiAvKmluX2lmYWNlKi8sIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgLyppbl9udWxsYWJsZV9pZmFjZSovLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiAvKmluX2lmYWNlX2FycmF5X2luKi8sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qb3V0X2lmYWNlX2FycmF5X291dCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiAvKmluX2lmYWNlX2FycmF5X2lub3V0Ki8sIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIC8qaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4qLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0Ki8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIC8qaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6YXNCaW5kZXIoKSB7CisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcigpOworfQorYm9vbCBBcnJheU9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIEFycmF5T2ZJbnRlcmZhY2VzOjpNeVBhcmNlbGFibGU6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLk15UGFyY2VsYWJsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmlmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaWZhY2VfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9pZmFjZV9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaWZhY2VfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuTXlVbmlvbiI7CisKK2JpbmRlcl9zdGF0dXNfdCBBcnJheU9mSW50ZXJmYWNlczo6TXlVbmlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgaW50MzJfdCBfYWlkbF90YWc7CisgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKF9haWRsX3RhZykgeworICBjYXNlIGlmYWNlOiB7CisgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxpZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZTogeworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBpZmFjZV9hcnJheTogeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4pIHsKKyAgICAgIHNldDxpZmFjZV9hcnJheT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpZmFjZV9hcnJheT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogeworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+PikgeworICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2FycmF5PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2FycmF5PihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICB9CisgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworfQorYmluZGVyX3N0YXR1c190IEFycmF5T2ZJbnRlcmZhY2VzOjpNeVVuaW9uOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0VGFnKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBzd2l0Y2ggKGdldFRhZygpKSB7CisgIGNhc2UgaWZhY2U6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGlmYWNlPigpKTsKKyAgY2FzZSBudWxsYWJsZV9pZmFjZTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9wYXJjZWwsIGdldDxudWxsYWJsZV9pZmFjZT4oKSk7CisgIGNhc2UgaWZhY2VfYXJyYXk6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGlmYWNlX2FycmF5PigpKTsKKyAgY2FzZSBudWxsYWJsZV9pZmFjZV9hcnJheTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9wYXJjZWwsIGdldDxudWxsYWJsZV9pZmFjZV9hcnJheT4oKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjcwNzZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuY3BwLmQKaW5kZXggNzRlNDdmOS4uODlhOWJmOSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uY3BwLmQKaW5kZXggNTEwMDEyYS4uYzg1OGM4MCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmNwcC5kCmluZGV4IGExOTVjMDkuLmQwYWI1MDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5jcHAuZAppbmRleCA0MmFjNmEzLi5lMjVlYzllIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyYzRhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBEZXByZWNhdGVkUGFyY2VsYWJsZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuRGVwcmVjYXRlZFBhcmNlbGFibGUiOworCitiaW5kZXJfc3RhdHVzX3QgRGVwcmVjYXRlZFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRGVwcmVjYXRlZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5jcHAuZAppbmRleCAxNjhjZjY2Li5mY2M0MzZjIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE2MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwCkBAIC0wLDAgKzEsMjc4IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIEZpeGVkU2l6ZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplIjsKKworYmluZGVyX3N0YXR1c190IEZpeGVkU2l6ZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIEZpeGVkU2l6ZTo6Rml4ZWRQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRQYXJjZWxhYmxlIjsKKworYmluZGVyX3N0YXR1c190IEZpeGVkU2l6ZTo6Rml4ZWRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJvb2xlYW5WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZieXRlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hhclZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludFZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZmbG9hdFZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmVudW1WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWxhYmxlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRml4ZWRTaXplOjpGaXhlZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBib29sZWFuVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjaGFyVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnRWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGZsb2F0VmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBkb3VibGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGVudW1WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbGFibGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogRml4ZWRTaXplOjpGaXhlZFVuaW9uOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRVbmlvbiI7CisKK2JpbmRlcl9zdGF0dXNfdCBGaXhlZFNpemU6OkZpeGVkVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChfYWlkbF90YWcpIHsKKyAgY2FzZSBib29sZWFuVmFsdWU6IHsKKyAgICBib29sIF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGJvb2w+KSB7CisgICAgICBzZXQ8Ym9vbGVhblZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGJvb2xlYW5WYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBieXRlVmFsdWU6IHsKKyAgICBpbnQ4X3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50OF90PikgeworICAgICAgc2V0PGJ5dGVWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxieXRlVmFsdWU+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgY2hhclZhbHVlOiB7CisgICAgY2hhcjE2X3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8Y2hhcjE2X3Q+KSB7CisgICAgICBzZXQ8Y2hhclZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGNoYXJWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBpbnRWYWx1ZTogeworICAgIGludDMyX3QgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKKyAgICAgIHNldDxpbnRWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxpbnRWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBsb25nVmFsdWU6IHsKKyAgICBpbnQ2NF90IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDY0X3Q+KSB7CisgICAgICBzZXQ8bG9uZ1ZhbHVlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGxvbmdWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBmbG9hdFZhbHVlOiB7CisgICAgZmxvYXQgX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8ZmxvYXQ+KSB7CisgICAgICBzZXQ8ZmxvYXRWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxmbG9hdFZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICBjYXNlIGRvdWJsZVZhbHVlOiB7CisgICAgZG91YmxlIF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGRvdWJsZT4pIHsKKyAgICAgIHNldDxkb3VibGVWYWx1ZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxkb3VibGVWYWx1ZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBlbnVtVmFsdWU6IHsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4pIHsKKyAgICAgIHNldDxlbnVtVmFsdWU+KF9haWRsX3ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCisgICAgICBzZXQ8ZW51bVZhbHVlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICB9CisgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworfQorYmluZGVyX3N0YXR1c190IEZpeGVkU2l6ZTo6Rml4ZWRVbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGJvb2xlYW5WYWx1ZTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8Ym9vbGVhblZhbHVlPigpKTsKKyAgY2FzZSBieXRlVmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGJ5dGVWYWx1ZT4oKSk7CisgIGNhc2UgY2hhclZhbHVlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxjaGFyVmFsdWU+KCkpOworICBjYXNlIGludFZhbHVlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxpbnRWYWx1ZT4oKSk7CisgIGNhc2UgbG9uZ1ZhbHVlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxsb25nVmFsdWU+KCkpOworICBjYXNlIGZsb2F0VmFsdWU6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGZsb2F0VmFsdWU+KCkpOworICBjYXNlIGRvdWJsZVZhbHVlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxkb3VibGVWYWx1ZT4oKSk7CisgIGNhc2UgZW51bVZhbHVlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxlbnVtVmFsdWU+KCkpOworICB9CisgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjdhZDNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuY3BwLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCmluZGV4IDEwYzAwMTMuLjA2YjJmNWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcAppbmRleCBhNjUxM2MyLi5lNGZiNTEwIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcApAQCAtMSw3ICsxLDggQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oIgorCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaD4KIAogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtOSw3ICsxMCw3IEBACiBuYW1lc3BhY2UgdGVzdHMgewogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQiCi1zdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lEZXByZWNhdGVkX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKICAgKHZvaWQpX2FpZGxfaW47CiAgICh2b2lkKV9haWRsX291dDsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKQEAgLTE4LDcgKzE5LDcgQEAKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKLXN0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSURlcHJlY2F0ZWQ6OmRlc2NyaXB0b3IsIF9haWRsX29uVHJhbnNhY3QpOworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JRGVwcmVjYXRlZF9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSURlcHJlY2F0ZWQ6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JRGVwcmVjYXRlZF9vblRyYW5zYWN0KTsKIAogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogQnBEZXByZWNhdGVkOjpCcERlcHJlY2F0ZWQoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQpAQCAtMjgsNyArMjksNyBAQAogQm5EZXByZWNhdGVkOjpCbkRlcHJlY2F0ZWQoKSB7fQogQm5EZXByZWNhdGVkOjp+Qm5EZXByZWNhdGVkKCkge30KIDo6bmRrOjpTcEFJQmluZGVyIEJuRGVwcmVjYXRlZDo6Y3JlYXRlQmluZGVyKCkgewotICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSURlcHJlY2F0ZWRfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CiAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOwogICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApAQCAtNDEsNyArNDIsNyBAQAogCiAKIHN0ZDo6c2hhcmVkX3B0cjxJRGVwcmVjYXRlZD4gSURlcHJlY2F0ZWQ6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgewotICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lEZXByZWNhdGVkX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQogICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CiAgIGlmIChpbnRlcmZhY2UpIHsKICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElEZXByZWNhdGVkPihpbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5jcHAuZAppbmRleCA1YmM0MGMwLi5kOTJkNGU1IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwCmluZGV4IDE3ZjZkYTIuLmQ0NDExMDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwCkBAIC0xLDEzICsxLDE0IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaCIKKwogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmg+CiAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSB0ZXN0cyB7Ci1zdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOYW1lZENhbGxiYWNrX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKICAgKHZvaWQpX2FpZGxfaW47CiAgICh2b2lkKV9haWRsX291dDsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKQEAgLTIyLDcgKzIzLDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMzEsNyArMzIsNyBAQAogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIAotc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTmFtZWRDYWxsYmFjazo6ZGVzY3JpcHRvciwgX2FpZGxfb25UcmFuc2FjdCk7CitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOYW1lZENhbGxiYWNrX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTmFtZWRDYWxsYmFjazo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOYW1lZENhbGxiYWNrX29uVHJhbnNhY3QpOwogCiBCcE5hbWVkQ2FsbGJhY2s6OkJwTmFtZWRDYWxsYmFjayhjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CiBCcE5hbWVkQ2FsbGJhY2s6On5CcE5hbWVkQ2FsbGJhY2soKSB7fQpAQCAtNjUsNyArNjYsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTc3LDcgKzc4LDcgQEAKIEJuTmFtZWRDYWxsYmFjazo6Qm5OYW1lZENhbGxiYWNrKCkge30KIEJuTmFtZWRDYWxsYmFjazo6fkJuTmFtZWRDYWxsYmFjaygpIHt9CiA6Om5kazo6U3BBSUJpbmRlciBCbk5hbWVkQ2FsbGJhY2s6OmNyZWF0ZUJpbmRlcigpIHsKLSAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lOYW1lZENhbGxiYWNrX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOwogICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKQEAgLTkwLDcgKzkxLDcgQEAKIAogCiBzdGQ6OnNoYXJlZF9wdHI8SU5hbWVkQ2FsbGJhY2s+IElOYW1lZENhbGxiYWNrOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKLSAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JTmFtZWRDYWxsYmFja19jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOwogICBpZiAoaW50ZXJmYWNlKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTmFtZWRDYWxsYmFjaz4oaW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suY3BwLmQKaW5kZXggMmVjZWIzMy4uYjZlYzVlNiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcAppbmRleCA4ZjQ4NDQyLi5lNDA4MjU4IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcApAQCAtMSwxMyArMSwxNCBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmgiCisKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5ld05hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oPgogCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgdGVzdHMgewotc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JTmV3TmFtZV9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CiAgICh2b2lkKV9haWRsX2luOwogICAodm9pZClfYWlkbF9vdXQ7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CkBAIC0yMiw3ICsyMyw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTMxLDcgKzMyLDcgQEAKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKLXN0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSU5ld05hbWU6OmRlc2NyaXB0b3IsIF9haWRsX29uVHJhbnNhY3QpOworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JTmV3TmFtZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSU5ld05hbWU6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JTmV3TmFtZV9vblRyYW5zYWN0KTsKIAogQnBOZXdOYW1lOjpCcE5ld05hbWUoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQogQnBOZXdOYW1lOjp+QnBOZXdOYW1lKCkge30KQEAgLTY1LDcgKzY2LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC03Nyw3ICs3OCw3IEBACiBCbk5ld05hbWU6OkJuTmV3TmFtZSgpIHt9CiBCbk5ld05hbWU6On5Cbk5ld05hbWUoKSB7fQogOjpuZGs6OlNwQUlCaW5kZXIgQm5OZXdOYW1lOjpjcmVhdGVCaW5kZXIoKSB7Ci0gIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JTmV3TmFtZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CiAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC05MCw3ICs5MSw3IEBACiAKIAogc3RkOjpzaGFyZWRfcHRyPElOZXdOYW1lPiBJTmV3TmFtZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7Ci0gIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU5ld05hbWVfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CiAgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKICAgaWYgKGludGVyZmFjZSkgewogICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SU5ld05hbWU+KGludGVyZmFjZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmNwcC5kCmluZGV4IDBjNTY5YzUuLjQ1OWUxNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAKaW5kZXggNmY1NGVjNi4uZmY0MDQ5OSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAKQEAgLTEsMTMgKzEsMTQgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oIgorCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaD4KIAogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIHRlc3RzIHsKLXN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU9sZE5hbWVfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgewogICAodm9pZClfYWlkbF9pbjsKICAgKHZvaWQpX2FpZGxfb3V0OwogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOwpAQCAtMjIsNyArMjMsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0zMSw3ICszMiw3IEBACiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQogCi1zdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElPbGROYW1lOjpkZXNjcmlwdG9yLCBfYWlkbF9vblRyYW5zYWN0KTsKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU9sZE5hbWVfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElPbGROYW1lOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU9sZE5hbWVfb25UcmFuc2FjdCk7CiAKIEJwT2xkTmFtZTo6QnBPbGROYW1lKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KIEJwT2xkTmFtZTo6fkJwT2xkTmFtZSgpIHt9CkBAIC02NSw3ICs2Niw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtNzcsNyArNzgsNyBAQAogQm5PbGROYW1lOjpCbk9sZE5hbWUoKSB7fQogQm5PbGROYW1lOjp+Qm5PbGROYW1lKCkge30KIDo6bmRrOjpTcEFJQmluZGVyIEJuT2xkTmFtZTo6Y3JlYXRlQmluZGVyKCkgewotICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSU9sZE5hbWVfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CiAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOwogICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApAQCAtOTAsNyArOTEsNyBAQAogCiAKIHN0ZDo6c2hhcmVkX3B0cjxJT2xkTmFtZT4gSU9sZE5hbWU6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgewotICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lPbGROYW1lX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQogICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CiAgIGlmIChpbnRlcmZhY2UpIHsKICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElPbGROYW1lPihpbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAuZApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5jcHAuZAppbmRleCA4ZTQ0MzVlLi4xY2E0MjM5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwLmQKQEAgLTEsMiArMSwyIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcAppbmRleCA1MTU3MDdhLi4wMjY4YWFhIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwCkBAIC0xLDE2ICsxLDE3IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmgiCisKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KIAogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTgsNyArMTksNyBAQAogbmFtZXNwYWNlIHRlc3RzIHsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkIgotc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JVGVzdFNlcnZpY2Vfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgewogICAodm9pZClfYWlkbF9pbjsKICAgKHZvaWQpX2FpZGxfb3V0OwogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOwpAQCAtMjgsNyArMjksNyBAQAogICAgICAgaW50MzJfdCBpbl9hcmc7CiAgICAgICBpbnQzMl90IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX2luLCAmaW5fYXJnKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2FyZyk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5VbmltcGxlbWVudGVkTWV0aG9kKGluX2FyZywgJl9haWRsX3JldHVybik7CkBAIC0zNyw3ICszOCw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC02Miw3ICs2Myw3IEBACiAgICAgICBib29sIGluX3Rva2VuOwogICAgICAgYm9vbCBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0Qm9vbGVhbihpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC03MSw3ICs3Miw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJvb2woX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTgwLDcgKzgxLDcgQEAKICAgICAgIGludDhfdCBpbl90b2tlbjsKICAgICAgIGludDhfdCBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlKF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0Qnl0ZShpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC04OSw3ICs5MCw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTk4LDcgKzk5LDcgQEAKICAgICAgIGNoYXIxNl90IGluX3Rva2VuOwogICAgICAgY2hhcjE2X3QgX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQ2hhcihfYWlkbF9pbiwgJmluX3Rva2VuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdENoYXIoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMTA3LDcgKzEwOCw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUNoYXIoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTExNiw3ICsxMTcsNyBAQAogICAgICAgaW50MzJfdCBpbl90b2tlbjsKICAgICAgIGludDMyX3QgX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRJbnQoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMTI1LDcgKzEyNiw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0xMzQsNyArMTM1LDcgQEAKICAgICAgIGludDY0X3QgaW5fdG9rZW47CiAgICAgICBpbnQ2NF90IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TG9uZyhpbl90b2tlbiwgJl9haWRsX3JldHVybik7CkBAIC0xNDMsNyArMTQ0LDcgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTE1Miw3ICsxNTMsNyBAQAogICAgICAgZmxvYXQgaW5fdG9rZW47CiAgICAgICBmbG9hdCBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRGbG9hdChfYWlkbF9pbiwgJmluX3Rva2VuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdEZsb2F0KGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTE2MSw3ICsxNjIsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVGbG9hdChfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMTcwLDcgKzE3MSw3IEBACiAgICAgICBkb3VibGUgaW5fdG9rZW47CiAgICAgICBkb3VibGUgX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRG91YmxlKF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0RG91YmxlKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTE3OSw3ICsxODAsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTE4OCw3ICsxODksNyBAQAogICAgICAgc3RkOjpzdHJpbmcgaW5fdG9rZW47CiAgICAgICBzdGQ6OnN0cmluZyBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fdG9rZW4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0U3RyaW5nKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTE5Nyw3ICsxOTgsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0yMDYsNyArMjA3LDcgQEAKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIGluX3Rva2VuOwogICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfYWlkbF9pbiwgcmVpbnRlcnByZXRfY2FzdDxpbnQ4X3QqPigmaW5fdG9rZW4pKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdEJ5dGVFbnVtKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTIxNSw3ICsyMTYsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlKF9haWRsX291dCwgc3RhdGljX2Nhc3Q8aW50OF90PihfYWlkbF9yZXR1cm4pKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0yMjQsNyArMjI1LDcgQEAKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gaW5fdG9rZW47CiAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX2luLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmaW5fdG9rZW4pKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdEludEVudW0oaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtMjMzLDcgKzIzNCw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX291dCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oX2FpZGxfcmV0dXJuKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMjQyLDcgKzI0Myw3IEBACiAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBpbl90b2tlbjsKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KF9haWRsX2luLCByZWludGVycHJldF9jYXN0PGludDY0X3QqPigmaW5fdG9rZW4pKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3Rva2VuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdExvbmdFbnVtKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTI1MSw3ICsyNTIsNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChfYWlkbF9vdXQsIHN0YXRpY19jYXN0PGludDY0X3Q+KF9haWRsX3JldHVybikpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTI2MSw3ICsyNjIsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtMjczLDEwICsyNzQsMTAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMjg2LDcgKzI4Nyw3IEBACiAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC0yOTgsMTAgKzI5OSwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0zMTEsNyArMzEyLDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtMzIzLDEwICszMjQsMTAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtMzM2LDcgKzMzNyw3IEBACiAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC0zNDgsMTAgKzM0OSwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0zNjEsNyArMzYyLDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTM3MywxMCArMzc0LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTM4Niw3ICszODcsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC0zOTgsMTAgKzM5OSwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC00MTEsNyArNDEyLDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC00MjMsMTAgKzQyNCwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC00MzYsNyArNDM3LDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdXRfcmVwZWF0ZWQ7CiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtNDQ4LDEwICs0NDksMTAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtNDYxLDcgKzQ2Miw3IEBACiAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGVBcnJheShfYWlkbF9pbiwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZpbl9pbnB1dCksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50OF90Pik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTQ3MywxMCArNDc0LDEwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGVBcnJheShfYWlkbF9vdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50OF90Kj4oX2FpZGxfcmV0dXJuLmRhdGEoKSksIF9haWRsX3JldHVybi5zaXplKCkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGVBcnJheShfYWlkbF9vdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50OF90Kj4ob3V0X3JlcGVhdGVkLmRhdGEoKSksIG91dF9yZXBlYXRlZC5zaXplKCkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTQ4Niw3ICs0ODcsNyBAQAogICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzJBcnJheShfYWlkbF9pbiwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZpbl9pbnB1dCksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50MzJfdD4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3Jlc2l6ZVZlY3RvcihfYWlkbF9pbiwgJm91dF9yZXBlYXRlZCk7CkBAIC00OTgsMTAgKzQ5OSwxMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMkFycmF5KF9haWRsX291dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oX2FpZGxfcmV0dXJuLmRhdGEoKSksIF9haWRsX3JldHVybi5zaXplKCkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyQXJyYXkoX2FpZGxfb3V0LCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihvdXRfcmVwZWF0ZWQuZGF0YSgpKSwgb3V0X3JlcGVhdGVkLnNpemUoKSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwpAQCAtNTExLDcgKzUxMiw3IEBACiAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0QXJyYXkoX2FpZGxfaW4sIHN0YXRpY19jYXN0PHZvaWQqPigmaW5faW5wdXQpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDY0X3Q+KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtNTIzLDEwICs1MjQsMTAgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjRBcnJheShfYWlkbF9vdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50NjRfdCo+KF9haWRsX3JldHVybi5kYXRhKCkpLCBfYWlkbF9yZXR1cm4uc2l6ZSgpKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NEFycmF5KF9haWRsX291dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ2NF90Kj4ob3V0X3JlcGVhdGVkLmRhdGEoKSksIG91dF9yZXBlYXRlZC5zaXplKCkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTUzNSw3ICs1MzYsNyBAQAogICAgICAgc3RkOjpzdHJpbmcgaW5fbmFtZTsKICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9pbiwgJmluX25hbWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fbmFtZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5HZXRPdGhlclRlc3RTZXJ2aWNlKGluX25hbWUsICZfYWlkbF9yZXR1cm4pOwpAQCAtNTQ0LDcgKzU0NSw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s6OndyaXRlVG9QYXJjZWwoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTU1NCwxMCArNTU1LDEwIEBACiAgICAgICBzdGQ6OnN0cmluZyBpbl9uYW1lOwogICAgICAgYm9vbCBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazo6cmVhZEZyb21QYXJjZWwoX2FpZGxfaW4sICZpbl9zZXJ2aWNlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3NlcnZpY2UpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfaW4sICZpbl9uYW1lKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX25hbWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+VmVyaWZ5TmFtZShpbl9zZXJ2aWNlLCBpbl9uYW1lLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTU2NiwxNyArNTY3LDEzNyBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNyAvKlJldmVyc2VTdHJpbmdMaXN0Ki8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3IC8qR2V0SW50ZXJmYWNlQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbl9uYW1lczsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fbmFtZXMpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+R2V0SW50ZXJmYWNlQXJyYXkoaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOCAvKlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5Ki8pOiB7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiBpbl9zZXJ2aWNlczsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbl9uYW1lczsKKyAgICAgIGJvb2wgX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9zZXJ2aWNlcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9uYW1lcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShpbl9zZXJ2aWNlcywgaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOSAvKkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiBpbl9uYW1lczsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9uYW1lcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMCAvKlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+IGluX3NlcnZpY2VzOworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+IGluX25hbWVzOworICAgICAgYm9vbCBfYWlkbF9yZXR1cm47CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5fc2VydmljZXMpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9uYW1lcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGluX3NlcnZpY2VzLCBpbl9uYW1lcywgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxIC8qR2V0SW50ZXJmYWNlTGlzdCovKTogeworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+IGluX25hbWVzOworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX25hbWVzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkdldEludGVyZmFjZUxpc3QoaW5fbmFtZXMsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMyIC8qVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCovKTogeworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4gaW5fc2VydmljZXM7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5fbmFtZXM7CisgICAgICBib29sIF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9zZXJ2aWNlcyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX25hbWVzKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoaW5fc2VydmljZXMsIGluX25hbWVzLCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzMgLypSZXZlcnNlU3RyaW5nTGlzdCovKTogewogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX2lucHV0OwogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmV2ZXJzZVN0cmluZ0xpc3QoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNTg1LDE5ICs3MDYsMTkgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjggLypSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvciovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNCAvKlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKi8pOiB7CiAgICAgICA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IgaW5fcmVhZDsKICAgICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkUmVxdWlyZWRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9pbiwgJmluX3JlYWQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fcmVhZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihpbl9yZWFkLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTYwNiwxNyArNzI3LDE3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOSAvKlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5Ki8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM1IC8qUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkqLyk6IHsKICAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4gaW5faW5wdXQ7CiAgICAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+IG91dF9yZXBlYXRlZDsKICAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtNjI4LDE4ICs3NDksMTggQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzAgLypUaHJvd1NlcnZpY2VFeGNlcHRpb24qLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzYgLypUaHJvd1NlcnZpY2VFeGNlcHRpb24qLyk6IHsKICAgICAgIGludDMyX3QgaW5fY29kZTsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX2luLCAmaW5fY29kZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9jb2RlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlRocm93U2VydmljZUV4Y2VwdGlvbihpbl9jb2RlKTsKQEAgLTY1MCwxMSArNzcxLDExIEBACiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzEgLypSZXBlYXROdWxsYWJsZUludEFycmF5Ki8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3IC8qUmVwZWF0TnVsbGFibGVJbnRBcnJheSovKTogewogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4gaW5faW5wdXQ7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZUludEFycmF5KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKQEAgLTY2MywxNiArNzg0LDE2IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzIgLypSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzggLypSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkqLyk6IHsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlQXJyYXkoX2FpZGxfaW4sIHN0YXRpY19jYXN0PHZvaWQqPigmaW5faW5wdXQpLCBuZGs6OkFQYXJjZWxfbnVsbGFibGVTdGRWZWN0b3JBbGxvY2F0b3I8aW50OF90Pik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybik7CkBAIC02ODEsMTYgKzgwMiwxNiBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlQXJyYXkoX2FpZGxfb3V0LCAoX2FpZGxfcmV0dXJuID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihfYWlkbF9yZXR1cm4tPmRhdGEoKSkgOiBudWxscHRyKSwgKF9haWRsX3JldHVybiA/IF9haWRsX3JldHVybi0+c2l6ZSgpIDogLTEpKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMzIC8qUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzkgLypSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSovKTogewogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4gaW5faW5wdXQ7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMkFycmF5KF9haWRsX2luLCBzdGF0aWNfY2FzdDx2b2lkKj4oJmluX2lucHV0KSwgbmRrOjpBUGFyY2VsX251bGxhYmxlU3RkVmVjdG9yQWxsb2NhdG9yPGludDMyX3Q+KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoaW5faW5wdXQsICZfYWlkbF9yZXR1cm4pOwpAQCAtNjk5LDE2ICs4MjAsMTYgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzJBcnJheShfYWlkbF9vdXQsIChfYWlkbF9yZXR1cm4gPyByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihfYWlkbF9yZXR1cm4tPmRhdGEoKSkgOiBudWxscHRyKSwgKF9haWRsX3JldHVybiA/IF9haWRsX3JldHVybi0+c2l6ZSgpIDogLTEpKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0IC8qUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5Ki8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQwIC8qUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5Ki8pOiB7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4gaW5faW5wdXQ7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjRBcnJheShfYWlkbF9pbiwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZpbl9pbnB1dCksIG5kazo6QVBhcmNlbF9udWxsYWJsZVN0ZFZlY3RvckFsbG9jYXRvcjxpbnQ2NF90Pik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybik7CkBAIC03MTcsMTYgKzgzOCwxNiBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NEFycmF5KF9haWRsX291dCwgKF9haWRsX3JldHVybiA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50NjRfdCo+KF9haWRsX3JldHVybi0+ZGF0YSgpKSA6IG51bGxwdHIpLCAoX2FpZGxfcmV0dXJuID8gX2FpZGxfcmV0dXJuLT5zaXplKCkgOiAtMSkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzUgLypSZXBlYXROdWxsYWJsZVN0cmluZyovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MSAvKlJlcGVhdE51bGxhYmxlU3RyaW5nKi8pOiB7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBpbl9pbnB1dDsKICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJlcGVhdE51bGxhYmxlU3RyaW5nKGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKQEAgLTczNSwxNiArODU2LDE2IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzYgLypSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QqLyk6IHsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbl9pbnB1dDsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBfYWlkbF9yZXR1cm47CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQyIC8qUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5faW5wdXQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKQEAgLTc1MywxNiArODc0LDE2IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzcgLypSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUqLyk6IHsKLSAgICAgIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+IGluX2lucHV0OwotICAgICAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4gX2FpZGxfcmV0dXJuOworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MyAvKlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSovKTogeworICAgICAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsYWJsZShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKQEAgLTc3MSwxNSArODkyLDUxIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVBhcmNlbGFibGUoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzggLypUYWtlc0FuSUJpbmRlciovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NCAvKlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbl9pbnB1dCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDUgLypSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGluX2lucHV0LCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NiAvKlRha2VzQW5JQmluZGVyKi8pOiB7CiAgICAgICA6Om5kazo6U3BBSUJpbmRlciBpbl9pbnB1dDsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRSZXF1aXJlZFN0cm9uZ0JpbmRlcihfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlRha2VzQW5JQmluZGVyKGluX2lucHV0KTsKQEAgLTc5MCwxMCArOTQ3LDEwIEBACiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzkgLypUYWtlc0FOdWxsYWJsZUlCaW5kZXIqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDcgLypUYWtlc0FOdWxsYWJsZUlCaW5kZXIqLyk6IHsKICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGluX2lucHV0OwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoaW5faW5wdXQpOwpAQCAtODA0LDExICs5NjEsMzkgQEAKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MCAvKlJlcGVhdFV0ZjhDcHBTdHJpbmcqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDggLypUYWtlc0FuSUJpbmRlckxpc3QqLyk6IHsKKyAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiBpbl9pbnB1dDsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW5wdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+VGFrZXNBbklCaW5kZXJMaXN0KGluX2lucHV0KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5IC8qVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdCovKTogeworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+IGluX2lucHV0OworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoaW5faW5wdXQpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTAgLypSZXBlYXRVdGY4Q3BwU3RyaW5nKi8pOiB7CiAgICAgICBzdGQ6OnN0cmluZyBpbl90b2tlbjsKICAgICAgIHN0ZDo6c3RyaW5nIF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfaW4sICZpbl90b2tlbik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXRVdGY4Q3BwU3RyaW5nKGluX3Rva2VuLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTgxNywxNiArMTAwMiwxNiBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MSAvKlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MSAvKlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyovKTogewogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gaW5fdG9rZW47CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBfYWlkbF9yZXR1cm47CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX2luLCAmaW5fdG9rZW4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl90b2tlbik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5fdG9rZW4sICZfYWlkbF9yZXR1cm4pOwpAQCAtODM1LDE3ICsxMDIwLDE3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDIgLypSZXZlcnNlVXRmOENwcFN0cmluZyovKTogeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MiAvKlJldmVyc2VVdGY4Q3BwU3RyaW5nKi8pOiB7CiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5faW5wdXQ7CiAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKQEAgLTg1NywyMCArMTA0MiwyMCBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MyAvKlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTMgLypSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKi8pOiB7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5faW5wdXQ7CiAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gb3V0X3JlcGVhdGVkOwogICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZXNpemVWZWN0b3IoX2FpZGxfaW4sICZvdXRfcmVwZWF0ZWQpOwpAQCAtODgyLDIwICsxMDY3LDIwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBvdXRfcmVwZWF0ZWQpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NCAvKlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCovKTogewotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluX2lucHV0OwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dF9yZXBlYXRlZDsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBfYWlkbF9yZXR1cm47CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU0IC8qUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gaW5faW5wdXQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4gb3V0X3JlcGVhdGVkOworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+IF9haWRsX3JldHVybjsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX2lucHV0KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CkBAIC05MDQsMTkgKzEwODksMTkgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgb3V0X3JlcGVhdGVkKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1IC8qR2V0Q2FsbGJhY2sqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTUgLypHZXRDYWxsYmFjayovKTogewogICAgICAgYm9vbCBpbl9yZXR1cm5fbnVsbDsKICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4gX2FpZGxfcmV0dXJuOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQm9vbChfYWlkbF9pbiwgJmluX3JldHVybl9udWxsKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3JldHVybl9udWxsKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkdldENhbGxiYWNrKGluX3JldHVybl9udWxsLCAmX2FpZGxfcmV0dXJuKTsKQEAgLTkyNSwxNSArMTExMCwxNSBAQAogCiAgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjp3cml0ZVRvUGFyY2VsKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2IC8qRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU2IC8qRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKi8pOiB7CiAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBpbl9wYXJjZWw7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkUGFyY2VsYWJsZShfYWlkbF9pbiwgJmluX3BhcmNlbCk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9wYXJjZWwpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+RmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZpbl9wYXJjZWwpOwpAQCAtOTQyLDEyICsxMTI3LDk4IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKF9haWRsX291dCwgaW5fcGFyY2VsKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9wYXJjZWwpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NyAvKkdldE9sZE5hbWVJbnRlcmZhY2UqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTcgLypSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSovKTogeworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSBpbl9lcDsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUgb3V0X2VwMjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fZXApOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+UmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoaW5fZXAsICZvdXRfZXAyKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgb3V0X2VwMik7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU4IC8qUmV2ZXJzZUxpc3QqLyk6IHsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QgaW5fbGlzdDsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QgX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9saXN0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJldmVyc2VMaXN0KGluX2xpc3QsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OSAvKlJldmVyc2VJQmluZGVyQXJyYXkqLyk6IHsKKyAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiBpbl9pbnB1dDsKKyAgICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiBvdXRfcmVwZWF0ZWQ7CisgICAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJldmVyc2VJQmluZGVyQXJyYXkoaW5faW5wdXQsICZvdXRfcmVwZWF0ZWQsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYwIC8qUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5Ki8pOiB7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4gaW5faW5wdXQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4gb3V0X3JlcGVhdGVkOworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9pbnB1dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVzaXplVmVjdG9yKF9haWRsX2luLCAmb3V0X3JlcGVhdGVkKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbl9pbnB1dCwgJm91dF9yZXBlYXRlZCwgJl9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9vdXQsIG91dF9yZXBlYXRlZCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYxIC8qR2V0T2xkTmFtZUludGVyZmFjZSovKTogewogICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiBfYWlkbF9yZXR1cm47CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkdldE9sZE5hbWVJbnRlcmZhY2UoJl9haWRsX3JldHVybik7CkBAIC05NTYsMTIgKzEyMjcsMTIgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZTo6d3JpdGVUb1BhcmNlbChfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDggLypHZXROZXdOYW1lSW50ZXJmYWNlKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYyIC8qR2V0TmV3TmFtZUludGVyZmFjZSovKTogewogICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiBfYWlkbF9yZXR1cm47CiAKICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkdldE5ld05hbWVJbnRlcmZhY2UoJl9haWRsX3JldHVybik7CkBAIC05NzAsMTIgKzEyNDEsMTIgQEAKIAogICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZTo6d3JpdGVUb1BhcmNlbChfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgX2FpZGxfcmV0dXJuKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDkgLypHZXRDcHBKYXZhVGVzdHMqLyk6IHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjMgLypHZXRDcHBKYXZhVGVzdHMqLyk6IHsKICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIF9haWRsX3JldHVybjsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+R2V0Q3BwSmF2YVRlc3RzKCZfYWlkbF9yZXR1cm4pOwpAQCAtOTg0LDEyICsxMjU1LDEyIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVN0cm9uZ0JpbmRlcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MCAvKmdldEJhY2tlbmRUeXBlKi8pOiB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY0IC8qZ2V0QmFja2VuZFR5cGUqLyk6IHsKICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlIF9haWRsX3JldHVybjsKIAogICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+Z2V0QmFja2VuZFR5cGUoJl9haWRsX3JldHVybik7CkBAIC05OTgsNyArMTI2OSw3IEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUoX2FpZGxfb3V0LCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KF9haWRsX3JldHVybikpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCiAgICAgICBicmVhazsKQEAgLTEwMDcsNyArMTI3OCw3IEBACiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQogCi1zdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElUZXN0U2VydmljZTo6ZGVzY3JpcHRvciwgX2FpZGxfb25UcmFuc2FjdCk7CitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lUZXN0U2VydmljZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSVRlc3RTZXJ2aWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfSVRlc3RTZXJ2aWNlX29uVHJhbnNhY3QpOwogCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiBCcFRlc3RTZXJ2aWNlOjpCcFRlc3RTZXJ2aWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KQEAgLTEwMjMsNyArMTI5NCw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX2luLmdldCgpLCBpbl9hcmcpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9hcmcpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTA0Niw3ICsxMzE3LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTEzMCw3ICsxNDAxLDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xMTUzLDcgKzE0MjQsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQm9vbChfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTExNzEsNyArMTQ0Miw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTE5NCw3ICsxNDY1LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xMjEyLDcgKzE0ODMsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVDaGFyKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTEyMzUsNyArMTUwNiw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRDaGFyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTI1Myw3ICsxNTI0LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTI3Niw3ICsxNTQ3LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTI5NCw3ICsxNTY1LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTMxNyw3ICsxNTg4LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTMzNSw3ICsxNjA2LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRmxvYXQoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMTM1OCw3ICsxNjI5LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEZsb2F0KF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTM3Niw3ICsxNjQ3LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRG91YmxlKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTEzOTksNyArMTY3MCw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWREb3VibGUoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xNDE3LDcgKzE2ODgsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTE0NDAsNyArMTcxMSw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTQ1OCw3ICsxNzI5LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShfYWlkbF9pbi5nZXQoKSwgc3RhdGljX2Nhc3Q8aW50OF90Pihpbl90b2tlbikpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xNDgxLDcgKzE3NTIsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfYWlkbF9vdXQuZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8aW50OF90Kj4oX2FpZGxfcmV0dXJuKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE0OTksNyArMTc3MCw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX2luLmdldCgpLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihpbl90b2tlbikpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0xNTIyLDcgKzE3OTMsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfb3V0LmdldCgpLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPihfYWlkbF9yZXR1cm4pKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTU0MCw3ICsxODExLDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQoX2FpZGxfaW4uZ2V0KCksIHN0YXRpY19jYXN0PGludDY0X3Q+KGluX3Rva2VuKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKQEAgLTE1NjMsNyArMTgzNCw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChfYWlkbF9vdXQuZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KF9haWRsX3JldHVybikpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xNTgxLDcgKzE4NTIsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMTYwNywxMCArMTg3OCwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE2MjgsNyArMTg5OSw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xNjU0LDEwICsxOTI1LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTY3NSw3ICsxOTQ2LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTE3MDEsMTAgKzE5NzIsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xNzIyLDcgKzE5OTMsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMTc0OCwxMCArMjAxOSwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE3NjksNyArMjA0MCw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xNzk1LDEwICsyMDY2LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTgxNiw3ICsyMDg3LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTE4NDIsMTAgKzIxMTMsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0xODYzLDcgKzIxMzQsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMTg4OSwxMCArMjE2MCwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTE5MTAsNyArMjE4MSw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0xOTM2LDEwICsyMjA3LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMTk1Nyw3ICsyMjI4LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZUFycmF5KF9haWRsX2luLmdldCgpLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+KGluX2lucHV0LmRhdGEoKSksIGluX2lucHV0LnNpemUoKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMTk4MywxMCArMjI1NCwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZUFycmF5KF9haWRsX291dC5nZXQoKSwgc3RhdGljX2Nhc3Q8dm9pZCo+KF9haWRsX3JldHVybiksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50OF90Pik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZUFycmF5KF9haWRsX291dC5nZXQoKSwgc3RhdGljX2Nhc3Q8dm9pZCo+KG91dF9yZXBlYXRlZCksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50OF90Pik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTIwMDQsNyArMjI3NSw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyQXJyYXkoX2FpZGxfaW4uZ2V0KCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KGluX2lucHV0LmRhdGEoKSksIGluX2lucHV0LnNpemUoKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvclNpemUoX2FpZGxfaW4uZ2V0KCksICpvdXRfcmVwZWF0ZWQpOwpAQCAtMjAzMCwxMCArMjMwMSwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzJBcnJheShfYWlkbF9vdXQuZ2V0KCksIHN0YXRpY19jYXN0PHZvaWQqPihfYWlkbF9yZXR1cm4pLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDMyX3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMkFycmF5KF9haWRsX291dC5nZXQoKSwgc3RhdGljX2Nhc3Q8dm9pZCo+KG91dF9yZXBlYXRlZCksIG5kazo6QVBhcmNlbF9zdGRWZWN0b3JBbGxvY2F0b3I8aW50MzJfdD4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yMDUxLDcgKzIzMjIsNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NEFycmF5KF9haWRsX2luLmdldCgpLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDY0X3QqPihpbl9pbnB1dC5kYXRhKCkpLCBpbl9pbnB1dC5zaXplKCkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTIwNzcsMTAgKzIzNDgsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0QXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4oX2FpZGxfcmV0dXJuKSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQ2NF90Pik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjRBcnJheShfYWlkbF9vdXQuZ2V0KCksIHN0YXRpY19jYXN0PHZvaWQqPihvdXRfcmVwZWF0ZWQpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDY0X3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjA5OCw3ICsyMzY5LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX25hbWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMjEyMSw3ICsyMzkyLDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrOjpyZWFkRnJvbVBhcmNlbChfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTIxMzksMTAgKzI0MTAsMTAgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjazo6d3JpdGVUb1BhcmNlbChfYWlkbF9pbi5nZXQoKSwgaW5fc2VydmljZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3NlcnZpY2UpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX2luLmdldCgpLCBpbl9uYW1lKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCkBAIC0yMTY1LDcgKzI0MzYsMjYyIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXRJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNyAvKkdldEludGVyZmFjZUFycmF5Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPkdldEludGVyZmFjZUFycmF5KGluX25hbWVzLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fc2VydmljZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOCAvKlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGluX3NlcnZpY2VzLCBpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX25hbWVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjkgLypHZXROdWxsYWJsZUludGVyZmFjZUFycmF5Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoaW5fbmFtZXMsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9zZXJ2aWNlcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX25hbWVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzAgLypWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoaW5fc2VydmljZXMsIGluX25hbWVzLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OkdldEludGVyZmFjZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMSAvKkdldEludGVyZmFjZUxpc3QqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+R2V0SW50ZXJmYWNlTGlzdChpbl9uYW1lcywgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3NlcnZpY2VzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbmFtZXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMiAvKlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChpbl9zZXJ2aWNlcywgaW5fbmFtZXMsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTIxODMsMTIgKzI3MDksMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3IC8qUmV2ZXJzZVN0cmluZ0xpc3QqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMyAvKlJldmVyc2VTdHJpbmdMaXN0Ki8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yMjA2LDEwICsyNzMyLDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X3JlcGVhdGVkKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjIyNywxMiArMjc1MywxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlUmVxdWlyZWRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9pbi5nZXQoKSwgaW5fcmVhZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3JlYWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOCAvKlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQgLypSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvciovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjI1MCw3ICsyNzc2LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRSZXF1aXJlZFBhcmNlbEZpbGVEZXNjcmlwdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjI2OCw3ICsyNzk0LDcgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKQEAgLTIyNzYsNyArMjgwMiw3IEBACiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOSAvKlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5Ki8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzUgLypSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjI5NCwxMCArMjgyMCwxMCBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTIzMTUsMTIgKzI4NDEsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfaW4uZ2V0KCksIGluX2NvZGUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9jb2RlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzAgLypUaHJvd1NlcnZpY2VFeGNlcHRpb24qLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNiAvKlRocm93U2VydmljZUV4Y2VwdGlvbiovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjM1MywxMiArMjg3OSwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMSAvKlJlcGVhdE51bGxhYmxlSW50QXJyYXkqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNyAvKlJlcGVhdE51bGxhYmxlSW50QXJyYXkqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTIzNzYsNyArMjkwMiw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yMzk0LDEyICsyOTIwLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGVBcnJheShfYWlkbF9pbi5nZXQoKSwgKGluX2lucHV0ID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihpbl9pbnB1dC0+ZGF0YSgpKSA6IG51bGxwdHIpLCAoaW5faW5wdXQgPyBpbl9pbnB1dC0+c2l6ZSgpIDogLTEpKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMyIC8qUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5Ki8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzggLypSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI0MTcsNyArMjk0Myw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlQXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4oX2FpZGxfcmV0dXJuKSwgbmRrOjpBUGFyY2VsX251bGxhYmxlU3RkVmVjdG9yQWxsb2NhdG9yPGludDhfdD4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI0MzUsMTIgKzI5NjEsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzJBcnJheShfYWlkbF9pbi5nZXQoKSwgKGluX2lucHV0ID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oaW5faW5wdXQtPmRhdGEoKSkgOiBudWxscHRyKSwgKGluX2lucHV0ID8gaW5faW5wdXQtPnNpemUoKSA6IC0xKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMyAvKlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5Ki8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzkgLypSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjQ1OCw3ICsyOTg0LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyQXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4oX2FpZGxfcmV0dXJuKSwgbmRrOjpBUGFyY2VsX251bGxhYmxlU3RkVmVjdG9yQWxsb2NhdG9yPGludDMyX3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yNDc2LDEyICszMDAyLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0QXJyYXkoX2FpZGxfaW4uZ2V0KCksIChpbl9pbnB1dCA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50NjRfdCo+KGluX2lucHV0LT5kYXRhKCkpIDogbnVsbHB0ciksIChpbl9pbnB1dCA/IGluX2lucHV0LT5zaXplKCkgOiAtMSkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQgLypSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MCAvKlJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjQ5OSw3ICszMDI1LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0QXJyYXkoX2FpZGxfb3V0LmdldCgpLCBzdGF0aWNfY2FzdDx2b2lkKj4oX2FpZGxfcmV0dXJuKSwgbmRrOjpBUGFyY2VsX251bGxhYmxlU3RkVmVjdG9yQWxsb2NhdG9yPGludDY0X3Q+KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yNTE3LDEyICszMDQzLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM1IC8qUmVwZWF0TnVsbGFibGVTdHJpbmcqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MSAvKlJlcGVhdE51bGxhYmxlU3RyaW5nKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNTQwLDcgKzMwNjYsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjU0OCw3ICszMDc0LDcgQEAKICAgX2FpZGxfc3RhdHVzX3JldHVybjoKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOwpAQCAtMjU1OCwxMiArMzA4NCwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNiAvKlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQyIC8qUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0Ki8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNTgxLDcgKzMxMDcsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMjU4OSw3ICszMTE1LDcgQEAKICAgX2FpZGxfc3RhdHVzX3JldHVybjoKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOwpAQCAtMjU5OSwxMiArMzEyNSwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxhYmxlKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNyAvKlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzIC8qUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNjIyLDcgKzMxNDgsODkgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVBhcmNlbGFibGUoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0IC8qUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoaW5faW5wdXQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NSAvKlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbl9pbnB1dCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yNjQwLDEyICszMjQ4LDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVSZXF1aXJlZFN0cm9uZ0JpbmRlcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4IC8qVGFrZXNBbklCaW5kZXIqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NiAvKlRha2VzQW5JQmluZGVyKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNjc4LDEyICszMjg2LDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVN0cm9uZ0JpbmRlcihfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzkgLypUYWtlc0FOdWxsYWJsZUlCaW5kZXIqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NyAvKlRha2VzQU51bGxhYmxlSUJpbmRlciovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjcwNiw2ICszMzE0LDgyIEBACiAgIF9haWRsX3N0YXR1c19yZXR1cm46CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpUYWtlc0FuSUJpbmRlckxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+JiBpbl9pbnB1dCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDggLypUYWtlc0FuSUJpbmRlckxpc3QqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VGFrZXNBbklCaW5kZXJMaXN0KGluX2lucHV0KTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiBpbl9pbnB1dCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OSAvKlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgRkxBR19DTEVBUl9CVUYKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElUZXN0U2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+VGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChpbl9pbnB1dCk7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CiA6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwpAQCAtMjcxNiwxMiArMzQwMCwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX2luLmdldCgpLCBpbl90b2tlbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDAgLypSZXBlYXRVdGY4Q3BwU3RyaW5nKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTAgLypSZXBlYXRVdGY4Q3BwU3RyaW5nKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yNzM5LDcgKzM0MjMsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI3NTcsMTIgKzM0NDEsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhfYWlkbF9pbi5nZXQoKSwgaW5fdG9rZW4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3Rva2VuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDEgLypSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MSAvKlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMjc4MCw3ICszNDY0LDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI3OTgsNyArMzQ4Miw3IEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksIGluX2lucHV0KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0yODA2LDcgKzM0OTAsNyBAQAogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDIgLypSZXZlcnNlVXRmOENwcFN0cmluZyovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUyIC8qUmV2ZXJzZVV0ZjhDcHBTdHJpbmcqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTI4MjQsMTAgKzM1MDgsMTAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yODQ1LDcgKzM1MjksNyBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CkBAIC0yODUzLDcgKzM1MzcsNyBAQAogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDMgLypSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTMgLypSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yODcxLDEwICszNTU1LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI4ODIsNyArMzU2Niw3IEBACiAgIF9haWRsX3N0YXR1c19yZXR1cm46CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9Ci06Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOwpAQCAtMjg5MiwxMiArMzU3NiwxMiBAQAogICBBUGFyY2VsX21hcmtTZW5zaXRpdmUoX2FpZGxfaW4uZ2V0KCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NCAvKlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCovKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU0IC8qUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0Ki8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yOTE1LDEwICszNTk5LDEwIEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBvdXRfcmVwZWF0ZWQpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTI5MzYsMTIgKzM2MjAsMTIgQEAKICAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChfYWlkbF9pbi5nZXQoKSwgaW5fcmV0dXJuX251bGwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9yZXR1cm5fbnVsbCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1IC8qR2V0Q2FsbGJhY2sqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NSAvKkdldENhbGxiYWNrKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0yOTU5LDcgKzM2NDMsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s6OnJlYWRGcm9tUGFyY2VsKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0yOTc3LDEyICszNjYxLDEyIEBACiAgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKF9haWRsX2luLmdldCgpLCAqaW5fcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX3BhcmNlbCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2IC8qRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTYgLypGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTMwMDAsNyArMzY4NCwxODMgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKF9haWRsX291dC5nZXQoKSwgaW5fcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5fcGFyY2VsKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcFRlc3RTZXJ2aWNlOjpSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiBpbl9lcCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogb3V0X2VwMikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2VwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTcgLypSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICBGTEFHX0NMRUFSX0JVRgorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVRlc3RTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpLT5SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShpbl9lcCwgb3V0X2VwMik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9lcDIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwVGVzdFNlcnZpY2U6OlJldmVyc2VMaXN0KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIGluX2xpc3QsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OCAvKlJldmVyc2VMaXN0Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJldmVyc2VMaXN0KGluX2xpc3QsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfcHJlcGFyZVRyYW5zYWN0aW9uKGFzQmluZGVyKCkuZ2V0KCksIF9haWRsX2luLmdldFIoKSk7CisgIEFQYXJjZWxfbWFya1NlbnNpdGl2ZShfYWlkbF9pbi5nZXQoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnB1dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3JTaXplKF9haWRsX2luLmdldCgpLCAqb3V0X3JlcGVhdGVkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTkgLypSZXZlcnNlSUJpbmRlckFycmF5Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJldmVyc2VJQmluZGVyQXJyYXkoaW5faW5wdXQsIG91dF9yZXBlYXRlZCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBUZXN0U2VydmljZTo6UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgQVBhcmNlbF9tYXJrU2Vuc2l0aXZlKF9haWRsX2luLmdldCgpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faW5wdXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yU2l6ZShfYWlkbF9pbi5nZXQoKSwgKm91dF9yZXBlYXRlZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYwIC8qUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5Ki8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIEZMQUdfQ0xFQVJfQlVGCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJVGVzdFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShpbl9pbnB1dCwgb3V0X3JlcGVhdGVkLCBfYWlkbF9yZXR1cm4pOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9yZXBlYXRlZCk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTMwMjAsNyArMzg4MCw3IEBACiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NyAvKkdldE9sZE5hbWVJbnRlcmZhY2UqLyksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MSAvKkdldE9sZE5hbWVJbnRlcmZhY2UqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTMwMzgsNyArMzg5OCw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZTo6cmVhZEZyb21QYXJjZWwoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0zMDU4LDcgKzM5MTgsNyBAQAogCiAgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKICAgICBhc0JpbmRlcigpLmdldCgpLAotICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDggLypHZXROZXdOYW1lSW50ZXJmYWNlKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjIgLypHZXROZXdOYW1lSW50ZXJmYWNlKi8pLAogICAgIF9haWRsX2luLmdldFIoKSwKICAgICBfYWlkbF9vdXQuZ2V0UigpLAogICAgIEZMQUdfQ0xFQVJfQlVGCkBAIC0zMDc2LDcgKzM5MzYsNyBAQAogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICBfYWlkbF9yZXRfc3RhdHVzID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU6OnJlYWRGcm9tUGFyY2VsKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtMzA5Niw3ICszOTU2LDcgQEAKIAogICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCiAgICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5IC8qR2V0Q3BwSmF2YVRlc3RzKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjMgLypHZXRDcHBKYXZhVGVzdHMqLyksCiAgICAgX2FpZGxfaW4uZ2V0UigpLAogICAgIF9haWRsX291dC5nZXRSKCksCiAgICAgRkxBR19DTEVBUl9CVUYKQEAgLTMxMTQsNyArMzk3NCw3IEBACiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3JldHVybik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAogICBfYWlkbF9lcnJvcjoKQEAgLTMxMzQsNyArMzk5NCw3IEBACiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAogICAgIGFzQmluZGVyKCkuZ2V0KCksCi0gICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MCAvKmdldEJhY2tlbmRUeXBlKi8pLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjQgLypnZXRCYWNrZW5kVHlwZSovKSwKICAgICBfYWlkbF9pbi5nZXRSKCksCiAgICAgX2FpZGxfb3V0LmdldFIoKSwKICAgICBGTEFHX0NMRUFSX0JVRgpAQCAtMzE1Miw3ICs0MDEyLDcgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUoX2FpZGxfb3V0LmdldCgpLCByZWludGVycHJldF9jYXN0PGludDhfdCo+KF9haWRsX3JldHVybikpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfZXJyb3I6CkBAIC0zMTY0LDcgKzQwMjQsNyBAQAogQm5UZXN0U2VydmljZTo6Qm5UZXN0U2VydmljZSgpIHt9CiBCblRlc3RTZXJ2aWNlOjp+Qm5UZXN0U2VydmljZSgpIHt9CiA6Om5kazo6U3BBSUJpbmRlciBCblRlc3RTZXJ2aWNlOjpjcmVhdGVCaW5kZXIoKSB7Ci0gIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19JVGVzdFNlcnZpY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CiAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOwogICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApAQCAtMzE4MCw3ICs0MDQwLDcgQEAKIGNvbnN0IGNoYXIqIElUZXN0U2VydmljZTo6U1RSSU5HX1RFU1RfQ09OU1RBTlRfVVRGOCA9ICJiYXoiOwogCiBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBJVGVzdFNlcnZpY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgewotICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0lUZXN0U2VydmljZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOwogICBpZiAoaW50ZXJmYWNlKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJVGVzdFNlcnZpY2U+KGludGVyZmFjZSk7CkBAIC0zMzQ4LDYgKzQyMDgsMzYgQEAKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OkdldEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLyppbl9uYW1lcyovLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiYgLyppbl9zZXJ2aWNlcyovLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qaW5fbmFtZXMqLywgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgLyppbl9uYW1lcyovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogLypfYWlkbF9yZXR1cm4qLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiAvKmluX3NlcnZpY2VzKi8sIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgLyppbl9uYW1lcyovLCBib29sKiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OkdldEludGVyZmFjZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiAvKmluX25hbWVzKi8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIC8qaW5fc2VydmljZXMqLywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiAvKmluX25hbWVzKi8sIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQogOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAvKmluX2lucHV0Ki8sIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogLypvdXRfcmVwZWF0ZWQqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKl9haWRsX3JldHVybiovKSB7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKQEAgLTMzOTMsMTIgKzQyODMsMjIgQEAKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qaW5faW5wdXQqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKl9haWRsX3JldHVybiovKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiAvKmluX2lucHV0Ki8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogLypfYWlkbF9yZXR1cm4qLykgewogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9Ci06Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIC8qaW5faW5wdXQqLywgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiAvKmluX2lucHV0Ki8sIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIC8qaW5faW5wdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgLyppbl9pbnB1dCovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogLypfYWlkbF9yZXR1cm4qLykgewogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CkBAIC0zNDEzLDYgKzQzMTMsMTYgQEAKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlRha2VzQW5JQmluZGVyTGlzdChjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIC8qaW5faW5wdXQqLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgLyppbl9pbnB1dCovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KIDo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIC8qaW5fdG9rZW4qLywgc3RkOjpzdHJpbmcqIC8qX2FpZGxfcmV0dXJuKi8pIHsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwpAQCAtMzQzMyw3ICs0MzQzLDcgQEAKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKICAgcmV0dXJuIF9haWRsX3N0YXR1czsKIH0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qaW5faW5wdXQqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIC8qaW5faW5wdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOwogICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOwogICByZXR1cm4gX2FpZGxfc3RhdHVzOwpAQCAtMzQ0OCw2ICs0MzU4LDI2IEBACiAgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CiAgIHJldHVybiBfYWlkbF9zdGF0dXM7CiB9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJVGVzdFNlcnZpY2VEZWZhdWx0OjpSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiAvKmluX2VwKi8sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUqIC8qb3V0X2VwMiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJldmVyc2VMaXN0KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIC8qaW5fbGlzdCovLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJldmVyc2VJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+JiAvKmluX2lucHV0Ki8sIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiogLypvdXRfcmVwZWF0ZWQqLywgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElUZXN0U2VydmljZURlZmF1bHQ6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIC8qaW5faW5wdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiAvKm91dF9yZXBlYXRlZCovLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQogOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVRlc3RTZXJ2aWNlRGVmYXVsdDo6R2V0T2xkTmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiAvKl9haWRsX3JldHVybiovKSB7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKICAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKQEAgLTM0NzgsMyArNDQwOCwyNTMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhaWRsCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBJVGVzdFNlcnZpY2U6OkVtcHR5OjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkiOworCitiaW5kZXJfc3RhdHVzX3QgSVRlc3RTZXJ2aWNlOjpFbXB0eTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBJVGVzdFNlcnZpY2U6OkVtcHR5Ojp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBJVGVzdFNlcnZpY2U6OkNvbXBpbGVyQ2hlY2tzOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuQ29tcGlsZXJDaGVja3MiOworCitiaW5kZXJfc3RhdHVzX3QgSVRlc3RTZXJ2aWNlOjpDb21waWxlckNoZWNrczo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiaW5kZXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9iaW5kZXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYmluZGVyX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfYmluZGVyX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJpbmRlcl9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfYmluZGVyX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGZkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfcGZkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnBmZF9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX3BmZF9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwZmRfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX3BmZF9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnBhcmNlbCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX3BhcmNlbCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWxfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9wYXJjZWxfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZudWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBJVGVzdFNlcnZpY2U6OkNvbXBpbGVyQ2hlY2tzOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYmluZGVyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9iaW5kZXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBiaW5kZXJfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJpbmRlcl9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBmZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfcGZkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGZkX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBudWxsYWJsZV9wZmRfYXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBwZmRfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfcGZkX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBwYXJjZWwpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX3BhcmNlbCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbF9hcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfcGFyY2VsX2FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwLmQKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCmluZGV4IDYwMTRkM2YuLmI0NjA2NmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcC5kCkBAIC0xLDQgKzEsNCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCBcCkBAIC03LDQgKzcsOCBAQAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5jcHAuZAppbmRleCBmMmIzMGMzLi42NWUzOTcyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWVkYTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcApAQCAtMCwwICsxLDQ2NSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogTGlzdE9mSW50ZXJmYWNlczo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcyI7CisKK2JpbmRlcl9zdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSUVtcHR5SW50ZXJmYWNlX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKKyAgKHZvaWQpX2FpZGxfaW47CisgICh2b2lkKV9haWRsX291dDsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKKyAgKHZvaWQpX2FpZGxfYmluZGVyOworICAodm9pZClfYWlkbF9jb2RlOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfTGlzdE9mSW50ZXJmYWNlc19JRW1wdHlJbnRlcmZhY2Vfb25UcmFuc2FjdCk7CisKK0xpc3RPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U6OkJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorTGlzdE9mSW50ZXJmYWNlczo6QnBFbXB0eUludGVyZmFjZTo6fkJwRW1wdHlJbnRlcmZhY2UoKSB7fQorCisvLyBTb3VyY2UgZm9yIEJuRW1wdHlJbnRlcmZhY2UKK0xpc3RPZkludGVyZmFjZXM6OkJuRW1wdHlJbnRlcmZhY2U6OkJuRW1wdHlJbnRlcmZhY2UoKSB7fQorTGlzdE9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6fkJuRW1wdHlJbnRlcmZhY2UoKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgTGlzdE9mSW50ZXJmYWNlczo6Qm5FbXB0eUludGVyZmFjZTo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSUVtcHR5SW50ZXJmYWNlX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElFbXB0eUludGVyZmFjZQorY29uc3QgY2hhciogTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSI7CitMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6OklFbXB0eUludGVyZmFjZSgpIHt9CitMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6On5JRW1wdHlJbnRlcmZhY2UoKSB7fQorCisKK3N0ZDo6c2hhcmVkX3B0cjxMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lFbXB0eUludGVyZmFjZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJRW1wdHlJbnRlcmZhY2U+KGludGVyZmFjZSk7CisgIH0KKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPExpc3RPZkludGVyZmFjZXM6OkJwRW1wdHlJbnRlcmZhY2U+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW5zdGFuY2UpIHsKKyAgcmV0dXJuIEFQYXJjZWxfd3JpdGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpbnN0YW5jZSA/IGluc3RhbmNlLT5hc0JpbmRlcigpLmdldCgpIDogbnVsbHB0cik7Cit9CitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElFbXB0eUludGVyZmFjZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICByZXR1cm4gU1RBVFVTX09LOworfQorYm9vbCBMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlFbXB0eUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSB7CisgIHJldHVybiBJRW1wdHlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbDsKK30KK3N0ZDo6c2hhcmVkX3B0cjxMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZTo6ZGVmYXVsdF9pbXBsID0gbnVsbHB0cjsKKzo6bmRrOjpTcEFJQmluZGVyIExpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgTGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKKyAgKHZvaWQpX2FpZGxfaW47CisgICh2b2lkKV9haWRsX291dDsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKKyAgc3RkOjpzaGFyZWRfcHRyPExpc3RPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8TGlzdE9mSW50ZXJmYWNlczo6Qm5NeUludGVyZmFjZT4oOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShfYWlkbF9iaW5kZXIpKTsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLyptZXRob2RXaXRoSW50ZXJmYWNlcyovKTogeworICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gaW5faWZhY2U7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpbl9udWxsYWJsZV9pZmFjZTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpbl9pZmFjZV9saXN0X2luOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IG91dF9pZmFjZV9saXN0X291dDsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpbl9pZmFjZV9saXN0X2lub3V0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW47CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OworICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ7CisgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gX2FpZGxfcmV0dXJuOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9pZmFjZSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX251bGxhYmxlX2lmYWNlKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2lmYWNlX2xpc3RfaW4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faWZhY2VfbGlzdF9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPm1ldGhvZFdpdGhJbnRlcmZhY2VzKGluX2lmYWNlLCBpbl9udWxsYWJsZV9pZmFjZSwgaW5faWZhY2VfbGlzdF9pbiwgJm91dF9pZmFjZV9saXN0X291dCwgJmluX2lmYWNlX2xpc3RfaW5vdXQsIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sICZvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsICZpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCAmX2FpZGxfcmV0dXJuKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIG91dF9pZmFjZV9saXN0X291dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5faWZhY2VfbGlzdF9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX291dCwgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfTGlzdE9mSW50ZXJmYWNlc19JTXlJbnRlcmZhY2VfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX0xpc3RPZkludGVyZmFjZXNfSU15SW50ZXJmYWNlX29uVHJhbnNhY3QpOworCitMaXN0T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlOjpCcE15SW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KK0xpc3RPZkludGVyZmFjZXM6OkJwTXlJbnRlcmZhY2U6On5CcE15SW50ZXJmYWNlKCkge30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgTGlzdE9mSW50ZXJmYWNlczo6QnBNeUludGVyZmFjZTo6bWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX2lmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5fbnVsbGFibGVfaWZhY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfbGlzdF9pbiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBvdXRfaWZhY2VfbGlzdF9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaW5faWZhY2VfbGlzdF9pbm91dCwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fbnVsbGFibGVfaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5faWZhY2VfbGlzdF9pbik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5faWZhY2VfbGlzdF9pbm91dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLyptZXRob2RXaXRoSW50ZXJmYWNlcyovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJTXlJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJTXlJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCktPm1ldGhvZFdpdGhJbnRlcmZhY2VzKGluX2lmYWNlLCBpbl9udWxsYWJsZV9pZmFjZSwgaW5faWZhY2VfbGlzdF9pbiwgb3V0X2lmYWNlX2xpc3Rfb3V0LCBpbl9pZmFjZV9saXN0X2lub3V0LCBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luLCBvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIF9haWRsX3JldHVybik7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIG91dF9pZmFjZV9saXN0X291dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9pZmFjZV9saXN0X2lub3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgaW5fbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCbk15SW50ZXJmYWNlCitMaXN0T2ZJbnRlcmZhY2VzOjpCbk15SW50ZXJmYWNlOjpCbk15SW50ZXJmYWNlKCkge30KK0xpc3RPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U6On5Cbk15SW50ZXJmYWNlKCkge30KKzo6bmRrOjpTcEFJQmluZGVyIExpc3RPZkludGVyZmFjZXM6OkJuTXlJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19MaXN0T2ZJbnRlcmZhY2VzX0lNeUludGVyZmFjZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKKyAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CisgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOworfQorLy8gU291cmNlIGZvciBJTXlJbnRlcmZhY2UKK2NvbnN0IGNoYXIqIExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiOworTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpJTXlJbnRlcmZhY2UoKSB7fQorTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjp+SU15SW50ZXJmYWNlKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8TGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlPiBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgeworICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfTGlzdE9mSW50ZXJmYWNlc19JTXlJbnRlcmZhY2VfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKKyAgaWYgKGludGVyZmFjZSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SU15SW50ZXJmYWNlPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxMaXN0T2ZJbnRlcmZhY2VzOjpCcE15SW50ZXJmYWNlPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiogaW5zdGFuY2UpIHsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOworICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7CisgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICAqaW5zdGFuY2UgPSBJTXlJbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJTXlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSU15SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U+JiBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSU15SW50ZXJmYWNlOjpkZWZhdWx0X2ltcGw7Cit9CitzdGQ6OnNoYXJlZF9wdHI8TGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlPiBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBMaXN0T2ZJbnRlcmZhY2VzOjpJTXlJbnRlcmZhY2VEZWZhdWx0OjptZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgLyppbl9pZmFjZSovLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgLyppbl9udWxsYWJsZV9pZmFjZSovLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIC8qaW5faWZhY2VfbGlzdF9pbiovLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIC8qb3V0X2lmYWNlX2xpc3Rfb3V0Ki8sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogLyppbl9pZmFjZV9saXN0X2lub3V0Ki8sIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgLyppbl9udWxsYWJsZV9pZmFjZV9saXN0X2luKi8sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogLypvdXRfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKmluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQqLywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiAvKl9haWRsX3JldHVybiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTcEFJQmluZGVyIExpc3RPZkludGVyZmFjZXM6OklNeUludGVyZmFjZURlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgTGlzdE9mSW50ZXJmYWNlczo6SU15SW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIExpc3RPZkludGVyZmFjZXM6Ok15UGFyY2VsYWJsZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVBhcmNlbGFibGUiOworCitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmlmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmbnVsbGFibGVfaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaWZhY2VfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm51bGxhYmxlX2lmYWNlX2xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaWZhY2UpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxhYmxlX2lmYWNlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaWZhY2VfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgbnVsbGFibGVfaWZhY2VfbGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY29uc3QgY2hhciogTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVVuaW9uIjsKKworYmluZGVyX3N0YXR1c190IExpc3RPZkludGVyZmFjZXM6Ok15VW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIGludDMyX3QgX2FpZGxfdGFnOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChfYWlkbF90YWcpIHsKKyAgY2FzZSBpZmFjZTogeworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PikgeworICAgICAgc2V0PGlmYWNlPihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGlmYWNlPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIFNUQVRVU19PSzsgfQorICBjYXNlIG51bGxhYmxlX2lmYWNlOiB7CisgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gX2FpZGxfdmFsdWU7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZT4oX2FpZGxfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZT4oc3RkOjptb3ZlKF9haWRsX3ZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBTVEFUVVNfT0s7IH0KKyAgY2FzZSBpZmFjZV9saXN0OiB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+IF9haWRsX3ZhbHVlOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4pIHsKKyAgICAgIHNldDxpZmFjZV9saXN0PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PGlmYWNlX2xpc3Q+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIGNhc2UgbnVsbGFibGVfaWZhY2VfbGlzdDogeworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiBfYWlkbF92YWx1ZTsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4pIHsKKyAgICAgIHNldDxudWxsYWJsZV9pZmFjZV9saXN0PihfYWlkbF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW1vdmUtY29uc3QtYXJnKQorICAgICAgc2V0PG51bGxhYmxlX2lmYWNlX2xpc3Q+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gU1RBVFVTX09LOyB9CisgIH0KKyAgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Cit9CitiaW5kZXJfc3RhdHVzX3QgTGlzdE9mSW50ZXJmYWNlczo6TXlVbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgc3dpdGNoIChnZXRUYWcoKSkgeworICBjYXNlIGlmYWNlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxpZmFjZT4oKSk7CisgIGNhc2UgbnVsbGFibGVfaWZhY2U6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfcGFyY2VsLCBnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOworICBjYXNlIGlmYWNlX2xpc3Q6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGlmYWNlX2xpc3Q+KCkpOworICBjYXNlIG51bGxhYmxlX2lmYWNlX2xpc3Q6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfcGFyY2VsLCBnZXQ8bnVsbGFibGVfaWZhY2VfbGlzdD4oKSk7CisgIH0KKyAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkYThkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmNwcC5kCmluZGV4IGYwN2I0MWQuLmUyNjg0OWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgyMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyI7CisKK2JpbmRlcl9zdGF0dXNfdCBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZmaWVsZCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGZpZWxkKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjQlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKaW5kZXggNTMxNzljZi4uZDg2ODJmZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kCkBAIC0xLDIgKzEsMiBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhYzE0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcApAQCAtMCwwICsxLDI2OSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7Citjb25zdCBjaGFyKiBQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLlBhcmNlbGFibGVGb3JUb1N0cmluZyI7CisKK2JpbmRlcl9zdGF0dXNfdCBQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50VmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50QXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmbG9uZ1ZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZkb3VibGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZkb3VibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZmbG9hdFZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZsb2F0QXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmJ5dGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZib29sZWFuVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYm9vbGVhbkFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ1ZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ0xpc3QpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmcGFyY2VsYWJsZVZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnBhcmNlbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZlbnVtVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZW51bUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJm51bGxBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZudWxsTGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZwYXJjZWxhYmxlR2VuZXJpYyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZ1bmlvblZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IFBhcmNlbGFibGVGb3JUb1N0cmluZzo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludFZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50QXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBsb25nVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBsb25nQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBkb3VibGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGRvdWJsZUFycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZmxvYXRWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGZsb2F0QXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBib29sZWFuVmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBib29sZWFuQXJyYXkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzdHJpbmdWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ0FycmF5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc3RyaW5nTGlzdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbGFibGVWYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHBhcmNlbGFibGVBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGVudW1WYWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGVudW1BcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxBcnJheSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIG51bGxMaXN0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgcGFyY2VsYWJsZUdlbmVyaWMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCB1bmlvblZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2NTRkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kCkBAIC0wLDAgKzEsMTAgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTQyOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIFJlY3Vyc2l2ZUxpc3Q6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3QiOworCitiaW5kZXJfc3RhdHVzX3QgUmVjdXJzaXZlTGlzdDo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZ2YWx1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJm5leHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgUmVjdXJzaXZlTGlzdDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHZhbHVlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCBuZXh0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDEzOTYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTllNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcApAQCAtMCwwICsxLDYyNCBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRDb250YWluVGhyZWVGcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZmKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZEJlSmVycnkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc2hvdWxkQmVCeXRlQmFyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZEJlSW50QmFyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnNob3VsZEJlTG9uZ0Jhcik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRDb250YWluVHdvQnl0ZUZvb3MpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc2hvdWxkQ29udGFpblR3b0ludEZvb3MpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmc2hvdWxkQ29udGFpblR3b0xvbmdGb29zKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJnN0cmluZ0RlZmF1bHRzVG9Gb28pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYnl0ZURlZmF1bHRzVG9Gb3VyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludERlZmF1bHRzVG9GaXZlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZib29sZWFuRGVmYXVsdHNUb1RydWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY2hhckRlZmF1bHRzVG9DKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZsb2F0RGVmYXVsdHNUb1BpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmRvdWJsZVdpdGhEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmFycmF5RGVmYXVsdHNUbzEyMyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZhcnJheURlZmF1bHRzVG9FbXB0eSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZib29sRGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZieXRlRGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnREZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmxvbmdEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmZsb2F0RGVmYXVsdCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZkb3VibGVEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNoZWNrRG91YmxlRnJvbUZsb2F0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNoZWNrU3RyaW5nQXJyYXkxKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNoZWNrU3RyaW5nQXJyYXkyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmludDMyX21pbik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnQzMl9tYXgpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50NjRfbWF4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmhleEludDMyX25lZ18xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfcGFyY2VsLCAmaWJpbmRlcik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZlbXB0eSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnQ4XzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmaW50MzJfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZpbnQ2NF8xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmhleEludDMyX3Bvc18xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmhleEludDY0X3Bvc18xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfMik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjb25zdF9leHByc18zKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfNSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjb25zdF9leHByc182KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzcpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmY29uc3RfZXhwcnNfOCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjb25zdF9leHByc185KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmNvbnN0X2V4cHJzXzEwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmFkZFN0cmluZzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYWRkU3RyaW5nMik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRTZXRCaXQwQW5kQml0Mik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgJnUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsICZzaG91bGRCZUNvbnN0UzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZGVmYXVsdFdpdGhGb28pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRDb250YWluVGhyZWVGcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGYpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRCZUplcnJ5KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc2hvdWxkQmVCeXRlQmFyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgc2hvdWxkQmVJbnRCYXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRCZUxvbmdCYXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRDb250YWluVHdvSW50Rm9vcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0cmluZ0RlZmF1bHRzVG9Gb28pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBieXRlRGVmYXVsdHNUb0ZvdXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnREZWZhdWx0c1RvRml2ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNoYXJEZWZhdWx0c1RvQyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGZsb2F0RGVmYXVsdHNUb1BpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZG91YmxlV2l0aERlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBhcnJheURlZmF1bHRzVG8xMjMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBhcnJheURlZmF1bHRzVG9FbXB0eSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGJvb2xEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYnl0ZURlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnREZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgbG9uZ0RlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBmbG9hdERlZmF1bHQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBkb3VibGVEZWZhdWx0KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY2hlY2tEb3VibGVGcm9tRmxvYXQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjaGVja1N0cmluZ0FycmF5MSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNoZWNrU3RyaW5nQXJyYXkyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50MzJfbWluKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50MzJfbWF4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaW50NjRfbWF4KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaGV4SW50MzJfbmVnXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9wYXJjZWwsIGliaW5kZXIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBlbXB0eSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludDhfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGludDMyXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBpbnQ2NF8xKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgaGV4SW50MzJfcG9zXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBoZXhJbnQ2NF9wb3NfMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjb25zdF9leHByc18yKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfMyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzQpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjb25zdF9leHByc181KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfNik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzcpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjb25zdF9leHByc184KTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgY29uc3RfZXhwcnNfOSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGNvbnN0X2V4cHJzXzEwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYWRkU3RyaW5nMSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGFkZFN0cmluZzIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzaG91bGRTZXRCaXQwQW5kQml0Mik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgdSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX3BhcmNlbCwgc2hvdWxkQmVDb25zdFMxKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgZGVmYXVsdFdpdGhGb28pOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NvbnN0IGNoYXIqIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpFbXB0eTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUuRW1wdHkiOworCitiaW5kZXJfc3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OkVtcHR5OjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpFbXB0eTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcC5kCmluZGV4IDFiOTAyZTYuLjdlN2JkZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAuZApAQCAtMSw0ICsxLDQgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbCBcCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggNjQlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcAppbmRleCBhODM4ZmUwLi42OTQxYzAzIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcApAQCAtMTIsMTEgKzEyLDExIEBACiBiaW5kZXJfc3RhdHVzX3QgVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9wYXJjZWwpIHsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CiAgIGludDMyX3QgX2FpZGxfdGFnOwotICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIHN3aXRjaCAoX2FpZGxfdGFnKSB7CiAgIGNhc2UgbnM6IHsKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBfYWlkbF92YWx1ZTsKLSAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KSB7CiAgICAgICBzZXQ8bnM+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMjYsNyArMjYsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBuOiB7CiAgICAgaW50MzJfdCBfYWlkbF92YWx1ZTsKLSAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PGludDMyX3Q+KSB7CiAgICAgICBzZXQ8bj4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0zNiw3ICszNiw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIG06IHsKICAgICBpbnQzMl90IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKICAgICAgIHNldDxtPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICByZXR1cm4gU1RBVFVTX09LOyB9CiAgIGNhc2UgczogewogICAgIHN0ZDo6c3RyaW5nIF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnN0cmluZz4pIHsKICAgICAgIHNldDxzPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTU2LDcgKzU2LDcgQEAKICAgICByZXR1cm4gU1RBVFVTX09LOyB9CiAgIGNhc2UgaWJpbmRlcjogewogICAgIDo6bmRrOjpTcEFJQmluZGVyIF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcihfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjpuZGs6OlNwQUlCaW5kZXI+KSB7CiAgICAgICBzZXQ8aWJpbmRlcj4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC02Niw3ICs2Niw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIHNzOiB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KSB7CiAgICAgICBzZXQ8c3M+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtNzYsNyArNzYsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBiZTogewogICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUoX3BhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQ4X3QqPigmX2FpZGxfdmFsdWUpKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4pIHsKICAgICAgIHNldDxiZT4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC04OCwxNiArODgsMTYgQEAKICAgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CiB9CiBiaW5kZXJfc3RhdHVzX3QgVW5pb246OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfcGFyY2VsLCBnZXRUYWcoKSk7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldFRhZygpKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgc3dpdGNoIChnZXRUYWcoKSkgewotICBjYXNlIG5zOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX3BhcmNlbCwgZ2V0PG5zPigpKTsKLSAgY2FzZSBuOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxuPigpKTsKLSAgY2FzZSBtOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxtPigpKTsKLSAgY2FzZSBzOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX3BhcmNlbCwgZ2V0PHM+KCkpOwotICBjYXNlIGliaW5kZXI6IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlU3Ryb25nQmluZGVyKF9wYXJjZWwsIGdldDxpYmluZGVyPigpKTsKLSAgY2FzZSBzczogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9wYXJjZWwsIGdldDxzcz4oKSk7Ci0gIGNhc2UgYmU6IHJldHVybiBBUGFyY2VsX3dyaXRlQnl0ZShfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGdldDxiZT4oKSkpOworICBjYXNlIG5zOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxucz4oKSk7CisgIGNhc2UgbjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8bj4oKSk7CisgIGNhc2UgbTogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8bT4oKSk7CisgIGNhc2UgczogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8cz4oKSk7CisgIGNhc2UgaWJpbmRlcjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9wYXJjZWwsIGdldDxpYmluZGVyPigpKTsKKyAgY2FzZSBzczogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8c3M+KCkpOworICBjYXNlIGJlOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxiZT4oKSk7CiAgIH0KICAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uY3BwLmQKaW5kZXggMWJkZGM5MC4uMjg5MjE4MCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcC5kCkBAIC0xLDMgKzEsMyBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5jcHAgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwCmluZGV4IDE1M2NjMDYuLjIyM2Q2NGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwCkBAIC0xMSwxMSArMTEsMTEgQEAKIGJpbmRlcl9zdGF0dXNfdCBVbmlvbldpdGhGZDo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCkgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKICAgaW50MzJfdCBfYWlkbF90YWc7Ci0gIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdGFnKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgc3dpdGNoIChfYWlkbF90YWcpIHsKICAgY2FzZSBudW06IHsKICAgICBpbnQzMl90IF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8aW50MzJfdD4pIHsKICAgICAgIHNldDxudW0+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMjUsNyArMjUsNyBAQAogICAgIHJldHVybiBTVEFUVVNfT0s7IH0KICAgY2FzZSBwZmQ6IHsKICAgICA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFJlcXVpcmVkUGFyY2VsRmlsZURlc2NyaXB0b3IoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KSB7CiAgICAgICBzZXQ8cGZkPihfYWlkbF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTM3LDExICszNywxMSBAQAogICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKIH0KIGJpbmRlcl9zdGF0dXNfdCBVbmlvbldpdGhGZDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0VGFnKCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKGdldFRhZygpKSB7Ci0gIGNhc2UgbnVtOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxudW0+KCkpOwotICBjYXNlIHBmZDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlUmVxdWlyZWRQYXJjZWxGaWxlRGVzY3JpcHRvcihfcGFyY2VsLCBnZXQ8cGZkPigpKTsKKyAgY2FzZSBudW06IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PG51bT4oKSk7CisgIGNhc2UgcGZkOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxwZmQ+KCkpOwogICB9CiAgIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcC5kCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmNwcC5kCmluZGV4IDUyNDdhNzQuLmE2OTZiYzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAuZApAQCAtMSwyICsxLDIgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5jcHAgOiBcCitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODAzYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAKQEAgLTAsMCArMSw5MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NvbnN0IGNoYXIqIEV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uRXh0ZW5kYWJsZVBhcmNlbGFibGUiOworCitiaW5kZXJfc3RhdHVzX3QgRXh0ZW5kYWJsZVBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmV4dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZjKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmV4dDIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRXh0ZW5kYWJsZVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBhKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYik7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGV4dCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBleHQyKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuY3BwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhMWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5jcHAgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2U1MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5jcHAKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NvbnN0IGNoYXIqIE15RXh0OjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uTXlFeHQiOworCitiaW5kZXJfc3RhdHVzX3QgTXlFeHQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IE15RXh0Ojp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTVlYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjMzMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcApAQCAtMCwwICsxLDcxIEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NvbnN0IGNoYXIqIE15RXh0Mjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0MiI7CisKK2JpbmRlcl9zdGF0dXNfdCBNeUV4dDI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgTXlFeHQyOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX3BhcmNlbCwgYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGIpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBjKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYwNjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmNwcC5kCkBAIC0wLDAgKzEsMyBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc1OWVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcApAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NvbnN0IGNoYXIqIE15RXh0TGlrZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0TGlrZSI7CisKK2JpbmRlcl9zdGF0dXNfdCBNeUV4dExpa2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmYSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IE15RXh0TGlrZTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGEpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTIyOTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzI0M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcApAQCAtMCwwICsxLDE5OSBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Citjb25zdCBjaGFyKiBEZWVwbHlOZXN0ZWQ6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQiOworCitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorYmluZGVyX3N0YXR1c190IERlZXBseU5lc3RlZDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7Citjb25zdCBjaGFyKiBEZWVwbHlOZXN0ZWQ6OkE6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQSI7CisKK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgeworICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgfQorICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfcGFyY2VsLCAmZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkE6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBlKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NvbnN0IGNoYXIqIERlZXBseU5lc3RlZDo6Qjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5CIjsKKworYmluZGVyX3N0YXR1c190IERlZXBseU5lc3RlZDo6Qjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY29uc3QgY2hhciogRGVlcGx5TmVzdGVkOjpCOjpDOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkLkIuQyI7CisKK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OkM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NvbnN0IGNoYXIqIERlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5CLkMuRCI7CisKK2JpbmRlcl9zdGF0dXNfdCBEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZSA9IDA7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9wYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgRGVlcGx5TmVzdGVkOjpCOjpDOjpEOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY1OTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmNwcC5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4NzA3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDM5NyBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JuTmVzdGVkU2VydmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfbmVzdGVkX0lOZXN0ZWRTZXJ2aWNlX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKKyAgKHZvaWQpX2FpZGxfaW47CisgICh2b2lkKV9haWRsX291dDsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJuTmVzdGVkU2VydmljZT4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxCbk5lc3RlZFNlcnZpY2U+KDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoX2FpZGxfYmluZGVyKSk7CisgIHN3aXRjaCAoX2FpZGxfY29kZSkgeworICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qZmxpcFN0YXR1cyovKTogeworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCBpbl9wOworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0IF9haWRsX3JldHVybjsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fcCk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5mbGlwU3RhdHVzKGluX3AsICZfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxIC8qZmxpcFN0YXR1c1dpdGhDYWxsYmFjayovKTogeworICAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1czsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+IGluX2NiOworCisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9zdGF0dXMpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fY2IpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhpbl9zdGF0dXMsIGluX2NiKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfbmVzdGVkX0lOZXN0ZWRTZXJ2aWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTmVzdGVkU2VydmljZTo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9vblRyYW5zYWN0KTsKKworQnBOZXN0ZWRTZXJ2aWNlOjpCcE5lc3RlZFNlcnZpY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorQnBOZXN0ZWRTZXJ2aWNlOjp+QnBOZXN0ZWRTZXJ2aWNlKCkge30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBOZXN0ZWRTZXJ2aWNlOjpmbGlwU3RhdHVzKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIGluX3AsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OlJlc3VsdCogX2FpZGxfcmV0dXJuKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fcCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCisgICAgYXNCaW5kZXIoKS5nZXQoKSwKKyAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypmbGlwU3RhdHVzKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElOZXN0ZWRTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCktPmZsaXBTdGF0dXMoaW5fcCwgX2FpZGxfcmV0dXJuKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBCcE5lc3RlZFNlcnZpY2U6OmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGluX2NiKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fc3RhdHVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2NiKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSAvKmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2sqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSU5lc3RlZFNlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJTmVzdGVkU2VydmljZTo6Z2V0RGVmYXVsdEltcGwoKS0+ZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhpbl9zdGF0dXMsIGluX2NiKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKy8vIFNvdXJjZSBmb3IgQm5OZXN0ZWRTZXJ2aWNlCitCbk5lc3RlZFNlcnZpY2U6OkJuTmVzdGVkU2VydmljZSgpIHt9CitCbk5lc3RlZFNlcnZpY2U6On5Cbk5lc3RlZFNlcnZpY2UoKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgQm5OZXN0ZWRTZXJ2aWNlOjpjcmVhdGVCaW5kZXIoKSB7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfbmVzdGVkX0lOZXN0ZWRTZXJ2aWNlX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElOZXN0ZWRTZXJ2aWNlCitjb25zdCBjaGFyKiBJTmVzdGVkU2VydmljZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlIjsKK0lOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZSgpIHt9CitJTmVzdGVkU2VydmljZTo6fklOZXN0ZWRTZXJ2aWNlKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+IElOZXN0ZWRTZXJ2aWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTmVzdGVkU2VydmljZT4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8QnBOZXN0ZWRTZXJ2aWNlPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBJTmVzdGVkU2VydmljZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElOZXN0ZWRTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIElOZXN0ZWRTZXJ2aWNlOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlOZXN0ZWRTZXJ2aWNlOjpkZWZhdWx0X2ltcGwpOworICBpZiAoaW1wbCkgeworICAgIElOZXN0ZWRTZXJ2aWNlOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZT4mIElOZXN0ZWRTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElOZXN0ZWRTZXJ2aWNlOjpkZWZhdWx0X2ltcGw7Cit9CitzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+IElOZXN0ZWRTZXJ2aWNlOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSU5lc3RlZFNlcnZpY2VEZWZhdWx0OjpmbGlwU3RhdHVzKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQmIC8qaW5fcCovLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSU5lc3RlZFNlcnZpY2VEZWZhdWx0OjpmbGlwU3RhdHVzV2l0aENhbGxiYWNrKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyAvKmluX3N0YXR1cyovLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrPiYgLyppbl9jYiovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTcEFJQmluZGVyIElOZXN0ZWRTZXJ2aWNlRGVmYXVsdDo6YXNCaW5kZXIoKSB7CisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcigpOworfQorYm9vbCBJTmVzdGVkU2VydmljZURlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NvbnN0IGNoYXIqIElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZS5SZXN1bHQiOworCitiaW5kZXJfc3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzdGF0dXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIGNvbnN0IHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7CisgIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9haWRsX3BhcmNlbCwgMCk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0YXR1cyk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOworICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitzdGF0aWMgYmluZGVyX3N0YXR1c190IF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2VfSUNhbGxiYWNrX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKKyAgKHZvaWQpX2FpZGxfaW47CisgICh2b2lkKV9haWRsX291dDsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKKyAgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrPiBfYWlkbF9pbXBsID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrPig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKmRvbmUqLyk6IHsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXM7CisKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX3N0YXR1cyk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5kb25lKGluX3N0YXR1cyk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZVN0YXR1c0hlYWRlcihfYWlkbF9vdXQsIF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBicmVhazsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworfQorCitzdGF0aWMgQUlCaW5kZXJfQ2xhc3MqIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9JQ2FsbGJhY2tfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2VfSUNhbGxiYWNrX29uVHJhbnNhY3QpOworCitJTmVzdGVkU2VydmljZTo6QnBDYWxsYmFjazo6QnBDYWxsYmFjayhjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitJTmVzdGVkU2VydmljZTo6QnBDYWxsYmFjazo6fkJwQ2FsbGJhY2soKSB7fQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBJTmVzdGVkU2VydmljZTo6QnBDYWxsYmFjazo6ZG9uZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fc3RhdHVzKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKmRvbmUqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSUNhbGxiYWNrOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSUNhbGxiYWNrOjpnZXREZWZhdWx0SW1wbCgpLT5kb25lKGluX3N0YXR1cyk7CisgICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICB9CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKKworICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIF9haWRsX2Vycm9yOgorICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7CisgIF9haWRsX3N0YXR1c19yZXR1cm46CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CisvLyBTb3VyY2UgZm9yIEJuQ2FsbGJhY2sKK0lOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrOjpCbkNhbGxiYWNrKCkge30KK0lOZXN0ZWRTZXJ2aWNlOjpCbkNhbGxiYWNrOjp+Qm5DYWxsYmFjaygpIHt9Cis6Om5kazo6U3BBSUJpbmRlciBJTmVzdGVkU2VydmljZTo6Qm5DYWxsYmFjazo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX25lc3RlZF9JTmVzdGVkU2VydmljZV9JQ2FsbGJhY2tfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSUNhbGxiYWNrCitjb25zdCBjaGFyKiBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIjsKK0lOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OklDYWxsYmFjaygpIHt9CitJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjp+SUNhbGxiYWNrKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4gSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19uZXN0ZWRfSU5lc3RlZFNlcnZpY2VfSUNhbGxiYWNrX2NsYXp6KSkgeyByZXR1cm4gbnVsbHB0cjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8OjpuZGs6OklDSW50ZXJmYWNlPiBpbnRlcmZhY2UgPSA6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKGJpbmRlci5nZXQoKSk7CisgIGlmIChpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElDYWxsYmFjaz4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8SU5lc3RlZFNlcnZpY2U6OkJwQ2FsbGJhY2s+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElDYWxsYmFjaz4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElDYWxsYmFjaz4qIGluc3RhbmNlKSB7CisgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFQYXJjZWxfcmVhZFN0cm9uZ0JpbmRlcihwYXJjZWwsIGJpbmRlci5nZXRSKCkpOworICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgKmluc3RhbmNlID0gSUNhbGxiYWNrOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlDYWxsYmFjazo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJQ2FsbGJhY2s6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrOjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElDYWxsYmFjazo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+IElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrRGVmYXVsdDo6ZG9uZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgLyppbl9zdGF0dXMqLykgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U3BBSUJpbmRlciBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrRGVmYXVsdDo6YXNCaW5kZXIoKSB7CisgIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcigpOworfQorYm9vbCBJTmVzdGVkU2VydmljZTo6SUNhbGxiYWNrRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDgxZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuY3BwLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NmQxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcApAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworY29uc3QgY2hhciogUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZCI7CisKK2JpbmRlcl9zdGF0dXNfdCBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOworICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzdGF0dXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CitiaW5kZXJfc3RhdHVzX3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfcGFyY2VsLCBzdGF0dXMpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworCisgIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVmMzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlN2E3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmNwcApAQCAtMCwwICsxLDIzNCBAQAorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWQuaD4KKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBwZXJtaXNzaW9uIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX3Blcm1pc3Npb25fSVByb3RlY3RlZF9vblRyYW5zYWN0KEFJQmluZGVyKiBfYWlkbF9iaW5kZXIsIHRyYW5zYWN0aW9uX2NvZGVfdCBfYWlkbF9jb2RlLCBjb25zdCBBUGFyY2VsKiBfYWlkbF9pbiwgQVBhcmNlbCogX2FpZGxfb3V0KSB7CisgICh2b2lkKV9haWRsX2luOworICAodm9pZClfYWlkbF9vdXQ7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT047CisgIHN0ZDo6c2hhcmVkX3B0cjxCblByb3RlY3RlZD4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxCblByb3RlY3RlZD4oOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShfYWlkbF9iaW5kZXIpKTsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypQZXJtaXNzaW9uUHJvdGVjdGVkKi8pOiB7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPlBlcm1pc3Npb25Qcm90ZWN0ZWQoKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEgLypNdWx0aXBsZVBlcm1pc3Npb25zQWxsKi8pOiB7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPk11bHRpcGxlUGVybWlzc2lvbnNBbGwoKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIgLypNdWx0aXBsZVBlcm1pc3Npb25zQW55Ki8pOiB7CisKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfcGVybWlzc2lvbl9JUHJvdGVjdGVkX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJUHJvdGVjdGVkOjpkZXNjcmlwdG9yLCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfcGVybWlzc2lvbl9JUHJvdGVjdGVkX29uVHJhbnNhY3QpOworCitCcFByb3RlY3RlZDo6QnBQcm90ZWN0ZWQoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQorQnBQcm90ZWN0ZWQ6On5CcFByb3RlY3RlZCgpIHt9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwUHJvdGVjdGVkOjpQZXJtaXNzaW9uUHJvdGVjdGVkKCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKlBlcm1pc3Npb25Qcm90ZWN0ZWQqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVByb3RlY3RlZDo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElQcm90ZWN0ZWQ6OmdldERlZmF1bHRJbXBsKCktPlBlcm1pc3Npb25Qcm90ZWN0ZWQoKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwUHJvdGVjdGVkOjpNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSAvKk11bHRpcGxlUGVybWlzc2lvbnNBbGwqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVByb3RlY3RlZDo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElQcm90ZWN0ZWQ6OmdldERlZmF1bHRJbXBsKCktPk11bHRpcGxlUGVybWlzc2lvbnNBbGwoKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIEJwUHJvdGVjdGVkOjpNdWx0aXBsZVBlcm1pc3Npb25zQW55KCkgeworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19PSzsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9pbjsKKyAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfb3V0OworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl90cmFuc2FjdCgKKyAgICBhc0JpbmRlcigpLmdldCgpLAorICAgIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMiAvKk11bHRpcGxlUGVybWlzc2lvbnNBbnkqLyksCisgICAgX2FpZGxfaW4uZ2V0UigpLAorICAgIF9haWRsX291dC5nZXRSKCksCisgICAgMAorICAgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICB8IEZMQUdfUFJJVkFURV9MT0NBTAorICAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgPT0gU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04gJiYgSVByb3RlY3RlZDo6Z2V0RGVmYXVsdEltcGwoKSkgeworICAgIF9haWRsX3N0YXR1cyA9IElQcm90ZWN0ZWQ6OmdldERlZmF1bHRJbXBsKCktPk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgICBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47CisgIH0KKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9zdGF0dXMuZ2V0UigpKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOworCisgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKF9haWRsX3JldF9zdGF0dXMpKTsKKyAgX2FpZGxfc3RhdHVzX3JldHVybjoKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKy8vIFNvdXJjZSBmb3IgQm5Qcm90ZWN0ZWQKK0JuUHJvdGVjdGVkOjpCblByb3RlY3RlZCgpIHt9CitCblByb3RlY3RlZDo6fkJuUHJvdGVjdGVkKCkge30KKzo6bmRrOjpTcEFJQmluZGVyIEJuUHJvdGVjdGVkOjpjcmVhdGVCaW5kZXIoKSB7CisgIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfcGVybWlzc2lvbl9JUHJvdGVjdGVkX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElQcm90ZWN0ZWQKK2NvbnN0IGNoYXIqIElQcm90ZWN0ZWQ6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZCI7CitJUHJvdGVjdGVkOjpJUHJvdGVjdGVkKCkge30KK0lQcm90ZWN0ZWQ6On5JUHJvdGVjdGVkKCkge30KKworCitzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZD4gSVByb3RlY3RlZDo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19wZXJtaXNzaW9uX0lQcm90ZWN0ZWRfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKKyAgaWYgKGludGVyZmFjZSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SVByb3RlY3RlZD4oaW50ZXJmYWNlKTsKKyAgfQorICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8QnBQcm90ZWN0ZWQ+KGJpbmRlcik7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBJUHJvdGVjdGVkOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWQ+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBJUHJvdGVjdGVkOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkPiogaW5zdGFuY2UpIHsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOworICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7CisgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICAqaW5zdGFuY2UgPSBJUHJvdGVjdGVkOjpmcm9tQmluZGVyKGJpbmRlcik7CisgIHJldHVybiBTVEFUVVNfT0s7Cit9Citib29sIElQcm90ZWN0ZWQ6OnNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkPiYgaW1wbCkgeworICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgorICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKKyAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KKyAgYXNzZXJ0KCFJUHJvdGVjdGVkOjpkZWZhdWx0X2ltcGwpOworICBpZiAoaW1wbCkgeworICAgIElQcm90ZWN0ZWQ6OmRlZmF1bHRfaW1wbCA9IGltcGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWQ+JiBJUHJvdGVjdGVkOjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgcmV0dXJuIElQcm90ZWN0ZWQ6OmRlZmF1bHRfaW1wbDsKK30KK3N0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkPiBJUHJvdGVjdGVkOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVByb3RlY3RlZERlZmF1bHQ6OlBlcm1pc3Npb25Qcm90ZWN0ZWQoKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTY29wZWRBU3RhdHVzIElQcm90ZWN0ZWREZWZhdWx0OjpNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgeworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIF9haWRsX3N0YXR1cy5zZXQoQVN0YXR1c19mcm9tU3RhdHVzKFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OKSk7CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJUHJvdGVjdGVkRGVmYXVsdDo6TXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNwQUlCaW5kZXIgSVByb3RlY3RlZERlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgSVByb3RlY3RlZERlZmF1bHQ6OmlzUmVtb3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmNwcC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjUyZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5jcHAuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuY3BwIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRmNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JuUHJvdGVjdGVkSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHBlcm1pc3Npb24geworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfdGVzdHNfcGVybWlzc2lvbl9JUHJvdGVjdGVkSW50ZXJmYWNlX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKKyAgKHZvaWQpX2FpZGxfaW47CisgICh2b2lkKV9haWRsX291dDsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJuUHJvdGVjdGVkSW50ZXJmYWNlPiBfYWlkbF9pbXBsID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEJuUHJvdGVjdGVkSW50ZXJmYWNlPig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKk1ldGhvZDEqLyk6IHsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+TWV0aG9kMSgpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMSAvKk1ldGhvZDIqLyk6IHsKKworICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzID0gX2FpZGxfaW1wbC0+TWV0aG9kMigpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKKworICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKK30KKworc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19wZXJtaXNzaW9uX0lQcm90ZWN0ZWRJbnRlcmZhY2VfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElQcm90ZWN0ZWRJbnRlcmZhY2U6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19wZXJtaXNzaW9uX0lQcm90ZWN0ZWRJbnRlcmZhY2Vfb25UcmFuc2FjdCk7CisKK0JwUHJvdGVjdGVkSW50ZXJmYWNlOjpCcFByb3RlY3RlZEludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitCcFByb3RlY3RlZEludGVyZmFjZTo6fkJwUHJvdGVjdGVkSW50ZXJmYWNlKCkge30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBQcm90ZWN0ZWRJbnRlcmZhY2U6Ok1ldGhvZDEoKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qTWV0aG9kMSovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUHJvdGVjdGVkSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVByb3RlY3RlZEludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+TWV0aG9kMSgpOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgQnBQcm90ZWN0ZWRJbnRlcmZhY2U6Ok1ldGhvZDIoKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxIC8qTWV0aG9kMiovKSwKKyAgICBfYWlkbF9pbi5nZXRSKCksCisgICAgX2FpZGxfb3V0LmdldFIoKSwKKyAgICAwCisgICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgIHwgRkxBR19QUklWQVRFX0xPQ0FMCisgICAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgICApOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTiAmJiBJUHJvdGVjdGVkSW50ZXJmYWNlOjpnZXREZWZhdWx0SW1wbCgpKSB7CisgICAgX2FpZGxfc3RhdHVzID0gSVByb3RlY3RlZEludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+TWV0aG9kMigpOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCblByb3RlY3RlZEludGVyZmFjZQorQm5Qcm90ZWN0ZWRJbnRlcmZhY2U6OkJuUHJvdGVjdGVkSW50ZXJmYWNlKCkge30KK0JuUHJvdGVjdGVkSW50ZXJmYWNlOjp+Qm5Qcm90ZWN0ZWRJbnRlcmZhY2UoKSB7fQorOjpuZGs6OlNwQUlCaW5kZXIgQm5Qcm90ZWN0ZWRJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKKyAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2FuZHJvaWRfYWlkbF90ZXN0c19wZXJtaXNzaW9uX0lQcm90ZWN0ZWRJbnRlcmZhY2VfY2xhenosIHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7CisgICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgQUlCaW5kZXJfbWFya0NvbXBpbGF0aW9uVW5pdFN0YWJpbGl0eShiaW5kZXIpOworICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoYmluZGVyKTsKK30KKy8vIFNvdXJjZSBmb3IgSVByb3RlY3RlZEludGVyZmFjZQorY29uc3QgY2hhciogSVByb3RlY3RlZEludGVyZmFjZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlIjsKK0lQcm90ZWN0ZWRJbnRlcmZhY2U6OklQcm90ZWN0ZWRJbnRlcmZhY2UoKSB7fQorSVByb3RlY3RlZEludGVyZmFjZTo6fklQcm90ZWN0ZWRJbnRlcmZhY2UoKSB7fQorCisKK3N0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkSW50ZXJmYWNlPiBJUHJvdGVjdGVkSW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX3Rlc3RzX3Blcm1pc3Npb25fSVByb3RlY3RlZEludGVyZmFjZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJUHJvdGVjdGVkSW50ZXJmYWNlPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxCcFByb3RlY3RlZEludGVyZmFjZT4oYmluZGVyKTsKK30KKworYmluZGVyX3N0YXR1c190IElQcm90ZWN0ZWRJbnRlcmZhY2U6OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZEludGVyZmFjZT4mIGluc3RhbmNlKSB7CisgIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOworfQorYmluZGVyX3N0YXR1c190IElQcm90ZWN0ZWRJbnRlcmZhY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWRJbnRlcmZhY2U+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElQcm90ZWN0ZWRJbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgSVByb3RlY3RlZEludGVyZmFjZTo6c2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWRJbnRlcmZhY2U+JiBpbXBsKSB7CisgIC8vIE9ubHkgb25lIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCisgIC8vIGF0IGEgdGltZS4gVGhpcyBpcyBhIGhldXJpc3RpYyB0byBkZXRlY3QgaWYgdHdvIGRpZmZlcmVudAorICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgorICBhc3NlcnQoIUlQcm90ZWN0ZWRJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7CisgIGlmIChpbXBsKSB7CisgICAgSVByb3RlY3RlZEludGVyZmFjZTo6ZGVmYXVsdF9pbXBsID0gaW1wbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Citjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZEludGVyZmFjZT4mIElQcm90ZWN0ZWRJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSVByb3RlY3RlZEludGVyZmFjZTo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWRJbnRlcmZhY2U+IElQcm90ZWN0ZWRJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBJUHJvdGVjdGVkSW50ZXJmYWNlRGVmYXVsdDo6TWV0aG9kMSgpIHsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTikpOworICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorOjpuZGs6OlNjb3BlZEFTdGF0dXMgSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHQ6Ok1ldGhvZDIoKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTcEFJQmluZGVyIElQcm90ZWN0ZWRJbnRlcmZhY2VEZWZhdWx0Ojphc0JpbmRlcigpIHsKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKCk7Cit9Citib29sIElQcm90ZWN0ZWRJbnRlcmZhY2VEZWZhdWx0Ojppc1JlbW90ZSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5jcHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGJhYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuY3BwLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwCmluZGV4IDI1ZjdjNjguLjA4YmNkOGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcApAQCAtMTIsMTEgKzEyLDExIEBACiBiaW5kZXJfc3RhdHVzX3QgRW51bVVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwogICBpbnQzMl90IF9haWRsX3RhZzsKLSAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKF9haWRsX3RhZykgewogICBjYXNlIGludEVudW06IHsKICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9wYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZfYWlkbF92YWx1ZSkpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF92YWx1ZSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KSB7CiAgICAgICBzZXQ8aW50RW51bT4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIGxvbmdFbnVtOiB7CiAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQoX3BhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oJl9haWRsX3ZhbHVlKSkpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KSB7CiAgICAgICBzZXQ8bG9uZ0VudW0+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMzgsMTEgKzM4LDExIEBACiAgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwogfQogYmluZGVyX3N0YXR1c190IEVudW1Vbmlvbjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdCB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldFRhZygpKTsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0VGFnKCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKGdldFRhZygpKSB7Ci0gIGNhc2UgaW50RW51bTogcmV0dXJuIEFQYXJjZWxfd3JpdGVJbnQzMihfcGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90PihnZXQ8aW50RW51bT4oKSkpOwotICBjYXNlIGxvbmdFbnVtOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDY0KF9wYXJjZWwsIHN0YXRpY19jYXN0PGludDY0X3Q+KGdldDxsb25nRW51bT4oKSkpOworICBjYXNlIGludEVudW06IHJldHVybiA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX3BhcmNlbCwgZ2V0PGludEVudW0+KCkpOworICBjYXNlIGxvbmdFbnVtOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxsb25nRW51bT4oKSk7CiAgIH0KICAgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImNhbid0IHJlYWNoIGhlcmUiKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAuZApzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5jcHAuZAppbmRleCAwNzgxZGY5Li45YWQxMzNjIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcC5kCkBAIC0xLDQgKzEsNCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwIDogXAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwCmluZGV4IDc5YzM2ZmYuLjVkYjVjOTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcApAQCAtMTIsMTEgKzEyLDExIEBACiBiaW5kZXJfc3RhdHVzX3QgVW5pb25JblVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwogICBpbnQzMl90IF9haWRsX3RhZzsKLSAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKF9haWRsX3RhZykgewogICBjYXNlIGZpcnN0OiB7CiAgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb24gX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bmlvbnM6OkVudW1Vbmlvbj4pIHsKICAgICAgIHNldDxmaXJzdD4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIHNlY29uZDogewogICAgIGludDMyX3QgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQzMl90PikgewogICAgICAgc2V0PHNlY29uZD4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0zOCwxMSArMzgsMTEgQEAKICAgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CiB9CiBiaW5kZXJfc3RhdHVzX3QgVW5pb25JblVuaW9uOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9wYXJjZWwpIGNvbnN0IHsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgZ2V0VGFnKCkpOworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXRUYWcoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKLSAgY2FzZSBmaXJzdDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZShfcGFyY2VsLCBnZXQ8Zmlyc3Q+KCkpOwotICBjYXNlIHNlY29uZDogcmV0dXJuIEFQYXJjZWxfd3JpdGVJbnQzMihfcGFyY2VsLCBnZXQ8c2Vjb25kPigpKTsKKyAgY2FzZSBmaXJzdDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8Zmlyc3Q+KCkpOworICBjYXNlIHNlY29uZDogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8c2Vjb25kPigpKTsKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uY3BwLmQKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwLmQKaW5kZXggMDc4MWRmOS4uMzcxMTNkOSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcC5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZApAQCAtMSw0ICsxLDUgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmNwcCA6IFwKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcCA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDNiZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEsMjc5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworI2lmbmRlZiBfX0JJT05JQ19fCisjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgQXJyYXlPZkludGVyZmFjZXMgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBjbGFzcyBJRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICAgIElFbXB0eUludGVyZmFjZSgpOworICAgIHZpcnR1YWwgfklFbXB0eUludGVyZmFjZSgpOworCisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJRW1wdHlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwRW1wdHlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBFbXB0eUludGVyZmFjZSgpOworCisgIH07CisgIGNsYXNzIEJuRW1wdHlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJRW1wdHlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIEJuRW1wdHlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5CbkVtcHR5SW50ZXJmYWNlKCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgY2xhc3MgSU15SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgICBJTXlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5JTXlJbnRlcmZhY2UoKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fbWV0aG9kV2l0aEludGVyZmFjZXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiBmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+KiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGltcGwpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIG1ldGhvZFdpdGhJbnRlcmZhY2VzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5faWZhY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5fbnVsbGFibGVfaWZhY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4mIGluX2lmYWNlX2FycmF5X2luLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBvdXRfaWZhY2VfYXJyYXlfb3V0LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpbl9pZmFjZV9hcnJheV9pbm91dCwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiYgaW5fbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG91dF9udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4gZGVmYXVsdF9pbXBsOworICB9OworICBjbGFzcyBJTXlJbnRlcmZhY2VEZWZhdWx0IDogcHVibGljIElNeUludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX2lmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX251bGxhYmxlX2lmYWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpbl9pZmFjZV9hcnJheV9pbiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Piogb3V0X2lmYWNlX2FycmF5X291dCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaW5faWZhY2VfYXJyYXlfaW5vdXQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOworICAgIGJvb2wgaXNSZW1vdGUoKSBvdmVycmlkZTsKKyAgfTsKKyAgY2xhc3MgQnBNeUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBNeUludGVyZmFjZShjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICB2aXJ0dWFsIH5CcE15SW50ZXJmYWNlKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX2lmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX251bGxhYmxlX2lmYWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpbl9pZmFjZV9hcnJheV9pbiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Piogb3V0X2lmYWNlX2FycmF5X291dCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaW5faWZhY2VfYXJyYXlfaW5vdXQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIGluX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBvdXRfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBpbl9udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgfTsKKyAgY2xhc3MgQm5NeUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElNeUludGVyZmFjZT4geworICBwdWJsaWM6CisgICAgQm5NeUludGVyZmFjZSgpOworICAgIHZpcnR1YWwgfkJuTXlJbnRlcmZhY2UoKTsKKyAgcHJvdGVjdGVkOgorICAgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworICBwcml2YXRlOgorICB9OworICBjbGFzcyBNeVBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpZmFjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4gbnVsbGFibGVfaWZhY2U7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiBpZmFjZV9hcnJheTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+IG51bGxhYmxlX2lmYWNlX2FycmF5OworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgIT0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpIDwgc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA8PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2FycmF5LCByaHMubnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9hcnJheSwgbnVsbGFibGVfaWZhY2VfYXJyYXkpID09IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfYXJyYXksIG51bGxhYmxlX2lmYWNlX2FycmF5KSA+IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfYXJyYXksIHJocy5udWxsYWJsZV9pZmFjZV9hcnJheSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShpZmFjZSwgbnVsbGFibGVfaWZhY2UsIGlmYWNlX2FycmF5LCBudWxsYWJsZV9pZmFjZV9hcnJheSkgPj0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9hcnJheSwgcmhzLm51bGxhYmxlX2lmYWNlX2FycmF5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2UpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2U6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2UpOworICAgICAgb3MgPDwgIiwgaWZhY2VfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2VfYXJyYXkpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfaWZhY2VfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfaWZhY2VfYXJyYXkpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsKKyAgY2xhc3MgTXlVbmlvbiB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgZW51bSBUYWcgOiBpbnQzMl90IHsKKyAgICAgIGlmYWNlID0gMCwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgaWZhY2U7CisgICAgICBudWxsYWJsZV9pZmFjZSwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UgbnVsbGFibGVfaWZhY2U7CisgICAgICBpZmFjZV9hcnJheSwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2VbXSBpZmFjZV9hcnJheTsKKyAgICAgIG51bGxhYmxlX2lmYWNlX2FycmF5LCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZVtdIG51bGxhYmxlX2lmYWNlX2FycmF5OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBNeVVuaW9uPjsKKworICAgIE15VW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PGlmYWNlPiwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+KCkpIHsgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KKyAgICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCisgICAgY29uc3RleHByIE15VW5pb24oX1RwJiYgX2FyZykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjpmb3J3YXJkPF9UcD4oX2FyZykpIHt9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgorICAgIGNvbnN0ZXhwciBleHBsaWNpdCBNeVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXhfdDxfTnA+LCBfVHAmJi4uLiBfYXJncykKKyAgICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdGF0aWMgTXlVbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVXA+CisgICAgc3RhdGljIE15VW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7CisgICAgICByZXR1cm4gTXlVbmlvbihzdGQ6OmluX3BsYWNlX2luZGV4PF90YWc+LCBzdGQ6Om1vdmUoX2lsKSwgc3RkOjpmb3J3YXJkPF9VcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRhZz4oX3ZhbHVlLmluZGV4KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZz4KKyAgICBjb25zdCBhdXRvJiBnZXQoKSBjb25zdCB7CisgICAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQorICAgICAgcmV0dXJuIHN0ZDo6Z2V0PF90YWc+KF92YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICAgIGF1dG8mIGdldCgpIHsKKyAgICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgeworICAgICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlIDwgcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPD0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA+IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID49IHJocy5fdmFsdWU7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15VW5pb257IjsKKyAgICAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKKyAgICAgIGNhc2UgaWZhY2U6IG9zIDw8ICJpZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2U6IG9zIDw8ICJudWxsYWJsZV9pZmFjZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2U+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgaWZhY2VfYXJyYXk6IG9zIDw8ICJpZmFjZV9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2VfYXJyYXk+KCkpOyBicmVhazsKKyAgICAgIGNhc2UgbnVsbGFibGVfaWZhY2VfYXJyYXk6IG9zIDw8ICJudWxsYWJsZV9pZmFjZV9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2VfYXJyYXk+KCkpOyBicmVhazsKKyAgICAgIH0KKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgc3RkOjp2YXJpYW50PHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkFycmF5T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QXJyYXlPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpBcnJheU9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+PiBfdmFsdWU7CisgIH07CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBcnJheU9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQXJyYXlPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJBcnJheU9mSW50ZXJmYWNlc3siOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmgKaW5kZXggNjgzOGNhNy4uZjY5ZTQzMyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oCkBAIC0xLDE1ICsxLDE2IEBACiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtMjEsNiArMjIsMTQgQEAKICAgUlVTVCA9IDMsCiB9OwogCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQmFja2VuZFR5cGUgdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBCYWNrZW5kVHlwZTo6Q1BQOgpAQCAtNTIsNCArNjEsNCBAQAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQXJyYXlPZkludGVyZmFjZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQXJyYXlPZkludGVyZmFjZXMuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5CYWNrZW5kVHlwZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5CYWNrZW5kVHlwZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkJhY2tlbmRUeXBlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQmFja2VuZFR5cGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5CeXRlRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5CeXRlRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkJ5dGVFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQnl0ZUVudW0uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Db25zdGFudEV4cHJlc3Npb25FbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkNvbnN0YW50RXhwcmVzc2lvbkVudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWQuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZEVudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkRW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRFbnVtLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkUGFyY2VsYWJsZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkRlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRml4ZWRTaXplLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkZpeGVkU2l6ZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5JbnRFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkludEVudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5JbnRFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuSW50RW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbkxpc3RPZkludGVyZmFjZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTGlzdE9mSW50ZXJmYWNlcy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkxvbmdFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CbkxvbmdFbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTG9uZ0VudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Mb25nRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmFtZWRDYWxsYmFjay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5hbWVkQ2FsbGJhY2suaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OYW1lZENhbGxiYWNrLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5OZXdOYW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuTmV3TmFtZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk5ld05hbWUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk9sZE5hbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PbGROYW1lLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT2xkTmFtZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Cbk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblBhcmNlbGFibGVGb3JUb1N0cmluZy5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5SZWN1cnNpdmVMaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblJlY3Vyc2l2ZUxpc3QuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblN0cnVjdHVyZWRQYXJjZWxhYmxlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuU3RydWN0dXJlZFBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5UZXN0U2VydmljZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblRlc3RTZXJ2aWNlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVGVzdFNlcnZpY2UuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5Vbmlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5VbmlvbldpdGhGZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5VbmlvbldpdGhGZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uV2l0aEZkLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBBcnJheU9mSW50ZXJmYWNlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBBcnJheU9mSW50ZXJmYWNlcy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEJhY2tlbmRUeXBlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEJhY2tlbmRUeXBlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQmFja2VuZFR5cGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBCYWNrZW5kVHlwZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEJ5dGVFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEJ5dGVFbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQnl0ZUVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBCeXRlRW51bS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcENvbnN0YW50RXhwcmVzc2lvbkVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcENvbnN0YW50RXhwcmVzc2lvbkVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBDb25zdGFudEV4cHJlc3Npb25FbnVtLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZC5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWQuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWRFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZEVudW0uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRGVwcmVjYXRlZFBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBGaXhlZFNpemUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwRml4ZWRTaXplLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEludEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwSW50RW51bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcEludEVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBJbnRFbnVtLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTGlzdE9mSW50ZXJmYWNlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBMaXN0T2ZJbnRlcmZhY2VzLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTG9uZ0VudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTG9uZ0VudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBMb25nRW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcExvbmdFbnVtLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOYW1lZENhbGxiYWNrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmFtZWRDYWxsYmFjay5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5hbWVkQ2FsbGJhY2suaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE5ld05hbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBOZXdOYW1lLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwTmV3TmFtZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT2xkTmFtZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE9sZE5hbWUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPbGROYW1lLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFBhcmNlbGFibGVGb3JUb1N0cmluZy5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFBhcmNlbGFibGVGb3JUb1N0cmluZy5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFJlY3Vyc2l2ZUxpc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwUmVjdXJzaXZlTGlzdC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFN0cnVjdHVyZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFN0cnVjdHVyZWRQYXJjZWxhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwU3RydWN0dXJlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmgKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFRlc3RTZXJ2aWNlLmgKaW5kZXggMzBiMGZhMC4uNzFiNzViZSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBUZXN0U2VydmljZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVGVzdFNlcnZpY2UuaApAQCAtNDAsNiArNDAsMTIgQEAKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgaW5fc2VydmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yJiBpbl9yZWFkLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CkBAIC00OSwxNyArNTUsMjUgQEAKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKGNvbnN0IHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FuSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgaW5faW5wdXQpIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgaW5fdG9rZW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCBpbl9yZXR1cm5fbnVsbCwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiBpbl9wYXJjZWwpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiBpbl9lcCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogb3V0X2VwMikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VMaXN0KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIGluX2xpc3QsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE9sZE5hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0TmV3TmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDcHBKYXZhVGVzdHMoOjpuZGs6OlNwQUlCaW5kZXIqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uV2l0aEZkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uV2l0aEZkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb25XaXRoRmQuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbldpdGhGZC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaApzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oCmluZGV4IDMwYWM5ZTUuLjljYjAxNDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaApAQCAtMSwxNSArMSwxNiBAQAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2VudW1zLmg+CisKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhaWRsIHsKQEAgLTIwLDYgKzIxLDE0IEBACiAgIEJBWiA9IDMsCiB9OwogCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQnl0ZUVudW0gdmFsKSB7CiAgIHN3aXRjaCh2YWwpIHsKICAgY2FzZSBCeXRlRW51bTo6Rk9POgpAQCAtNDgsNCArNTcsNCBAQAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaAppbmRleCAxODAyZDg0Li41ZmJjYzAwIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5oCkBAIC0xLDE1ICsxLDE2IEBACiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtMjcsNiArMjgsMTQgQEAKICAgaGV4SW50NjRfMSA9IDEsCiB9OwogCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CiBbW25vZGlzY2FyZF1dIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoQ29uc3RhbnRFeHByZXNzaW9uRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbkVudW06OmRlY0ludDMyXzE6CkBAIC01OCw0ICs2Nyw0IEBACiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmgKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0uaAppbmRleCA4NTNjODA4Li4yOTk4NzRjIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRFbnVtLmgKQEAgLTEsMTUgKzEsMTYgQEAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CkBAIC0yMCw2ICsyMSwxNCBAQAogICBDID0gMiwKIH07CiAKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhEZXByZWNhdGVkRW51bSB2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRlc3QiKSkpOwogW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKERlcHJlY2F0ZWRFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CkBAIC00OSw0ICs1OCw0IEBACiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuaAppbmRleCA1MjcxOWJjLi41Y2NlZGMyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgKQEAgLTEsMTUgKzEsMTcgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKwogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc4Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmgKQEAgLTAsMCArMSwyMzUgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YXJpYW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKKyNpZm5kZWYgX19CSU9OSUNfXworI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK2NsYXNzIEZpeGVkU2l6ZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgIGNsYXNzIEZpeGVkVW5pb24geworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgZW51bSBUYWcgOiB1aW50OF90IHsKKyAgICAgIGJvb2xlYW5WYWx1ZSA9IDAsICAvLyBib29sZWFuIGJvb2xlYW5WYWx1ZTsKKyAgICAgIGJ5dGVWYWx1ZSwgIC8vIGJ5dGUgYnl0ZVZhbHVlOworICAgICAgY2hhclZhbHVlLCAgLy8gY2hhciBjaGFyVmFsdWU7CisgICAgICBpbnRWYWx1ZSwgIC8vIGludCBpbnRWYWx1ZTsKKyAgICAgIGxvbmdWYWx1ZSwgIC8vIGxvbmcgbG9uZ1ZhbHVlOworICAgICAgZmxvYXRWYWx1ZSwgIC8vIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICBkb3VibGVWYWx1ZSwgIC8vIGRvdWJsZSBkb3VibGVWYWx1ZTsKKyAgICAgIGVudW1WYWx1ZSwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5Mb25nRW51bSBlbnVtVmFsdWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDxUYWcgX1RhZz4KKyAgICB1c2luZyBfYXQgPSB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8X1RhZywgc3RkOjp0dXBsZTxib29sLCBpbnQ4X3QsIGNoYXIxNl90LCBpbnQzMl90LCBpbnQ2NF90LCBmbG9hdCwgZG91YmxlLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+Ojp0eXBlOworICAgIHRlbXBsYXRlIDxUYWcgX1RhZywgdHlwZW5hbWUgX1R5cGU+CisgICAgc3RhdGljIEZpeGVkVW5pb24gbWFrZShfVHlwZSYmIF9hcmcpIHsKKyAgICAgIEZpeGVkVW5pb24gX2luc3Q7CisgICAgICBfaW5zdC5zZXQ8X1RhZz4oc3RkOjpmb3J3YXJkPF9UeXBlPihfYXJnKSk7CisgICAgICByZXR1cm4gX2luc3Q7CisgICAgfQorICAgIGNvbnN0ZXhwciBUYWcgZ2V0VGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIF90YWc7CisgICAgfQorICAgIHRlbXBsYXRlIDxUYWcgX1RhZz4KKyAgICBjb25zdCBfYXQ8X1RhZz4mIGdldCgpIGNvbnN0IHsKKyAgICAgIGlmIChfVGFnICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiAqKF9hdDxfVGFnPiopKCZfdmFsdWUpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgX2F0PF9UYWc+JiBnZXQoKSB7CisgICAgICBpZiAoX1RhZyAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gKihfYXQ8X1RhZz4qKSgmX3ZhbHVlKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPFRhZyBfVGFnLCB0eXBlbmFtZSBfVHlwZT4KKyAgICB2b2lkIHNldChfVHlwZSYmIF9hcmcpIHsKKyAgICAgIF90YWcgPSBfVGFnOworICAgICAgZ2V0PF9UYWc+KCkgPSBzdGQ6OmZvcndhcmQ8X1R5cGU+KF9hcmcpOworICAgIH0KKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogX3BhcmNlbCkgY29uc3Q7CisKKyAgICBzdGF0aWMgaW50IF9jbXAoY29uc3QgRml4ZWRVbmlvbiYgX2xocywgY29uc3QgRml4ZWRVbmlvbiYgX3JocykgeworICAgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXRUYWcoKSwgX3Jocy5nZXRUYWcoKSkgfHwgX2NtcF92YWx1ZV9hdDxlbnVtVmFsdWU+KF9saHMsIF9yaHMpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8VGFnIF9UYWc+CisgICAgc3RhdGljIGludCBfY21wX3ZhbHVlX2F0KGNvbnN0IEZpeGVkVW5pb24mIF9saHMsIGNvbnN0IEZpeGVkVW5pb24mIF9yaHMpIHsKKyAgICAgIGlmIGNvbnN0ZXhwciAoX1RhZyA9PSBib29sZWFuVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKF9saHMuZ2V0VGFnKCkgPT0gX1RhZykKKyAgICAgICAgICA/IF9jbXBfdmFsdWUoX2xocy5nZXQ8X1RhZz4oKSwgX3Jocy5nZXQ8X1RhZz4oKSkKKyAgICAgICAgICA6IF9jbXBfdmFsdWVfYXQ8KFRhZykoX1RhZy0xKT4oX2xocywgX3Jocyk7CisgICAgICB9CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHlwZT4KKyAgICBzdGF0aWMgaW50IF9jbXBfdmFsdWUoY29uc3QgX1R5cGUmIF9saHMsIGNvbnN0IF9UeXBlJiBfcmhzKSB7CisgICAgICByZXR1cm4gKF9saHMgPT0gX3JocykgPyAwIDogKF9saHMgPCBfcmhzKSA/IC0xIDogMTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSAhPSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPCAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpIDw9IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRml4ZWRVbmlvbiZfcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX2NtcCgqdGhpcywgX3JocykgPT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkVW5pb24mX3JocykgY29uc3QgeworICAgICAgcmV0dXJuIF9jbXAoKnRoaXMsIF9yaHMpID4gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFVuaW9uJl9yaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfY21wKCp0aGlzLCBfcmhzKSA+PSAwOworICAgIH0KKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRml4ZWRVbmlvbnsiOworICAgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgICAgY2FzZSBib29sZWFuVmFsdWU6IG9zIDw8ICJib29sZWFuVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGJvb2xlYW5WYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBieXRlVmFsdWU6IG9zIDw8ICJieXRlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGJ5dGVWYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBjaGFyVmFsdWU6IG9zIDw8ICJjaGFyVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGNoYXJWYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBpbnRWYWx1ZTogb3MgPDwgImludFZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpbnRWYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBsb25nVmFsdWU6IG9zIDw8ICJsb25nVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGxvbmdWYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBmbG9hdFZhbHVlOiBvcyA8PCAiZmxvYXRWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8ZmxvYXRWYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBkb3VibGVWYWx1ZTogb3MgPDwgImRvdWJsZVZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxkb3VibGVWYWx1ZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBlbnVtVmFsdWU6IG9zIDw8ICJlbnVtVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PGVudW1WYWx1ZT4oKSk7IGJyZWFrOworICAgICAgfQorICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBUYWcgX3RhZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICgxKSkpID0gYm9vbGVhblZhbHVlOworICAgIHVuaW9uIF92YWx1ZV90IHsKKyAgICAgIF92YWx1ZV90KCkge30KKyAgICAgIH5fdmFsdWVfdCgpIHt9CisgICAgICBib29sIGJvb2xlYW5WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICgxKSkpID0gYm9vbChmYWxzZSk7CisgICAgICBpbnQ4X3QgYnl0ZVZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDEpKSk7CisgICAgICBjaGFyMTZfdCBjaGFyVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMikpKTsKKyAgICAgIGludDMyX3QgaW50VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKTsKKyAgICAgIGludDY0X3QgbG9uZ1ZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICBmbG9hdCBmbG9hdFZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDQpKSk7CisgICAgICBkb3VibGUgZG91YmxlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKKyAgICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGVudW1WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgIH0gX3ZhbHVlOworICB9OworICBjbGFzcyBGaXhlZFBhcmNlbGFibGUgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgYm9vbCBib29sZWFuVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMSkpKSA9IGZhbHNlOworICAgIGludDhfdCBieXRlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMSkpKSA9IDA7CisgICAgY2hhcjE2X3QgY2hhclZhbHVlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDIpKSkgPSAnXDAnOworICAgIGludDMyX3QgaW50VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKSA9IDA7CisgICAgaW50NjRfdCBsb25nVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKSA9IDBMOworICAgIGZsb2F0IGZsb2F0VmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoNCkpKSA9IDAuMDAwMDAwZjsKKyAgICBkb3VibGUgZG91YmxlVmFsdWUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKSA9IDAuMDAwMDAwOworICAgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGVudW1WYWx1ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW06OkZPTzsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpGaXhlZFNpemU6OkZpeGVkVW5pb24gcGFyY2VsYWJsZVZhbHVlOworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpICE9IHN0ZDo6dGllKHJocy5ib29sZWFuVmFsdWUsIHJocy5ieXRlVmFsdWUsIHJocy5jaGFyVmFsdWUsIHJocy5pbnRWYWx1ZSwgcmhzLmxvbmdWYWx1ZSwgcmhzLmZsb2F0VmFsdWUsIHJocy5kb3VibGVWYWx1ZSwgcmhzLmVudW1WYWx1ZSwgcmhzLnBhcmNlbGFibGVWYWx1ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPCBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA8PSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYm9vbGVhblZhbHVlLCBieXRlVmFsdWUsIGNoYXJWYWx1ZSwgaW50VmFsdWUsIGxvbmdWYWx1ZSwgZmxvYXRWYWx1ZSwgZG91YmxlVmFsdWUsIGVudW1WYWx1ZSwgcGFyY2VsYWJsZVZhbHVlKSA9PSBzdGQ6OnRpZShyaHMuYm9vbGVhblZhbHVlLCByaHMuYnl0ZVZhbHVlLCByaHMuY2hhclZhbHVlLCByaHMuaW50VmFsdWUsIHJocy5sb25nVmFsdWUsIHJocy5mbG9hdFZhbHVlLCByaHMuZG91YmxlVmFsdWUsIHJocy5lbnVtVmFsdWUsIHJocy5wYXJjZWxhYmxlVmFsdWUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRml4ZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShib29sZWFuVmFsdWUsIGJ5dGVWYWx1ZSwgY2hhclZhbHVlLCBpbnRWYWx1ZSwgbG9uZ1ZhbHVlLCBmbG9hdFZhbHVlLCBkb3VibGVWYWx1ZSwgZW51bVZhbHVlLCBwYXJjZWxhYmxlVmFsdWUpID4gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGJvb2xlYW5WYWx1ZSwgYnl0ZVZhbHVlLCBjaGFyVmFsdWUsIGludFZhbHVlLCBsb25nVmFsdWUsIGZsb2F0VmFsdWUsIGRvdWJsZVZhbHVlLCBlbnVtVmFsdWUsIHBhcmNlbGFibGVWYWx1ZSkgPj0gc3RkOjp0aWUocmhzLmJvb2xlYW5WYWx1ZSwgcmhzLmJ5dGVWYWx1ZSwgcmhzLmNoYXJWYWx1ZSwgcmhzLmludFZhbHVlLCByaHMubG9uZ1ZhbHVlLCByaHMuZmxvYXRWYWx1ZSwgcmhzLmRvdWJsZVZhbHVlLCByaHMuZW51bVZhbHVlLCByaHMucGFyY2VsYWJsZVZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRml4ZWRQYXJjZWxhYmxleyI7CisgICAgICBvcyA8PCAiYm9vbGVhblZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xlYW5WYWx1ZSk7CisgICAgICBvcyA8PCAiLCBieXRlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZVZhbHVlKTsKKyAgICAgIG9zIDw8ICIsIGNoYXJWYWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGFyVmFsdWUpOworICAgICAgb3MgPDwgIiwgaW50VmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50VmFsdWUpOworICAgICAgb3MgPDwgIiwgbG9uZ1ZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdWYWx1ZSk7CisgICAgICBvcyA8PCAiLCBmbG9hdFZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGZsb2F0VmFsdWUpOworICAgICAgb3MgPDwgIiwgZG91YmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZG91YmxlVmFsdWUpOworICAgICAgb3MgPDwgIiwgZW51bVZhbHVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGVudW1WYWx1ZSk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxhYmxlVmFsdWU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsYWJsZVZhbHVlKTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRml4ZWRTaXplJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZpeGVkU2l6ZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaXhlZFNpemUmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJGaXhlZFNpemV7IjsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaAppbmRleCAxMTNhZmY0Li5lYzAxODk5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaApAQCAtMSwxNSArMSwxNyBAQAogI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CkBAIC03MSw0OCArNzMsNDkgQEAKIGNvbnN0IGNoYXIqIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxULCBVLCBCPjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI+Ci1iaW5kZXJfc3RhdHVzX3QgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlPFQsIFUsIEI+OjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7Ci0gIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworYmluZGVyX3N0YXR1c190IEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxULCBVLCBCPjo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKF9haWRsX3BhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisKKyAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDQpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwogICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZhKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmEpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZiKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX3BhcmNlbCwgJmIpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBCPgotYmluZGVyX3N0YXR1c190IEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZTxULCBVLCBCPjo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKK2JpbmRlcl9zdGF0dXNfdCBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU8VCwgVSwgQj46OndyaXRlVG9QYXJjZWwoQVBhcmNlbCogX2FpZGxfcGFyY2VsKSBjb25zdCB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIDApOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIDApOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBhKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGEpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBiKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIGIpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSURlcHJlY2F0ZWQuaAppbmRleCA4MGQ1NTg5Li40YzhjNjdjIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLmgKQEAgLTEsMTIgKzEsMTEgQEAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLmgKaW5kZXggZDM4YzdlMS4uY2ExNGMwZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oCkBAIC0xLDEyICsxLDExIEBACiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotCiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oCmluZGV4IDFmOTNkNWYuLjVjNDJmOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5ld05hbWUuaApAQCAtMSwxMiArMSwxMSBAQAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLQogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaAppbmRleCBjNGE0Zjc5Li5iZmY5MDVkIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmgKQEAgLTEsMTIgKzEsMTEgQEAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhMTY5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5oCkBAIC0wLDAgKzEsNDMyIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlcl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWNrZW5kVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lPbGROYW1lLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgSVRlc3RTZXJ2aWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICBJVGVzdFNlcnZpY2UoKTsKKyAgdmlydHVhbCB+SVRlc3RTZXJ2aWNlKCk7CisKKyAgY2xhc3MgRW1wdHkgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVtcHR5JikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPj0gc3RkOjp0aWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiRW1wdHl7IjsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisgIGNsYXNzIENvbXBpbGVyQ2hlY2tzIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgbnVsbGFibGVfYmluZGVyOworICAgIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiBiaW5kZXJfYXJyYXk7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+IG51bGxhYmxlX2JpbmRlcl9hcnJheTsKKyAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4gYmluZGVyX2xpc3Q7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+IG51bGxhYmxlX2JpbmRlcl9saXN0OworICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciBwZmQ7CisgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yIG51bGxhYmxlX3BmZDsKKyAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+IHBmZF9hcnJheTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4+IG51bGxhYmxlX3BmZF9hcnJheTsKKyAgICBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+IHBmZF9saXN0OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPj4gbnVsbGFibGVfcGZkX2xpc3Q7CisgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eSBwYXJjZWw7CisgICAgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBudWxsYWJsZV9wYXJjZWw7CisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4gcGFyY2VsX2FycmF5OworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+IG51bGxhYmxlX3BhcmNlbF9hcnJheTsKKyAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiBwYXJjZWxfbGlzdDsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiBudWxsYWJsZV9wYXJjZWxfbGlzdDsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbXBpbGVyQ2hlY2tzJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShiaW5kZXIsIG51bGxhYmxlX2JpbmRlciwgYmluZGVyX2FycmF5LCBudWxsYWJsZV9iaW5kZXJfYXJyYXksIGJpbmRlcl9saXN0LCBudWxsYWJsZV9iaW5kZXJfbGlzdCwgcGZkLCBudWxsYWJsZV9wZmQsIHBmZF9hcnJheSwgbnVsbGFibGVfcGZkX2FycmF5LCBwZmRfbGlzdCwgbnVsbGFibGVfcGZkX2xpc3QsIHBhcmNlbCwgbnVsbGFibGVfcGFyY2VsLCBwYXJjZWxfYXJyYXksIG51bGxhYmxlX3BhcmNlbF9hcnJheSwgcGFyY2VsX2xpc3QsIG51bGxhYmxlX3BhcmNlbF9saXN0KSAhPSBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvbXBpbGVyQ2hlY2tzJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShiaW5kZXIsIG51bGxhYmxlX2JpbmRlciwgYmluZGVyX2FycmF5LCBudWxsYWJsZV9iaW5kZXJfYXJyYXksIGJpbmRlcl9saXN0LCBudWxsYWJsZV9iaW5kZXJfbGlzdCwgcGZkLCBudWxsYWJsZV9wZmQsIHBmZF9hcnJheSwgbnVsbGFibGVfcGZkX2FycmF5LCBwZmRfbGlzdCwgbnVsbGFibGVfcGZkX2xpc3QsIHBhcmNlbCwgbnVsbGFibGVfcGFyY2VsLCBwYXJjZWxfYXJyYXksIG51bGxhYmxlX3BhcmNlbF9hcnJheSwgcGFyY2VsX2xpc3QsIG51bGxhYmxlX3BhcmNlbF9saXN0KSA8IHN0ZDo6dGllKHJocy5iaW5kZXIsIHJocy5udWxsYWJsZV9iaW5kZXIsIHJocy5iaW5kZXJfYXJyYXksIHJocy5udWxsYWJsZV9iaW5kZXJfYXJyYXksIHJocy5iaW5kZXJfbGlzdCwgcmhzLm51bGxhYmxlX2JpbmRlcl9saXN0LCByaHMucGZkLCByaHMubnVsbGFibGVfcGZkLCByaHMucGZkX2FycmF5LCByaHMubnVsbGFibGVfcGZkX2FycmF5LCByaHMucGZkX2xpc3QsIHJocy5udWxsYWJsZV9wZmRfbGlzdCwgcmhzLnBhcmNlbCwgcmhzLm51bGxhYmxlX3BhcmNlbCwgcmhzLnBhcmNlbF9hcnJheSwgcmhzLm51bGxhYmxlX3BhcmNlbF9hcnJheSwgcmhzLnBhcmNlbF9saXN0LCByaHMubnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IENvbXBpbGVyQ2hlY2tzJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShiaW5kZXIsIG51bGxhYmxlX2JpbmRlciwgYmluZGVyX2FycmF5LCBudWxsYWJsZV9iaW5kZXJfYXJyYXksIGJpbmRlcl9saXN0LCBudWxsYWJsZV9iaW5kZXJfbGlzdCwgcGZkLCBudWxsYWJsZV9wZmQsIHBmZF9hcnJheSwgbnVsbGFibGVfcGZkX2FycmF5LCBwZmRfbGlzdCwgbnVsbGFibGVfcGZkX2xpc3QsIHBhcmNlbCwgbnVsbGFibGVfcGFyY2VsLCBwYXJjZWxfYXJyYXksIG51bGxhYmxlX3BhcmNlbF9hcnJheSwgcGFyY2VsX2xpc3QsIG51bGxhYmxlX3BhcmNlbF9saXN0KSA8PSBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPT0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPiBzdGQ6OnRpZShyaHMuYmluZGVyLCByaHMubnVsbGFibGVfYmluZGVyLCByaHMuYmluZGVyX2FycmF5LCByaHMubnVsbGFibGVfYmluZGVyX2FycmF5LCByaHMuYmluZGVyX2xpc3QsIHJocy5udWxsYWJsZV9iaW5kZXJfbGlzdCwgcmhzLnBmZCwgcmhzLm51bGxhYmxlX3BmZCwgcmhzLnBmZF9hcnJheSwgcmhzLm51bGxhYmxlX3BmZF9hcnJheSwgcmhzLnBmZF9saXN0LCByaHMubnVsbGFibGVfcGZkX2xpc3QsIHJocy5wYXJjZWwsIHJocy5udWxsYWJsZV9wYXJjZWwsIHJocy5wYXJjZWxfYXJyYXksIHJocy5udWxsYWJsZV9wYXJjZWxfYXJyYXksIHJocy5wYXJjZWxfbGlzdCwgcmhzLm51bGxhYmxlX3BhcmNlbF9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDb21waWxlckNoZWNrcyYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoYmluZGVyLCBudWxsYWJsZV9iaW5kZXIsIGJpbmRlcl9hcnJheSwgbnVsbGFibGVfYmluZGVyX2FycmF5LCBiaW5kZXJfbGlzdCwgbnVsbGFibGVfYmluZGVyX2xpc3QsIHBmZCwgbnVsbGFibGVfcGZkLCBwZmRfYXJyYXksIG51bGxhYmxlX3BmZF9hcnJheSwgcGZkX2xpc3QsIG51bGxhYmxlX3BmZF9saXN0LCBwYXJjZWwsIG51bGxhYmxlX3BhcmNlbCwgcGFyY2VsX2FycmF5LCBudWxsYWJsZV9wYXJjZWxfYXJyYXksIHBhcmNlbF9saXN0LCBudWxsYWJsZV9wYXJjZWxfbGlzdCkgPj0gc3RkOjp0aWUocmhzLmJpbmRlciwgcmhzLm51bGxhYmxlX2JpbmRlciwgcmhzLmJpbmRlcl9hcnJheSwgcmhzLm51bGxhYmxlX2JpbmRlcl9hcnJheSwgcmhzLmJpbmRlcl9saXN0LCByaHMubnVsbGFibGVfYmluZGVyX2xpc3QsIHJocy5wZmQsIHJocy5udWxsYWJsZV9wZmQsIHJocy5wZmRfYXJyYXksIHJocy5udWxsYWJsZV9wZmRfYXJyYXksIHJocy5wZmRfbGlzdCwgcmhzLm51bGxhYmxlX3BmZF9saXN0LCByaHMucGFyY2VsLCByaHMubnVsbGFibGVfcGFyY2VsLCByaHMucGFyY2VsX2FycmF5LCByaHMubnVsbGFibGVfcGFyY2VsX2FycmF5LCByaHMucGFyY2VsX2xpc3QsIHJocy5udWxsYWJsZV9wYXJjZWxfbGlzdCk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIkNvbXBpbGVyQ2hlY2tzeyI7CisgICAgICBvcyA8PCAiYmluZGVyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJpbmRlcik7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9iaW5kZXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfYmluZGVyKTsKKyAgICAgIG9zIDw8ICIsIGJpbmRlcl9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJfYXJyYXkpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfYmluZGVyX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2JpbmRlcl9hcnJheSk7CisgICAgICBvcyA8PCAiLCBiaW5kZXJfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiaW5kZXJfbGlzdCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9iaW5kZXJfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9iaW5kZXJfbGlzdCk7CisgICAgICBvcyA8PCAiLCBwZmQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGZkKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BmZDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wZmQpOworICAgICAgb3MgPDwgIiwgcGZkX2FycmF5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZF9hcnJheSk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9wZmRfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGZkX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIHBmZF9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHBmZF9saXN0KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BmZF9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BmZF9saXN0KTsKKyAgICAgIG9zIDw8ICIsIHBhcmNlbDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhwYXJjZWwpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGFyY2VsOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX3BhcmNlbCk7CisgICAgICBvcyA8PCAiLCBwYXJjZWxfYXJyYXk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsX2FycmF5KTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX3BhcmNlbF9hcnJheTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhudWxsYWJsZV9wYXJjZWxfYXJyYXkpOworICAgICAgb3MgPDwgIiwgcGFyY2VsX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcocGFyY2VsX2xpc3QpOworICAgICAgb3MgPDwgIiwgbnVsbGFibGVfcGFyY2VsX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobnVsbGFibGVfcGFyY2VsX2xpc3QpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UMiA9IC00MiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQzID0gNDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNCA9IDQgfTsKKyAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNSA9IC00IH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDYgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDcgPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDggPSAwIH07CisgIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDkgPSA4NiB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMCA9IDE2NSB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMSA9IDI1MCB9OworICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMiA9IC0xIH07CisgIGVudW0gOiBpbnQ4X3QgeyBCWVRFX1RFU1RfQ09OU1RBTlQgPSAxNyB9OworICBlbnVtIDogaW50NjRfdCB7IExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMIH07CisgIHN0YXRpYyBjb25zdCBjaGFyKiBTVFJJTkdfVEVTVF9DT05TVEFOVDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UMjsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UX1VURjg7CisgIGVudW0gOiBpbnQzMl90IHsgQTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExMSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTEzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEExNyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMTggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTE5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTIyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyMyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyNiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMjcgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTI4ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEyOSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzAgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTMxID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzMiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzMgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM0ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzNSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzYgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTM3ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEEzOCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBMzkgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQwID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0MSA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDIgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQzID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDUgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ2ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE0NyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNDggPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTQ5ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MCA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTEgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTUyID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1MyA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTQgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQTU1ID0gMSB9OworICBlbnVtIDogaW50MzJfdCB7IEE1NiA9IDEgfTsKKyAgZW51bSA6IGludDMyX3QgeyBBNTcgPSAxIH07CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVW5pbXBsZW1lbnRlZE1ldGhvZCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UZXN0T25ld2F5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0Qm9vbGVhbiA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRDaGFyID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEZsb2F0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0RG91YmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0U3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVFbnVtID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEludEVudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJvb2xlYW4gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUNoYXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUludCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlRmxvYXQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZURvdWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VCeXRlRW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSW50RW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldEludGVyZmFjZUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjk7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRJbnRlcmZhY2VMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVN0cmluZ0xpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQ7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGhyb3dTZXJ2aWNlRXhjZXB0aW9uID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50QXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzc7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ0OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBbklCaW5kZXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDY7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVGFrZXNBTnVsbGFibGVJQmluZGVyID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ3OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rha2VzQW5JQmluZGVyTGlzdCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0ODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VVdGY4Q3BwU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUyOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTM7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU0OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldENhbGxiYWNrID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU1OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NzsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTGlzdCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1ODsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSUJpbmRlckFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU5OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRPbGROYW1lSW50ZXJmYWNlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYxOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE5ld05hbWVJbnRlcmZhY2UgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjI7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0Q3BwSmF2YVRlc3RzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYzOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2dldEJhY2tlbmRUeXBlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY0OworCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiYgaW5zdGFuY2UpOworICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4qIGluc3RhbmNlKTsKKyAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4mIGltcGwpOworICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUZXN0U2VydmljZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVW5pbXBsZW1lbnRlZE1ldGhvZChpbnQzMl90IGluX2FyZywgaW50MzJfdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgRGVwcmVjYXRlZCgpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoInRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBpbiBzeXN0ZW0vdG9vbHMvYWlkbCB3aGljaCBkb2VzIGEgY29tcGlsZSBjaGVjayBvZiBkZXByZWNhdGVkIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyByZWZsZWN0ZWQgaW4gZ29sZGVucyIpKSkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRlc3RPbmV3YXkoKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qm9vbGVhbihib29sIGluX3Rva2VuLCBib29sKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlKGludDhfdCBpbl90b2tlbiwgaW50OF90KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRDaGFyKGNoYXIxNl90IGluX3Rva2VuLCBjaGFyMTZfdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50KGludDMyX3QgaW5fdG9rZW4sIGludDMyX3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdExvbmcoaW50NjRfdCBpbl90b2tlbiwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RmxvYXQoZmxvYXQgaW5fdG9rZW4sIGZsb2F0KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXREb3VibGUoZG91YmxlIGluX3Rva2VuLCBkb3VibGUqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fdG9rZW4sIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCeXRlRW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludEVudW0oOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TG9uZ0VudW0oOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQm9vbGVhbihjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGJvb2w+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGJvb2w+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQnl0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQ2hhcihjb25zdCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlSW50KGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VMb25nKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VGbG9hdChjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxmbG9hdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8ZmxvYXQ+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlRG91YmxlKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJ5dGVFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJbnRFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VMb25nRW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPdGhlclRlc3RTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4mIGluX3NlcnZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLCBib29sKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0SW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciYgaW5fcmVhZCwgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50MzJfdCBpbl9jb2RlKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9pbnB1dCkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRha2VzQW5JQmluZGVyTGlzdChjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0KSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4mIGluX2lucHV0KSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fdG9rZW4sIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX3Rva2VuLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCBpbl9yZXR1cm5fbnVsbCwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiBpbl9wYXJjZWwpID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlJiBpbl9lcCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSogb3V0X2VwMikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VMaXN0KGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QmIGluX2xpc3QsIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlJlY3Vyc2l2ZUxpc3QqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPj4qIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE9sZE5hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklPbGROYW1lPiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0TmV3TmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU+KiBfYWlkbF9yZXR1cm4pID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDcHBKYXZhVGVzdHMoOjpuZGs6OlNwQUlCaW5kZXIqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEJhY2tlbmRUeXBlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJhY2tlbmRUeXBlKiBfYWlkbF9yZXR1cm4pID0gMDsKK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiBkZWZhdWx0X2ltcGw7Cit9OworY2xhc3MgSVRlc3RTZXJ2aWNlRGVmYXVsdCA6IHB1YmxpYyBJVGVzdFNlcnZpY2UgeworcHVibGljOgorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgaW5fYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBEZXByZWNhdGVkKCkgb3ZlcnJpZGUgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGVzdE9uZXdheSgpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wgaW5fdG9rZW4sIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IGluX3Rva2VuLCBpbnQ4X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdENoYXIoY2hhcjE2X3QgaW5fdG9rZW4sIGNoYXIxNl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCBpbl90b2tlbiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90IGluX3Rva2VuLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCBpbl90b2tlbiwgZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdERvdWJsZShkb3VibGUgaW5fdG9rZW4sIGRvdWJsZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50RW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nRW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCb29sZWFuKGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VDaGFyKGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIxNl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJbnQoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmcoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGZsb2F0Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQnl0ZUVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludEVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgaW5fc2VydmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldEludGVyZmFjZUFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+PiYgaW5fc2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5fbmFtZXMsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+Pj4mIGluX3NlcnZpY2VzLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX25hbWVzLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5fbmFtZXMsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPj4+JiBpbl9zZXJ2aWNlcywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9uYW1lcywgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yJiBpbl9yZWFkLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRocm93U2VydmljZUV4Y2VwdGlvbihpbnQzMl90IGluX2NvZGUpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6RW1wdHk+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SVRlc3RTZXJ2aWNlOjpFbXB0eT4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OkVtcHR5Pj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FuSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTcEFJQmluZGVyPiYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiYgaW5faW5wdXQpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgaW5fdG9rZW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+Piogb3V0X3JlcGVhdGVkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRDYWxsYmFjayhib29sIGluX3JldHVybl9udWxsLCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGUqIGluX3BhcmNlbCkgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OmV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGUmIGluX2VwLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlKiBvdXRfZXAyKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxpc3QoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCYgaW5fbGlzdCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6UmVjdXJzaXZlTGlzdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUlCaW5kZXJBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6Om5kazo6U3BBSUJpbmRlcj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjpuZGs6OlNwQUlCaW5kZXI+PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENwcEphdmFUZXN0cyg6Om5kazo6U3BBSUJpbmRlciogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QmFja2VuZFR5cGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZW1vdGUoKSBvdmVycmlkZTsKK307Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaApzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaAppbmRleCBiNWY5YWM5Li43ZDI5ZmQ0IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oCkBAIC0xLDE1ICsxLDE2IEBACiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtMjAsNiArMjEsMTQgQEAKICAgQkFaID0gMjAwMSwKIH07CiAKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhJbnRFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgSW50RW51bTo6Rk9POgpAQCAtNDgsNCArNTcsNCBAQAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjY5ODIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5oCkBAIC0wLDAgKzEsMjc5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCisjaWZuZGVmIF9fQklPTklDX18KKyNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQorI2VuZGlmCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBMaXN0T2ZJbnRlcmZhY2VzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgY2xhc3MgSUVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgICBJRW1wdHlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5JRW1wdHlJbnRlcmZhY2UoKTsKKworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4mIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElFbXB0eUludGVyZmFjZT4qIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiYgaW1wbCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRW1wdHlJbnRlcmZhY2U+JiBnZXREZWZhdWx0SW1wbCgpOworICBwcml2YXRlOgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUVtcHR5SW50ZXJmYWNlPiBkZWZhdWx0X2ltcGw7CisgIH07CisgIGNsYXNzIElFbXB0eUludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSUVtcHR5SW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIDo6bmRrOjpTcEFJQmluZGVyIGFzQmluZGVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworICB9OworICBjbGFzcyBCcEVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBCcEVtcHR5SW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHZpcnR1YWwgfkJwRW1wdHlJbnRlcmZhY2UoKTsKKworICB9OworICBjbGFzcyBCbkVtcHR5SW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpCbkNJbnRlcmZhY2U8SUVtcHR5SW50ZXJmYWNlPiB7CisgIHB1YmxpYzoKKyAgICBCbkVtcHR5SW50ZXJmYWNlKCk7CisgICAgdmlydHVhbCB+Qm5FbXB0eUludGVyZmFjZSgpOworICBwcm90ZWN0ZWQ6CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7CisgIHByaXZhdGU6CisgIH07CisgIGNsYXNzIElNeUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6SUNJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisgICAgSU15SW50ZXJmYWNlKCk7CisgICAgdmlydHVhbCB+SU15SW50ZXJmYWNlKCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX21ldGhvZFdpdGhJbnRlcmZhY2VzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SU15SW50ZXJmYWNlPiogaW5zdGFuY2UpOworICAgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNeUludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBtZXRob2RXaXRoSW50ZXJmYWNlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5faWZhY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+JiBpbl9udWxsYWJsZV9pZmFjZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+JiBpbl9pZmFjZV9saXN0X2luLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4qIG91dF9pZmFjZV9saXN0X291dCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBpbl9pZmFjZV9saXN0X2lub3V0LCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4mIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Piogb3V0X251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIGluX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+PiogX2FpZGxfcmV0dXJuKSA9IDA7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJTXlJbnRlcmZhY2U+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSU15SW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJTXlJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX2lmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5fbnVsbGFibGVfaWZhY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfbGlzdF9pbiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBvdXRfaWZhY2VfbGlzdF9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaW5faWZhY2VfbGlzdF9pbm91dCwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwTXlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJTXlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwTXlJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBNeUludGVyZmFjZSgpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbWV0aG9kV2l0aEludGVyZmFjZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4mIGluX2lmYWNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiYgaW5fbnVsbGFibGVfaWZhY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiYgaW5faWZhY2VfbGlzdF9pbiwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+KiBvdXRfaWZhY2VfbGlzdF9vdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+PiogaW5faWZhY2VfbGlzdF9pbm91dCwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+JiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2luLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIG91dF9udWxsYWJsZV9pZmFjZV9saXN0X291dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4+KiBpbl9udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJuTXlJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTXlJbnRlcmZhY2U+IHsKKyAgcHVibGljOgorICAgIEJuTXlJbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIH5Cbk15SW50ZXJmYWNlKCk7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKKyAgY2xhc3MgTXlQYXJjZWxhYmxlIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBpZmFjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4gaWZhY2VfbGlzdDsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+Pj4gbnVsbGFibGVfaWZhY2VfbGlzdDsKKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSAhPSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA8IHN0ZDo6dGllKHJocy5pZmFjZSwgcmhzLm51bGxhYmxlX2lmYWNlLCByaHMuaWZhY2VfbGlzdCwgcmhzLm51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15UGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoaWZhY2UsIG51bGxhYmxlX2lmYWNlLCBpZmFjZV9saXN0LCBudWxsYWJsZV9pZmFjZV9saXN0KSA8PSBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfbGlzdCwgbnVsbGFibGVfaWZhY2VfbGlzdCkgPT0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9saXN0LCByaHMubnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfbGlzdCwgbnVsbGFibGVfaWZhY2VfbGlzdCkgPiBzdGQ6OnRpZShyaHMuaWZhY2UsIHJocy5udWxsYWJsZV9pZmFjZSwgcmhzLmlmYWNlX2xpc3QsIHJocy5udWxsYWJsZV9pZmFjZV9saXN0KTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeVBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGlmYWNlLCBudWxsYWJsZV9pZmFjZSwgaWZhY2VfbGlzdCwgbnVsbGFibGVfaWZhY2VfbGlzdCkgPj0gc3RkOjp0aWUocmhzLmlmYWNlLCByaHMubnVsbGFibGVfaWZhY2UsIHJocy5pZmFjZV9saXN0LCByaHMubnVsbGFibGVfaWZhY2VfbGlzdCk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgIk15UGFyY2VsYWJsZXsiOworICAgICAgb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGlmYWNlKTsKKyAgICAgIG9zIDw8ICIsIG51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2lmYWNlKTsKKyAgICAgIG9zIDw8ICIsIGlmYWNlX2xpc3Q6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaWZhY2VfbGlzdCk7CisgICAgICBvcyA8PCAiLCBudWxsYWJsZV9pZmFjZV9saXN0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bGxhYmxlX2lmYWNlX2xpc3QpOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsKKyAgY2xhc3MgTXlVbmlvbiB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgZW51bSBUYWcgOiBpbnQzMl90IHsKKyAgICAgIGlmYWNlID0gMCwgIC8vIGFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSBpZmFjZTsKKyAgICAgIG51bGxhYmxlX2lmYWNlLCAgLy8gYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlIG51bGxhYmxlX2lmYWNlOworICAgICAgaWZhY2VfbGlzdCwgIC8vIExpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBpZmFjZV9saXN0OworICAgICAgbnVsbGFibGVfaWZhY2VfbGlzdCwgIC8vIExpc3Q8YW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSUVtcHR5SW50ZXJmYWNlPiBudWxsYWJsZV9pZmFjZV9saXN0OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9ub3Rfc2VsZiA9ICFzdGQ6OmlzX3NhbWVfdjxzdGQ6OnJlbW92ZV9jdl90PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PF9UcD4+LCBNeVVuaW9uPjsKKworICAgIE15VW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PGlmYWNlPiwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4oKSkgeyB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgorICAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKKyAgICBjb25zdGV4cHIgTXlVbmlvbihfVHAmJiBfYXJnKQorICAgICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KKworICAgIHRlbXBsYXRlIDxzaXplX3QgX05wLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgY29uc3RleHByIGV4cGxpY2l0IE15VW5pb24oc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQorICAgICAgICA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PF9OcD4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLikge30KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICAgIHN0YXRpYyBNeVVuaW9uIG1ha2UoX1RwJiYuLi4gX2FyZ3MpIHsKKyAgICAgIHJldHVybiBNeVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9VcD4KKyAgICBzdGF0aWMgTXlVbmlvbiBtYWtlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9pbCwgX1VwJiYuLi4gX2FyZ3MpIHsKKyAgICAgIHJldHVybiBNeVVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOworICAgIH0KKworICAgIFRhZyBnZXRUYWcoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnPihfdmFsdWUuaW5kZXgoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPFRhZyBfdGFnPgorICAgIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKKyAgICAgIGlmIChnZXRUYWcoKSAhPSBfdGFnKSB7IF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJiYWQgYWNjZXNzOiBhIHdyb25nIHRhZyIpOyB9CisgICAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8VGFnIF90YWc+CisgICAgYXV0byYgZ2V0KCkgeworICAgICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KKyAgICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgorICAgIHZvaWQgc2V0KF9UcCYmLi4uIF9hcmdzKSB7CisgICAgICBfdmFsdWUuZW1wbGFjZTxfdGFnPihzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pOworICAgIH0KKworICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKTsKKyAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBfcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlICE9IHJocy5fdmFsdWU7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15VW5pb24mIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIF92YWx1ZSA9PSByaHMuX3ZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTXlVbmlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNeVVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiTXlVbmlvbnsiOworICAgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgICAgY2FzZSBpZmFjZTogb3MgPDwgImlmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxpZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZTogb3MgPDwgIm51bGxhYmxlX2lmYWNlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxudWxsYWJsZV9pZmFjZT4oKSk7IGJyZWFrOworICAgICAgY2FzZSBpZmFjZV9saXN0OiBvcyA8PCAiaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8aWZhY2VfbGlzdD4oKSk7IGJyZWFrOworICAgICAgY2FzZSBudWxsYWJsZV9pZmFjZV9saXN0OiBvcyA8PCAibnVsbGFibGVfaWZhY2VfbGlzdDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhnZXQ8bnVsbGFibGVfaWZhY2VfbGlzdD4oKSk7IGJyZWFrOworICAgICAgfQorICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZhcmlhbnQ8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4sIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMaXN0T2ZJbnRlcmZhY2VzOjpJRW1wdHlJbnRlcmZhY2U+LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TGlzdE9mSW50ZXJmYWNlczo6SUVtcHR5SW50ZXJmYWNlPj4sIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Okxpc3RPZkludGVyZmFjZXM6OklFbXB0eUludGVyZmFjZT4+Pj4gX3ZhbHVlOworICB9OworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IExpc3RPZkludGVyZmFjZXMmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTGlzdE9mSW50ZXJmYWNlcyYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBMaXN0T2ZJbnRlcmZhY2VzJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTGlzdE9mSW50ZXJmYWNlc3siOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmgKaW5kZXggNTA4MWM4OS4uOTdlYzNhMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oCkBAIC0xLDE1ICsxLDE2IEBACiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpAQCAtMjAsNiArMjEsMTQgQEAKICAgQkFaID0gMjAwMDAwMDAwMDAxTCwKIH07CiAKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhMb25nRW51bSB2YWwpIHsKICAgc3dpdGNoKHZhbCkgewogICBjYXNlIExvbmdFbnVtOjpGT086CkBAIC00OCw0ICs1Nyw0IEBACiB9OwogI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIG5kawpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaAppbmRleCBlZjc1ZDcxLi45MDRkMjY5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKQEAgLTEsMTUgKzEsMTcgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKwogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKaW5kZXggYzc0MDAxZC4uMjlkZTc5ZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgKQEAgLTEsMjAgKzEsMjIgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKwogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+Ci0jZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiZDEzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaApAQCAtMCwwICsxLDYzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CitjbGFzcyBSZWN1cnNpdmVMaXN0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgaW50MzJfdCB2YWx1ZSA9IDA7CisgIHN0ZDo6dW5pcXVlX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpSZWN1cnNpdmVMaXN0PiBuZXh0OworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVjdXJzaXZlTGlzdCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlLCBuZXh0KSAhPSBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVjdXJzaXZlTGlzdCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlLCBuZXh0KSA8IHN0ZDo6dGllKHJocy52YWx1ZSwgcmhzLm5leHQpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmVjdXJzaXZlTGlzdCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHZhbHVlLCBuZXh0KSA8PSBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPT0gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPiBzdGQ6OnRpZShyaHMudmFsdWUsIHJocy5uZXh0KTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFJlY3Vyc2l2ZUxpc3QmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSh2YWx1ZSwgbmV4dCkgPj0gc3RkOjp0aWUocmhzLnZhbHVlLCByaHMubmV4dCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiUmVjdXJzaXZlTGlzdHsiOworICAgIG9zIDw8ICJ2YWx1ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyh2YWx1ZSk7CisgICAgb3MgPDwgIiwgbmV4dDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhuZXh0KTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWM3ZDViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaApAQCAtMCwwICsxLDIxMyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworY2xhc3MgU3RydWN0dXJlZFBhcmNlbGFibGUgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBjbGFzcyBFbXB0eSB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBFbXB0eSYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRW1wdHkmKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJFbXB0eXsiOworICAgICAgb3MgPDwgIn0iOworICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KKyAgfTsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc2hvdWxkQ29udGFpblRocmVlRnM7CisgIGludDMyX3QgZiA9IDA7CisgIHN0ZDo6c3RyaW5nIHNob3VsZEJlSmVycnk7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIHNob3VsZEJlQnl0ZUJhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtKDApOworICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIHNob3VsZEJlSW50QmFyID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0gc2hvdWxkQmVMb25nQmFyID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0oMCk7CisgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiBzaG91bGRDb250YWluVHdvQnl0ZUZvb3M7CisgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+IHNob3VsZENvbnRhaW5Ud29JbnRGb29zOworICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4gc2hvdWxkQ29udGFpblR3b0xvbmdGb29zOworICBzdGQ6OnN0cmluZyBzdHJpbmdEZWZhdWx0c1RvRm9vID0gImZvbyI7CisgIGludDhfdCBieXRlRGVmYXVsdHNUb0ZvdXIgPSA0OworICBpbnQzMl90IGludERlZmF1bHRzVG9GaXZlID0gNTsKKyAgaW50NjRfdCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4gPSAtN0w7CisgIGJvb2wgYm9vbGVhbkRlZmF1bHRzVG9UcnVlID0gdHJ1ZTsKKyAgY2hhcjE2X3QgY2hhckRlZmF1bHRzVG9DID0gJ0MnOworICBmbG9hdCBmbG9hdERlZmF1bHRzVG9QaSA9IDMuMTQwMDAwZjsKKyAgZG91YmxlIGRvdWJsZVdpdGhEZWZhdWx0ID0gLTMxNDAwMDAwMDAwMDAwMDAwMC4wMDAwMDA7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUbzEyMyA9IHsxLCAyLCAzfTsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gYXJyYXlEZWZhdWx0c1RvRW1wdHkgPSB7fTsKKyAgYm9vbCBib29sRGVmYXVsdCA9IGZhbHNlOworICBpbnQ4X3QgYnl0ZURlZmF1bHQgPSAwOworICBpbnQzMl90IGludERlZmF1bHQgPSAwOworICBpbnQ2NF90IGxvbmdEZWZhdWx0ID0gMEw7CisgIGZsb2F0IGZsb2F0RGVmYXVsdCA9IDAuMDAwMDAwZjsKKyAgZG91YmxlIGRvdWJsZURlZmF1bHQgPSAwLjAwMDAwMDsKKyAgZG91YmxlIGNoZWNrRG91YmxlRnJvbUZsb2F0ID0gMy4xNDAwMDA7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjaGVja1N0cmluZ0FycmF5MSA9IHsiYSIsICJiIn07CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjaGVja1N0cmluZ0FycmF5MiA9IHsiYSIsICJiIn07CisgIGludDMyX3QgaW50MzJfbWluID0gLTIxNDc0ODM2NDg7CisgIGludDMyX3QgaW50MzJfbWF4ID0gMjE0NzQ4MzY0NzsKKyAgaW50NjRfdCBpbnQ2NF9tYXggPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TDsKKyAgaW50MzJfdCBoZXhJbnQzMl9uZWdfMSA9IC0xOworICA6Om5kazo6U3BBSUJpbmRlciBpYmluZGVyOworICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6RW1wdHkgZW1wdHk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGludDhfMSA9IHsxLCAxLCAxLCAxLCAxfTsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50MzJfMSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaW50NjRfMSA9IHsxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTH07CisgIGludDMyX3QgaGV4SW50MzJfcG9zXzEgPSAxOworICBpbnQzMl90IGhleEludDY0X3Bvc18xID0gMTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18yID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18zID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc180ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc181ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc182ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc183ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc184ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc185ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xMCA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7CisgIHN0ZDo6c3RyaW5nIGFkZFN0cmluZzEgPSAiaGVsbG8gd29ybGQhIjsKKyAgc3RkOjpzdHJpbmcgYWRkU3RyaW5nMiA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiI7CisgIGludDMyX3Qgc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSAwOworICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiB1OworICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiBzaG91bGRCZUNvbnN0UzE7CisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gZGVmYXVsdFdpdGhGb28gPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT087CisKKyAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgIT0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5lbXB0eSwgcmhzLmludDhfMSwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA8IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pIDw9IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgZW1wdHksIGludDhfMSwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID09IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuZW1wdHksIHJocy5pbnQ4XzEsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBlbXB0eSwgaW50OF8xLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPiBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc2hvdWxkQ29udGFpblRocmVlRnMsIGYsIHNob3VsZEJlSmVycnksIHNob3VsZEJlQnl0ZUJhciwgc2hvdWxkQmVJbnRCYXIsIHNob3VsZEJlTG9uZ0Jhciwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCBzaG91bGRDb250YWluVHdvSW50Rm9vcywgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCBzdHJpbmdEZWZhdWx0c1RvRm9vLCBieXRlRGVmYXVsdHNUb0ZvdXIsIGludERlZmF1bHRzVG9GaXZlLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgY2hhckRlZmF1bHRzVG9DLCBmbG9hdERlZmF1bHRzVG9QaSwgZG91YmxlV2l0aERlZmF1bHQsIGFycmF5RGVmYXVsdHNUbzEyMywgYXJyYXlEZWZhdWx0c1RvRW1wdHksIGJvb2xEZWZhdWx0LCBieXRlRGVmYXVsdCwgaW50RGVmYXVsdCwgbG9uZ0RlZmF1bHQsIGZsb2F0RGVmYXVsdCwgZG91YmxlRGVmYXVsdCwgY2hlY2tEb3VibGVGcm9tRmxvYXQsIGNoZWNrU3RyaW5nQXJyYXkxLCBjaGVja1N0cmluZ0FycmF5MiwgaW50MzJfbWluLCBpbnQzMl9tYXgsIGludDY0X21heCwgaGV4SW50MzJfbmVnXzEsIGliaW5kZXIsIGVtcHR5LCBpbnQ4XzEsIGludDMyXzEsIGludDY0XzEsIGhleEludDMyX3Bvc18xLCBoZXhJbnQ2NF9wb3NfMSwgY29uc3RfZXhwcnNfMSwgY29uc3RfZXhwcnNfMiwgY29uc3RfZXhwcnNfMywgY29uc3RfZXhwcnNfNCwgY29uc3RfZXhwcnNfNSwgY29uc3RfZXhwcnNfNiwgY29uc3RfZXhwcnNfNywgY29uc3RfZXhwcnNfOCwgY29uc3RfZXhwcnNfOSwgY29uc3RfZXhwcnNfMTAsIGFkZFN0cmluZzEsIGFkZFN0cmluZzIsIHNob3VsZFNldEJpdDBBbmRCaXQyLCB1LCBzaG91bGRCZUNvbnN0UzEsIGRlZmF1bHRXaXRoRm9vKSA+PSBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmVtcHR5LCByaHMuaW50OF8xLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICBlbnVtIDogaW50MzJfdCB7IEJJVDAgPSAxIH07CisgIGVudW0gOiBpbnQzMl90IHsgQklUMSA9IDIgfTsKKyAgZW51bSA6IGludDMyX3QgeyBCSVQyID0gNCB9OworICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJTdHJ1Y3R1cmVkUGFyY2VsYWJsZXsiOworICAgIG9zIDw8ICJzaG91bGRDb250YWluVGhyZWVGczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVGhyZWVGcyk7CisgICAgb3MgPDwgIiwgZjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmKTsKKyAgICBvcyA8PCAiLCBzaG91bGRCZUplcnJ5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlSmVycnkpOworICAgIG9zIDw8ICIsIHNob3VsZEJlQnl0ZUJhcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRCZUJ5dGVCYXIpOworICAgIG9zIDw8ICIsIHNob3VsZEJlSW50QmFyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlSW50QmFyKTsKKyAgICBvcyA8PCAiLCBzaG91bGRCZUxvbmdCYXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQmVMb25nQmFyKTsKKyAgICBvcyA8PCAiLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3M6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQ29udGFpblR3b0J5dGVGb29zKTsKKyAgICBvcyA8PCAiLCBzaG91bGRDb250YWluVHdvSW50Rm9vczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVHdvSW50Rm9vcyk7CisgICAgb3MgPDwgIiwgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyk7CisgICAgb3MgPDwgIiwgc3RyaW5nRGVmYXVsdHNUb0ZvbzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdEZWZhdWx0c1RvRm9vKTsKKyAgICBvcyA8PCAiLCBieXRlRGVmYXVsdHNUb0ZvdXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZURlZmF1bHRzVG9Gb3VyKTsKKyAgICBvcyA8PCAiLCBpbnREZWZhdWx0c1RvRml2ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnREZWZhdWx0c1RvRml2ZSk7CisgICAgb3MgPDwgIiwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7CisgICAgb3MgPDwgIiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7CisgICAgb3MgPDwgIiwgY2hhckRlZmF1bHRzVG9DOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJEZWZhdWx0c1RvQyk7CisgICAgb3MgPDwgIiwgZmxvYXREZWZhdWx0c1RvUGk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXREZWZhdWx0c1RvUGkpOworICAgIG9zIDw8ICIsIGRvdWJsZVdpdGhEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZVdpdGhEZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBhcnJheURlZmF1bHRzVG8xMjM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYXJyYXlEZWZhdWx0c1RvMTIzKTsKKyAgICBvcyA8PCAiLCBhcnJheURlZmF1bHRzVG9FbXB0eTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhcnJheURlZmF1bHRzVG9FbXB0eSk7CisgICAgb3MgPDwgIiwgYm9vbERlZmF1bHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbERlZmF1bHQpOworICAgIG9zIDw8ICIsIGJ5dGVEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVEZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBpbnREZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludERlZmF1bHQpOworICAgIG9zIDw8ICIsIGxvbmdEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdEZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBmbG9hdERlZmF1bHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXREZWZhdWx0KTsKKyAgICBvcyA8PCAiLCBkb3VibGVEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZURlZmF1bHQpOworICAgIG9zIDw8ICIsIGNoZWNrRG91YmxlRnJvbUZsb2F0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoZWNrRG91YmxlRnJvbUZsb2F0KTsKKyAgICBvcyA8PCAiLCBjaGVja1N0cmluZ0FycmF5MTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGVja1N0cmluZ0FycmF5MSk7CisgICAgb3MgPDwgIiwgY2hlY2tTdHJpbmdBcnJheTI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hlY2tTdHJpbmdBcnJheTIpOworICAgIG9zIDw8ICIsIGludDMyX21pbjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl9taW4pOworICAgIG9zIDw8ICIsIGludDMyX21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl9tYXgpOworICAgIG9zIDw8ICIsIGludDY0X21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQ2NF9tYXgpOworICAgIG9zIDw8ICIsIGhleEludDMyX25lZ18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDMyX25lZ18xKTsKKyAgICBvcyA8PCAiLCBpYmluZGVyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGliaW5kZXIpOworICAgIG9zIDw8ICIsIGVtcHR5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGVtcHR5KTsKKyAgICBvcyA8PCAiLCBpbnQ4XzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50OF8xKTsKKyAgICBvcyA8PCAiLCBpbnQzMl8xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludDMyXzEpOworICAgIG9zIDw8ICIsIGludDY0XzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50NjRfMSk7CisgICAgb3MgPDwgIiwgaGV4SW50MzJfcG9zXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaGV4SW50MzJfcG9zXzEpOworICAgIG9zIDw8ICIsIGhleEludDY0X3Bvc18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDY0X3Bvc18xKTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzEpOworICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfMik7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfMzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc18zKTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc180OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzQpOworICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfNSk7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfNjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc182KTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc183OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzcpOworICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzg6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfOCk7CisgICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfOTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc185KTsKKyAgICBvcyA8PCAiLCBjb25zdF9leHByc18xMDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc18xMCk7CisgICAgb3MgPDwgIiwgYWRkU3RyaW5nMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhZGRTdHJpbmcxKTsKKyAgICBvcyA8PCAiLCBhZGRTdHJpbmcyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGFkZFN0cmluZzIpOworICAgIG9zIDw8ICIsIHNob3VsZFNldEJpdDBBbmRCaXQyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZFNldEJpdDBBbmRCaXQyKTsKKyAgICBvcyA8PCAiLCB1OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHUpOworICAgIG9zIDw8ICIsIHNob3VsZEJlQ29uc3RTMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRCZUNvbnN0UzEpOworICAgIG9zIDw8ICIsIGRlZmF1bHRXaXRoRm9vOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRlZmF1bHRXaXRoRm9vKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5oCmluZGV4IGI5MGY2YzQuLjdiNmM3ZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaApAQCAtMSwyMSArMSwyMSBAQAogI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogCiAjaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmg+CiAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CiAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0J5dGVFbnVtLmg+CiAKICNpZm5kZWYgX19CSU9OSUNfXwogI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCkBAIC00NCwxMCArNDQsNiBAQAogICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIFVuaW9uPjsKIAogICBVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8bnM+LCBzdGQ6OnZlY3RvcjxpbnQzMl90Pih7fSkpIHsgfQotICBVbmlvbihjb25zdCBVbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb24oVW5pb24mJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KFVuaW9uJiYpID0gZGVmYXVsdDsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuaApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5oCmluZGV4IDdkMDQ1ZWMuLmUxOTI5YmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uV2l0aEZkLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQuaApAQCAtMSwxNyArMSwxNyBAQAogI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogCiAjaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKQEAgLTM4LDEwICszOCw2IEBACiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb25XaXRoRmQ+OwogCiAgIFVuaW9uV2l0aEZkKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxudW0+LCBpbnQzMl90KDApKSB7IH0KLSAgVW5pb25XaXRoRmQoY29uc3QgVW5pb25XaXRoRmQmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uV2l0aEZkKFVuaW9uV2l0aEZkJiYpID0gZGVmYXVsdDsKLSAgVW5pb25XaXRoRmQmIG9wZXJhdG9yPShjb25zdCBVbmlvbldpdGhGZCYpID0gZGVmYXVsdDsKLSAgVW5pb25XaXRoRmQmIG9wZXJhdG9yPShVbmlvbldpdGhGZCYmKSA9IGRlZmF1bHQ7CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PF9ub3Rfc2VsZjxfVHA+Pj4KICAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWV4cGxpY2l0LWNvbnN0cnVjdG9yKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQm5EZXByZWNhdGVkUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JuRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuRGVwcmVjYXRlZFBhcmNlbGFibGUuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CbkV4dGVuZGFibGVQYXJjZWxhYmxlLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0Mi5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQm5NeUV4dExpa2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9Cbk15RXh0TGlrZS5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcERlcHJlY2F0ZWRQYXJjZWxhYmxlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vQnBFeHRlbmRhYmxlUGFyY2VsYWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBEZXByZWNhdGVkUGFyY2VsYWJsZS5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwRXh0ZW5kYWJsZVBhcmNlbGFibGUuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0LmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0Mi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHQyLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9CcE15RXh0TGlrZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbi5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0JwTXlFeHRMaWtlLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmZTM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5oCkBAIC0wLDAgKzEsNzAgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7CitjbGFzcyBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgIGludDMyX3QgYSA9IDA7CisgIHN0ZDo6c3RyaW5nIGI7CisgIDo6bmRrOjpBUGFyY2VsYWJsZUhvbGRlciBleHR7OjpuZGs6OlNUQUJJTElUWV9MT0NBTH07CisgIGludDY0X3QgYyA9IDBMOworICA6Om5kazo6QVBhcmNlbGFibGVIb2xkZXIgZXh0Mns6Om5kazo6U1RBQklMSVRZX0xPQ0FMfTsKKworICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSAhPSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA8IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmV4dCwgcmhzLmMsIHJocy5leHQyKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEV4dGVuZGFibGVQYXJjZWxhYmxlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgZXh0LCBjLCBleHQyKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHRlbmRhYmxlUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGV4dCwgYywgZXh0MikgPT0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuZXh0LCByaHMuYywgcmhzLmV4dDIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBFeHRlbmRhYmxlUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGV4dCwgYywgZXh0MikgPiBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5leHQsIHJocy5jLCByaHMuZXh0Mik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBFeHRlbmRhYmxlUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGV4dCwgYywgZXh0MikgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuZXh0LCByaHMuYywgcmhzLmV4dDIpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIkV4dGVuZGFibGVQYXJjZWxhYmxleyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAiLCBleHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZXh0KTsKKyAgICBvcyA8PCAiLCBjOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGMpOworICAgIG9zIDw8ICIsIGV4dDI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZXh0Mik7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBleHRlbnNpb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQzOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LmgKQEAgLTAsMCArMSw2NCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgZXh0ZW5zaW9uIHsKK2NsYXNzIE15RXh0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgaW50MzJfdCBhID0gMDsKKyAgc3RkOjpzdHJpbmcgYjsKKworICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgIT0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA8IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpIDw9IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNeUV4dCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID09IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15RXh0JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPiBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlFeHQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiKSA+PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7CisgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgIk15RXh0eyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMWI1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuaApAQCAtMCwwICsxLDY3IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBleHRlbnNpb24geworY2xhc3MgTXlFeHQyIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgaW50MzJfdCBhID0gMDsKKyAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ZXh0ZW5zaW9uOjpNeUV4dCBiOworICBzdGQ6OnN0cmluZyBjOworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgIT0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpIDwgc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSA8PSBzdGQ6OnRpZShyaHMuYSwgcmhzLmIsIHJocy5jKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15RXh0MiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIsIGMpID09IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBNeUV4dDImIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShhLCBiLCBjKSA+IHN0ZDo6dGllKHJocy5hLCByaHMuYiwgcmhzLmMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTXlFeHQyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYiwgYykgPj0gc3RkOjp0aWUocmhzLmEsIHJocy5iLCByaHMuYyk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTXlFeHQyeyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAiLCBjOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGMpOworICAgIG9zIDw8ICJ9IjsKKyAgICByZXR1cm4gb3Muc3RyKCk7CisgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg3ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5oCkBAIC0wLDAgKzEsNjQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIGV4dGVuc2lvbiB7CitjbGFzcyBNeUV4dExpa2UgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBpbnQzMl90IGEgPSAwOworICBzdGQ6OnN0cmluZyBiOworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgIT0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPCBzdGQ6OnRpZShyaHMuYSwgcmhzLmIpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTXlFeHRMaWtlJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoYSwgYikgPD0gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE15RXh0TGlrZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID09IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE15RXh0TGlrZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID4gc3RkOjp0aWUocmhzLmEsIHJocy5iKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE15RXh0TGlrZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGEsIGIpID49IHN0ZDo6dGllKHJocy5hLCByaHMuYik7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiTXlFeHRMaWtleyI7CisgICAgb3MgPDwgImE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYSk7CisgICAgb3MgPDwgIiwgYjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhiKTsKKyAgICBvcyA8PCAifSI7CisgICAgcmV0dXJuIG9zLnN0cigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uV2l0aEZkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5EZWVwbHlOZXN0ZWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CbkRlZXBseU5lc3RlZC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5OZXN0ZWRTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5OZXN0ZWRTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlYzMzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9Cbk5lc3RlZFNlcnZpY2UuaApAQCAtMCwwICsxLDI0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBCbk5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJTmVzdGVkU2VydmljZT4geworcHVibGljOgorICBCbk5lc3RlZFNlcnZpY2UoKTsKKyAgdmlydHVhbCB+Qm5OZXN0ZWRTZXJ2aWNlKCk7Citwcm90ZWN0ZWQ6CisgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworcHJpdmF0ZToKK307Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JuVW5pb25XaXRoRmQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CblBhcmNlbGFibGVXaXRoTmVzdGVkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CblVuaW9uV2l0aEZkLmgKY29weSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQm5QYXJjZWxhYmxlV2l0aE5lc3RlZC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uV2l0aEZkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBEZWVwbHlOZXN0ZWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JwVW5pb25XaXRoRmQuaApjb3B5IHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcERlZXBseU5lc3RlZC5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBOZXN0ZWRTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBOZXN0ZWRTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhYzQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9CcE5lc3RlZFNlcnZpY2UuaApAQCAtMCwwICsxLDI0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBCcE5lc3RlZFNlcnZpY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJTmVzdGVkU2VydmljZT4geworcHVibGljOgorICBleHBsaWNpdCBCcE5lc3RlZFNlcnZpY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgIHZpcnR1YWwgfkJwTmVzdGVkU2VydmljZSgpOworCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsaXBTdGF0dXMoY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCYgaW5fcCwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpJTmVzdGVkU2VydmljZTo6UmVzdWx0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBpbl9zdGF0dXMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s+JiBpbl9jYikgb3ZlcnJpZGU7Cit9OworfSAgLy8gbmFtZXNwYWNlIG5lc3RlZAorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9CcFVuaW9uV2l0aEZkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvQnBQYXJjZWxhYmxlV2l0aE5lc3RlZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnBVbmlvbldpdGhGZC5oCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0JwUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTY3NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmgKQEAgLTAsMCArMSwyNDIgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmg+CisjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+CisjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIG5lc3RlZCB7CitjbGFzcyBEZWVwbHlOZXN0ZWQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICBjbGFzcyBCIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICBjbGFzcyBDIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICAgIGNsYXNzIEQgeworICAgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKworICAgICAgICBlbnVtIGNsYXNzIEUgOiBpbnQ4X3QgeworICAgICAgICAgIE9LID0gMCwKKyAgICAgICAgfTsKKworCisgICAgICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgICAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEQmKSBjb25zdCB7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRCYpIGNvbnN0IHsKKyAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEJikgY29uc3QgeworICAgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICAgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgICBvcyA8PCAiRHsiOworICAgICAgICAgIG9zIDw8ICJ9IjsKKyAgICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICAgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSAhPSBzdGQ6OnRpZSgpOworICAgICAgfQorICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDwgc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQyYpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPT0gc3RkOjp0aWUoKTsKKyAgICAgIH0KKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBDJikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+IHN0ZDo6dGllKCk7CisgICAgICB9CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMmKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICJDeyI7CisgICAgICAgIG9zIDw8ICJ9IjsKKyAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgICAgfQorICAgIH07CisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgIT0gc3RkOjp0aWUoKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpIDw9IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQiYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSgpID09IHN0ZDo6dGllKCk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBCJikgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEImKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoKSA+PSBzdGQ6OnRpZSgpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJCeyI7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OworICBjbGFzcyBBIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RSBlID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpEZWVwbHlOZXN0ZWQ6OkI6OkM6OkQ6OkU6Ok9LOworCisgICAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7CisgICAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgIT0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPCBzdGQ6OnRpZShyaHMuZSk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQSYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoZSkgPD0gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEEmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGUpID09IHN0ZDo6dGllKHJocy5lKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEEmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGUpID4gc3RkOjp0aWUocmhzLmUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEEmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKGUpID49IHN0ZDo6dGllKHJocy5lKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAiQXsiOworICAgICAgb3MgPDwgImU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZSk7CisgICAgICBvcyA8PCAifSI7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorICB9OworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpICE9IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA8IHN0ZDo6dGllKCk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPD0gc3RkOjp0aWUoKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlZXBseU5lc3RlZCYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoKSA9PSBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBEZWVwbHlOZXN0ZWQmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKCkgPiBzdGQ6OnRpZSgpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRGVlcGx5TmVzdGVkJikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZSgpID49IHN0ZDo6dGllKCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiRGVlcGx5TmVzdGVkeyI7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKERlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RSB2YWwpIHsKKyAgc3dpdGNoKHZhbCkgeworICBjYXNlIERlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RTo6T0s6CisgICAgcmV0dXJuICJPSyI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CisgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIG5kayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzE3LWV4dGVuc2lvbnMiCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGlubGluZSBzdGQ6OmFycmF5PGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OkRlZXBseU5lc3RlZDo6Qjo6Qzo6RDo6RSwgMT4gZW51bV92YWx1ZXM8YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6RGVlcGx5TmVzdGVkOjpCOjpDOjpEOjpFOjpPSywKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1MjZkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5oCkBAIC0wLDAgKzEsMTI5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIElOZXN0ZWRTZXJ2aWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICBJTmVzdGVkU2VydmljZSgpOworICB2aXJ0dWFsIH5JTmVzdGVkU2VydmljZSgpOworCisgIGNsYXNzIFJlc3VsdCB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworCisgICAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIHN0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0s7CisKKyAgICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKKyAgICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgIT0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPCBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSZXN1bHQmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPD0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID09IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID4gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgUmVzdWx0JiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID49IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOworICAgIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJSZXN1bHR7IjsKKyAgICAgIG9zIDw8ICJzdGF0dXM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc3RhdHVzKTsKKyAgICAgIG9zIDw8ICJ9IjsKKyAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9CisgIH07CisgIGNsYXNzIElDYWxsYmFjayA6IHB1YmxpYyA6Om5kazo6SUNJbnRlcmZhY2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisgICAgSUNhbGxiYWNrKCk7CisgICAgdmlydHVhbCB+SUNhbGxiYWNrKCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2RvbmUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUNhbGxiYWNrPiBmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+JiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwsIHN0ZDo6c2hhcmVkX3B0cjxJQ2FsbGJhY2s+KiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElDYWxsYmFjaz4mIGltcGwpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUNhbGxiYWNrPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRvbmUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cykgPSAwOworICBwcml2YXRlOgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUNhbGxiYWNrPiBkZWZhdWx0X2ltcGw7CisgIH07CisgIGNsYXNzIElDYWxsYmFja0RlZmF1bHQgOiBwdWJsaWMgSUNhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRvbmUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwQ2FsbGJhY2sgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJQ2FsbGJhY2s+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwQ2FsbGJhY2soY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBDYWxsYmFjaygpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZG9uZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgaW5fc3RhdHVzKSBvdmVycmlkZTsKKyAgfTsKKyAgY2xhc3MgQm5DYWxsYmFjayA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElDYWxsYmFjaz4geworICBwdWJsaWM6CisgICAgQm5DYWxsYmFjaygpOworICAgIHZpcnR1YWwgfkJuQ2FsbGJhY2soKTsKKyAgcHJvdGVjdGVkOgorICAgIDo6bmRrOjpTcEFJQmluZGVyIGNyZWF0ZUJpbmRlcigpIG92ZXJyaWRlOworICBwcml2YXRlOgorICB9OworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX2ZsaXBTdGF0dXMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9mbGlwU3RhdHVzV2l0aENhbGxiYWNrID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZT4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiYgaW5zdGFuY2UpOworICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiogaW5zdGFuY2UpOworICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SU5lc3RlZFNlcnZpY2U+JiBpbXBsKTsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTmVzdGVkU2VydmljZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmxpcFN0YXR1cyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiBpbl9wLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIF9haWRsX3JldHVybikgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGluX2NiKSA9IDA7Citwcml2YXRlOgorICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElOZXN0ZWRTZXJ2aWNlPiBkZWZhdWx0X2ltcGw7Cit9OworY2xhc3MgSU5lc3RlZFNlcnZpY2VEZWZhdWx0IDogcHVibGljIElOZXN0ZWRTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmxpcFN0YXR1cyhjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkJiBpbl9wLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OklOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzIGluX3N0YXR1cywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6SU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjaz4mIGluX2NiKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOworfTsKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGNlZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmgKQEAgLTAsMCArMSwxMDIgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgbmVzdGVkIHsKK2NsYXNzIFBhcmNlbGFibGVXaXRoTmVzdGVkIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUgZml4ZWRfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisKKyAgZW51bSBjbGFzcyBTdGF0dXMgOiBpbnQ4X3QgeworICAgIE9LID0gMCwKKyAgICBOT1RfT0sgPSAxLAorICB9OworCisgIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1cyBzdGF0dXMgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok9LOworCisgIGJpbmRlcl9zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpOworICBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpICE9IHN0ZDo6dGllKHJocy5zdGF0dXMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPCBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA8PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmNlbGFibGVXaXRoTmVzdGVkJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoc3RhdHVzKSA9PSBzdGQ6OnRpZShyaHMuc3RhdHVzKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUGFyY2VsYWJsZVdpdGhOZXN0ZWQmIHJocykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShzdGF0dXMpID4gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKHN0YXR1cykgPj0gc3RkOjp0aWUocmhzLnN0YXR1cyk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKKyAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAiUGFyY2VsYWJsZVdpdGhOZXN0ZWR7IjsKKyAgICBvcyA8PCAic3RhdHVzOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHN0YXR1cyk7CisgICAgb3MgPDwgIn0iOworICAgIHJldHVybiBvcy5zdHIoKTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBuZXN0ZWQKK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBuZXN0ZWQgeworW1tub2Rpc2NhcmRdXSBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXMgdmFsKSB7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpPSzoKKyAgICByZXR1cm4gIk9LIjsKKyAgY2FzZSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpOT1RfT0s6CisgICAgcmV0dXJuICJOT1RfT0siOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbCkpOworICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgbmVzdGVkCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK25hbWVzcGFjZSBuZGsgeworbmFtZXNwYWNlIGludGVybmFsIHsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBpbmxpbmUgc3RkOjphcnJheTxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzLCAyPiBlbnVtX3ZhbHVlczxhaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzPiA9IHsKKyAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6UGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6T0ssCisgIGFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OlBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6Ok5PVF9PSywKK307CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQm5Qcm90ZWN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQm5Qcm90ZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTBjNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CitjbGFzcyBCblByb3RlY3RlZCA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElQcm90ZWN0ZWQ+IHsKK3B1YmxpYzoKKyAgQm5Qcm90ZWN0ZWQoKTsKKyAgdmlydHVhbCB+Qm5Qcm90ZWN0ZWQoKTsKK3Byb3RlY3RlZDoKKyAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7Citwcml2YXRlOgorfTsKK30gIC8vIG5hbWVzcGFjZSBwZXJtaXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQm5Qcm90ZWN0ZWRJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQm5Qcm90ZWN0ZWRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJhNDZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CblByb3RlY3RlZEludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjQgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CitjbGFzcyBCblByb3RlY3RlZEludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElQcm90ZWN0ZWRJbnRlcmZhY2U+IHsKK3B1YmxpYzoKKyAgQm5Qcm90ZWN0ZWRJbnRlcmZhY2UoKTsKKyAgdmlydHVhbCB+Qm5Qcm90ZWN0ZWRJbnRlcmZhY2UoKTsKK3Byb3RlY3RlZDoKKyAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7Citwcml2YXRlOgorfTsKK30gIC8vIG5hbWVzcGFjZSBwZXJtaXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWQuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q4ZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9CcFByb3RlY3RlZC5oCkBAIC0wLDAgKzEsMjUgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CitjbGFzcyBCcFByb3RlY3RlZCA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElQcm90ZWN0ZWQ+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQnBQcm90ZWN0ZWQoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgIHZpcnR1YWwgfkJwUHJvdGVjdGVkKCk7CisKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUGVybWlzc2lvblByb3RlY3RlZCgpIG92ZXJyaWRlOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIE11bHRpcGxlUGVybWlzc2lvbnNBbnkoKSBvdmVycmlkZTsKK307Cit9ICAvLyBuYW1lc3BhY2UgcGVybWlzc2lvbgorfSAgLy8gbmFtZXNwYWNlIHRlc3RzCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JwUHJvdGVjdGVkSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0JwUHJvdGVjdGVkSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3ODg2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vQnBQcm90ZWN0ZWRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDI0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgdGVzdHMgeworbmFtZXNwYWNlIHBlcm1pc3Npb24geworY2xhc3MgQnBQcm90ZWN0ZWRJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OkJwQ0ludGVyZmFjZTxJUHJvdGVjdGVkSW50ZXJmYWNlPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJwUHJvdGVjdGVkSW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOworICB2aXJ0dWFsIH5CcFByb3RlY3RlZEludGVyZmFjZSgpOworCisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIE1ldGhvZDEoKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTWV0aG9kMigpIG92ZXJyaWRlOworfTsKK30gIC8vIG5hbWVzcGFjZSBwZXJtaXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgdGVzdHMKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiYzE5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5oCkBAIC0wLDAgKzEsNTEgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KKyNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSB0ZXN0cyB7CituYW1lc3BhY2UgcGVybWlzc2lvbiB7CitjbGFzcyBJUHJvdGVjdGVkIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOworICBJUHJvdGVjdGVkKCk7CisgIHZpcnR1YWwgfklQcm90ZWN0ZWQoKTsKKworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Blcm1pc3Npb25Qcm90ZWN0ZWQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9NdWx0aXBsZVBlcm1pc3Npb25zQWxsID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fTXVsdGlwbGVQZXJtaXNzaW9uc0FueSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOworCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZD4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWQ+JiBpbnN0YW5jZSk7CisgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZD4qIGluc3RhbmNlKTsKKyAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWQ+JiBpbXBsKTsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkPiYgZ2V0RGVmYXVsdEltcGwoKTsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBQZXJtaXNzaW9uUHJvdGVjdGVkKCkgPSAwOworICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIE11bHRpcGxlUGVybWlzc2lvbnNBbGwoKSA9IDA7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpID0gMDsKK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZD4gZGVmYXVsdF9pbXBsOworfTsKK2NsYXNzIElQcm90ZWN0ZWREZWZhdWx0IDogcHVibGljIElQcm90ZWN0ZWQgeworcHVibGljOgorICA6Om5kazo6U2NvcGVkQVN0YXR1cyBQZXJtaXNzaW9uUHJvdGVjdGVkKCkgb3ZlcnJpZGU7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIE11bHRpcGxlUGVybWlzc2lvbnNBbGwoKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpIG92ZXJyaWRlOworICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOworICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7Cit9OworfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZiMjAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLmgKQEAgLTAsMCArMSw0OCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgorI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIHRlc3RzIHsKK25hbWVzcGFjZSBwZXJtaXNzaW9uIHsKK2NsYXNzIElQcm90ZWN0ZWRJbnRlcmZhY2UgOiBwdWJsaWMgOjpuZGs6OklDSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc2NyaXB0b3I7CisgIElQcm90ZWN0ZWRJbnRlcmZhY2UoKTsKKyAgdmlydHVhbCB+SVByb3RlY3RlZEludGVyZmFjZSgpOworCisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fTWV0aG9kMSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX01ldGhvZDIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKKworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWRJbnRlcmZhY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkSW50ZXJmYWNlPiYgaW5zdGFuY2UpOworICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElQcm90ZWN0ZWRJbnRlcmZhY2U+KiBpbnN0YW5jZSk7CisgIHN0YXRpYyBib29sIHNldERlZmF1bHRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkSW50ZXJmYWNlPiYgaW1wbCk7CisgIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVByb3RlY3RlZEludGVyZmFjZT4mIGdldERlZmF1bHRJbXBsKCk7CisgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTWV0aG9kMSgpID0gMDsKKyAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBNZXRob2QyKCkgPSAwOworcHJpdmF0ZToKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJUHJvdGVjdGVkSW50ZXJmYWNlPiBkZWZhdWx0X2ltcGw7Cit9OworY2xhc3MgSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHQgOiBwdWJsaWMgSVByb3RlY3RlZEludGVyZmFjZSB7CitwdWJsaWM6CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIE1ldGhvZDEoKSBvdmVycmlkZTsKKyAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTWV0aG9kMigpIG92ZXJyaWRlOworICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOworICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7Cit9OworfSAgLy8gbmFtZXNwYWNlIHBlcm1pc3Npb24KK30gIC8vIG5hbWVzcGFjZSB0ZXN0cworfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JuRW51bVVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQm5FbnVtVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JuRW51bVVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CbkVudW1Vbmlvbi5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQm5VbmlvbkluVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CblVuaW9uSW5Vbmlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQm5VbmlvbkluVW5pb24uaApyZW5hbWUgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JuVW5pb25JblVuaW9uLmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CcEVudW1Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JwRW51bVVuaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CcEVudW1Vbmlvbi5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQnBFbnVtVW5pb24uaApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JwVW5pb25JblVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvQnBVbmlvbkluVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0JwVW5pb25JblVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9CcFVuaW9uSW5Vbmlvbi5oCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5oCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmgKaW5kZXggZWYxMzQ1Yy4uNzdjMTBkMSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uaApAQCAtMSwyMiArMSwyMiBAQAogI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogCiAjaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KIAogI2lmbmRlZiBfX0JJT05JQ19fCiAjZGVmaW5lIF9fYXNzZXJ0MihhLGIsYyxkKSAoKHZvaWQpMCkKQEAgLTQxLDEwICs0MSw2IEBACiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgRW51bVVuaW9uPjsKIAogICBFbnVtVW5pb24oKSA6IF92YWx1ZShzdGQ6OmluX3BsYWNlX2luZGV4PGludEVudW0+LCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW06OkZPTykpIHsgfQotICBFbnVtVW5pb24oY29uc3QgRW51bVVuaW9uJikgPSBkZWZhdWx0OwotICBFbnVtVW5pb24oRW51bVVuaW9uJiYpID0gZGVmYXVsdDsKLSAgRW51bVVuaW9uJiBvcGVyYXRvcj0oY29uc3QgRW51bVVuaW9uJikgPSBkZWZhdWx0OwotICBFbnVtVW5pb24mIG9wZXJhdG9yPShFbnVtVW5pb24mJikgPSBkZWZhdWx0OwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmgKcmVuYW1lIHRvIHRlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uaAppbmRleCA5ZDU3YmU0Li44ZGM1NmYyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5oCkBAIC0xLDIxICsxLDIxIEBACiAjcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAKICNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmFyaWFudD4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YXJpYW50PgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLmg+CiAKICNpZm5kZWYgX19CSU9OSUNfXwogI2RlZmluZSBfX2Fzc2VydDIoYSxiLGMsZCkgKCh2b2lkKTApCkBAIC00MCwxMCArNDAsNiBAQAogICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIFVuaW9uSW5Vbmlvbj47CiAKICAgVW5pb25JblVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxmaXJzdD4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6RW51bVVuaW9uKCkpIHsgfQotICBVbmlvbkluVW5pb24oY29uc3QgVW5pb25JblVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbkluVW5pb24oVW5pb25JblVuaW9uJiYpID0gZGVmYXVsdDsKLSAgVW5pb25JblVuaW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pb25JblVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbkluVW5pb24mIG9wZXJhdG9yPShVbmlvbkluVW5pb24mJikgPSBkZWZhdWx0OwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vdGltZXN0YW1wCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCnJlbmFtZSB0byB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vdGltZXN0YW1wCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2ZjNmMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0RlcHJlY2F0ZWRQYXJjZWxhYmxlLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIHRlc3RzIHsKLWNvbnN0IGNoYXIqIERlcHJlY2F0ZWRQYXJjZWxhYmxlOjpkZXNjcmlwdG9yID0gImFuZHJvaWQuYWlkbC50ZXN0cy5EZXByZWNhdGVkUGFyY2VsYWJsZSI7Ci0KLWJpbmRlcl9zdGF0dXNfdCBEZXByZWNhdGVkUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplOwotICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotYmluZGVyX3N0YXR1c190IERlcHJlY2F0ZWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzIyZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9PdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotY29uc3QgY2hhciogT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmc6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLnRlc3RzLk90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIjsKLQotYmluZGVyX3N0YXR1c190IE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7Ci0gIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZmaWVsZCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLWJpbmRlcl9zdGF0dXNfdCBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZzo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXM7Ci0gIHNpemVfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgMCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKHBhcmNlbCwgZmllbGQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFkMGE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIHRlc3RzIHsKLWNvbnN0IGNoYXIqIFBhcmNlbGFibGVGb3JUb1N0cmluZzo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuUGFyY2VsYWJsZUZvclRvU3RyaW5nIjsKLQotYmluZGVyX3N0YXR1c190IFBhcmNlbGFibGVGb3JUb1N0cmluZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplOwotICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IElOVDMyX01BWCAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCAwKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmludFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmaW50QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQocGFyY2VsLCAmbG9uZ1ZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmbG9uZ0FycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZERvdWJsZShwYXJjZWwsICZkb3VibGVWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJmRvdWJsZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEZsb2F0KHBhcmNlbCwgJmZsb2F0VmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZmbG9hdEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUocGFyY2VsLCAmYnl0ZVZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmYnl0ZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJvb2wocGFyY2VsLCAmYm9vbGVhblZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmYm9vbGVhbkFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcocGFyY2VsLCAmc3RyaW5nVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZzdHJpbmdBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJnN0cmluZ0xpc3QpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFBhcmNlbGFibGUocGFyY2VsLCAmcGFyY2VsYWJsZVZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmcGFyY2VsYWJsZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmVudW1WYWx1ZSkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzJBcnJheShwYXJjZWwsIHN0YXRpY19jYXN0PHZvaWQqPigmZW51bUFycmF5KSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQzMl90Pik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJm51bGxBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJm51bGxMaXN0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKHBhcmNlbCwgJnBhcmNlbGFibGVHZW5lcmljKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKHBhcmNlbCwgJnVuaW9uVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci1iaW5kZXJfc3RhdHVzX3QgUGFyY2VsYWJsZUZvclRvU3RyaW5nOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgaW50VmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGludEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0KHBhcmNlbCwgbG9uZ1ZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBsb25nQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRG91YmxlKHBhcmNlbCwgZG91YmxlVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGRvdWJsZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUZsb2F0KHBhcmNlbCwgZmxvYXRWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgZmxvYXRBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlKHBhcmNlbCwgYnl0ZVZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBieXRlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChwYXJjZWwsIGJvb2xlYW5WYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgYm9vbGVhbkFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBzdHJpbmdWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgc3RyaW5nQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIHN0cmluZ0xpc3QpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUocGFyY2VsLCBwYXJjZWxhYmxlVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIHBhcmNlbGFibGVBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGVudW1WYWx1ZSkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzJBcnJheShwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KGVudW1BcnJheS5kYXRhKCkpLCBlbnVtQXJyYXkuc2l6ZSgpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBudWxsQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIG51bGxMaXN0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKHBhcmNlbCwgcGFyY2VsYWJsZUdlbmVyaWMpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUocGFyY2VsLCB1bmlvblZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBzaXplX3QgX2FpZGxfZW5kX3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfZW5kX3Bvcyk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmNhY2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcuY3BwIDogXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Vbmlvbi5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDc1ODhhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLSNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jb25zdCBjaGFyKiBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUiOwotCi1iaW5kZXJfc3RhdHVzX3QgU3RydWN0dXJlZFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCkgewotICBpbnQzMl90IF9haWRsX3BhcmNlbGFibGVfc2l6ZTsKLSAgaW50MzJfdCBfYWlkbF9zdGFydF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJl9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJnNob3VsZENvbnRhaW5UaHJlZUZzKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmYpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZzaG91bGRCZUplcnJ5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUocGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDhfdCo+KCZzaG91bGRCZUJ5dGVCYXIpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnNob3VsZEJlSW50QmFyKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZzaG91bGRCZUxvbmdCYXIpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGVBcnJheShwYXJjZWwsIHN0YXRpY19jYXN0PHZvaWQqPigmc2hvdWxkQ29udGFpblR3b0J5dGVGb29zKSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQ4X3Q+KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyQXJyYXkocGFyY2VsLCBzdGF0aWNfY2FzdDx2b2lkKj4oJnNob3VsZENvbnRhaW5Ud29JbnRGb29zKSwgbmRrOjpBUGFyY2VsX3N0ZFZlY3RvckFsbG9jYXRvcjxpbnQzMl90Pik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NEFycmF5KHBhcmNlbCwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MpLCBuZGs6OkFQYXJjZWxfc3RkVmVjdG9yQWxsb2NhdG9yPGludDY0X3Q+KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcocGFyY2VsLCAmc3RyaW5nRGVmYXVsdHNUb0Zvbyk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlKHBhcmNlbCwgJmJ5dGVEZWZhdWx0c1RvRm91cik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZpbnREZWZhdWx0c1RvRml2ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChwYXJjZWwsICZsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQm9vbChwYXJjZWwsICZib29sZWFuRGVmYXVsdHNUb1RydWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQ2hhcihwYXJjZWwsICZjaGFyRGVmYXVsdHNUb0MpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRmxvYXQocGFyY2VsLCAmZmxvYXREZWZhdWx0c1RvUGkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRG91YmxlKHBhcmNlbCwgJmRvdWJsZVdpdGhEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmYXJyYXlEZWZhdWx0c1RvMTIzKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmYXJyYXlEZWZhdWx0c1RvRW1wdHkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQm9vbChwYXJjZWwsICZib29sRGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCeXRlKHBhcmNlbCwgJmJ5dGVEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmludERlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50NjQocGFyY2VsLCAmbG9uZ0RlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRmxvYXQocGFyY2VsLCAmZmxvYXREZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZERvdWJsZShwYXJjZWwsICZkb3VibGVEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZERvdWJsZShwYXJjZWwsICZjaGVja0RvdWJsZUZyb21GbG9hdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKHBhcmNlbCwgJmNoZWNrU3RyaW5nQXJyYXkxKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmY2hlY2tTdHJpbmdBcnJheTIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmaW50MzJfbWluKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJmludDMyX21heCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChwYXJjZWwsICZpbnQ2NF9tYXgpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmaGV4SW50MzJfbmVnXzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKHBhcmNlbCwgJmliaW5kZXIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihwYXJjZWwsICZpbnQzMl8xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IocGFyY2VsLCAmaW50NjRfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZoZXhJbnQzMl9wb3NfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZoZXhJbnQ2NF9wb3NfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc18xKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc18yKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc18zKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc180KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc181KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc182KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc183KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc184KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc185KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZjb25zdF9leHByc18xMCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhwYXJjZWwsICZhZGRTdHJpbmcxKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcocGFyY2VsLCAmYWRkU3RyaW5nMik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZzaG91bGRTZXRCaXQwQW5kQml0Mik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVQYXJjZWxhYmxlKHBhcmNlbCwgJnUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsYWJsZShwYXJjZWwsICZzaG91bGRCZUNvbnN0UzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmZGVmYXVsdFdpdGhGb28pKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotfQotYmluZGVyX3N0YXR1c190IFN0cnVjdHVyZWRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBzaG91bGRDb250YWluVGhyZWVGcyk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIGYpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVN0cmluZyhwYXJjZWwsIHNob3VsZEJlSmVycnkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZShwYXJjZWwsIHN0YXRpY19jYXN0PGludDhfdD4oc2hvdWxkQmVCeXRlQmFyKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KHNob3VsZEJlSW50QmFyKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQ2NChwYXJjZWwsIHN0YXRpY19jYXN0PGludDY0X3Q+KHNob3VsZEJlTG9uZ0JhcikpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQnl0ZUFycmF5KHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihzaG91bGRDb250YWluVHdvQnl0ZUZvb3MuZGF0YSgpKSwgc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLnNpemUoKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMkFycmF5KHBhcmNlbCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oc2hvdWxkQ29udGFpblR3b0ludEZvb3MuZGF0YSgpKSwgc2hvdWxkQ29udGFpblR3b0ludEZvb3Muc2l6ZSgpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0QXJyYXkocGFyY2VsLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDY0X3QqPihzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MuZGF0YSgpKSwgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLnNpemUoKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKHBhcmNlbCwgc3RyaW5nRGVmYXVsdHNUb0Zvbyk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlKHBhcmNlbCwgYnl0ZURlZmF1bHRzVG9Gb3VyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgaW50RGVmYXVsdHNUb0ZpdmUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQocGFyY2VsLCBsb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChwYXJjZWwsIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVDaGFyKHBhcmNlbCwgY2hhckRlZmF1bHRzVG9DKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUZsb2F0KHBhcmNlbCwgZmxvYXREZWZhdWx0c1RvUGkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRG91YmxlKHBhcmNlbCwgZG91YmxlV2l0aERlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihwYXJjZWwsIGFycmF5RGVmYXVsdHNUbzEyMyk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgYXJyYXlEZWZhdWx0c1RvRW1wdHkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChwYXJjZWwsIGJvb2xEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUocGFyY2VsLCBieXRlRGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIGludERlZmF1bHQpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQocGFyY2VsLCBsb25nRGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVGbG9hdChwYXJjZWwsIGZsb2F0RGVmYXVsdCk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUocGFyY2VsLCBkb3VibGVEZWZhdWx0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZURvdWJsZShwYXJjZWwsIGNoZWNrRG91YmxlRnJvbUZsb2F0KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBjaGVja1N0cmluZ0FycmF5MSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKHBhcmNlbCwgY2hlY2tTdHJpbmdBcnJheTIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBpbnQzMl9taW4pOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBpbnQzMl9tYXgpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQocGFyY2VsLCBpbnQ2NF9tYXgpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBoZXhJbnQzMl9uZWdfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVTdHJvbmdCaW5kZXIocGFyY2VsLCBpYmluZGVyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBpbnQzMl8xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IocGFyY2VsLCBpbnQ2NF8xKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgaGV4SW50MzJfcG9zXzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBoZXhJbnQ2NF9wb3NfMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzEpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfMikpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25zdF9leHByc18zKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzQpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfNSkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25zdF9leHByc182KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzcpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY29uc3RfZXhwcnNfOCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25zdF9leHByc185KSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbnN0X2V4cHJzXzEwKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKHBhcmNlbCwgYWRkU3RyaW5nMSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKHBhcmNlbCwgYWRkU3RyaW5nMik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIHNob3VsZFNldEJpdDBBbmRCaXQyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVBhcmNlbGFibGUocGFyY2VsLCB1KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZVBhcmNlbGFibGUocGFyY2VsLCBzaG91bGRCZUNvbnN0UzEpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQzMl90PihkZWZhdWx0V2l0aEZvbykpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKLSAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLmNwcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQxMzE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5jcHAuZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24uY3BwIDogXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmODEzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlcl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmFtZWRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgdGVzdHMgewotY2xhc3MgSVRlc3RTZXJ2aWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotICBJVGVzdFNlcnZpY2UoKTsKLSAgdmlydHVhbCB+SVRlc3RTZXJ2aWNlKCk7Ci0KLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UID0gNDIgfTsKLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UMiA9IC00MiB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQzID0gNDIgfTsKLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNCA9IDQgfTsKLSAgZW51bSA6IGludDMyX3QgeyBURVNUX0NPTlNUQU5UNSA9IC00IH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDYgPSAwIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDcgPSAwIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDggPSAwIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgVEVTVF9DT05TVEFOVDkgPSA4NiB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMCA9IDE2NSB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMSA9IDI1MCB9OwotICBlbnVtIDogaW50MzJfdCB7IFRFU1RfQ09OU1RBTlQxMiA9IC0xIH07Ci0gIGVudW0gOiBpbnQ4X3QgeyBCWVRFX1RFU1RfQ09OU1RBTlQgPSAxNyB9OwotICBlbnVtIDogaW50NjRfdCB7IExPTkdfVEVTVF9DT05TVEFOVCA9IDEwOTk1MTE2Mjc3NzZMIH07Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBTVFJJTkdfVEVTVF9DT05TVEFOVDsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UMjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFNUUklOR19URVNUX0NPTlNUQU5UX1VURjg7Ci0gIGVudW0gOiBpbnQzMl90IHsgQTEgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTIgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTMgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTUgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTYgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTcgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTggPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTkgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTEwID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEExMSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMTIgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTEzID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEExNCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMTUgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTE2ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEExNyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMTggPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTE5ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyMCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMjEgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTIyID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyMyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMjQgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTI1ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyNiA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMjcgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTI4ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEyOSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzAgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTMxID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEzMiA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzMgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTM0ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEzNSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzYgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTM3ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEEzOCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBMzkgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQwID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE0MSA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNDIgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQzID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE0NCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNDUgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQ2ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE0NyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNDggPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTQ5ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE1MCA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNTEgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTUyID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE1MyA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNTQgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQTU1ID0gMSB9OwotICBlbnVtIDogaW50MzJfdCB7IEE1NiA9IDEgfTsKLSAgZW51bSA6IGludDMyX3QgeyBBNTcgPSAxIH07Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fVW5pbXBsZW1lbnRlZE1ldGhvZCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0RlcHJlY2F0ZWQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UZXN0T25ld2F5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0Qm9vbGVhbiA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXRDaGFyID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0SW50ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEZsb2F0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDg7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0RG91YmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0U3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEJ5dGVFbnVtID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdEludEVudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTM7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJvb2xlYW4gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUJ5dGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUNoYXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZUludCA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlRmxvYXQgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZURvdWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlU3RyaW5nID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VCeXRlRW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlSW50RW51bSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlTG9uZ0VudW0gPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0T3RoZXJUZXN0U2VydmljZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNTsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9WZXJpZnlOYW1lID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VTdHJpbmdMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI5OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1Rocm93U2VydmljZUV4Y2VwdGlvbiA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEFycmF5ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0ID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FuSUJpbmRlciA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9UYWtlc0FOdWxsYWJsZUlCaW5kZXIgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmVwZWF0VXRmOENwcFN0cmluZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZVV0ZjhDcHBTdHJpbmcgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0Q2FsbGJhY2sgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDU7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2OwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQU5TQUNUSU9OX0dldE9sZE5hbWVJbnRlcmZhY2UgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDc7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fR2V0TmV3TmFtZUludGVyZmFjZSA9IEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0ODsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9HZXRDcHBKYXZhVGVzdHMgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDk7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fZ2V0QmFja2VuZFR5cGUgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTA7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7Ci0gIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+JiBpbnN0YW5jZSk7Ci0gIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiogaW5zdGFuY2UpOwotICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiYgaW1wbCk7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRlc3RTZXJ2aWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBVbmltcGxlbWVudGVkTWV0aG9kKGludDMyX3QgaW5fYXJnLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBEZXByZWNhdGVkKCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIikpKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGVzdE9uZXdheSgpID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRCb29sZWFuKGJvb2wgaW5fdG9rZW4sIGJvb2wqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGUoaW50OF90IGluX3Rva2VuLCBpbnQ4X3QqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdENoYXIoY2hhcjE2X3QgaW5fdG9rZW4sIGNoYXIxNl90KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnQoaW50MzJfdCBpbl90b2tlbiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TG9uZyhpbnQ2NF90IGluX3Rva2VuLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRGbG9hdChmbG9hdCBpbl90b2tlbiwgZmxvYXQqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdERvdWJsZShkb3VibGUgaW5fdG9rZW4sIGRvdWJsZSogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl90b2tlbiwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJ5dGVFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0SW50RW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtKiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nRW51bSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSBpbl90b2tlbiwgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCb29sZWFuKGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8Ym9vbD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VDaGFyKGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIxNl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VJbnQoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmcoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUZsb2F0KGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGZsb2F0Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VEb3VibGUoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlQnl0ZUVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludEVudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUxvbmdFbnVtKGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE90aGVyVGVzdFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFZlcmlmeU5hbWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiYgaW5fc2VydmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX25hbWUsIGJvb2wqIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKGNvbnN0IDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciYgaW5fcmVhZCwgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShjb25zdCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBUaHJvd1NlcnZpY2VFeGNlcHRpb24oaW50MzJfdCBpbl9jb2RlKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVJbnRBcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+PiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bT4+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoY29uc3Qgc3RkOjpvcHRpb25hbDw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBbklCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVGFrZXNBTnVsbGFibGVJQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9pbnB1dCkgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdFV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl90b2tlbiwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VVdGY4Q3BwU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8c3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4+PiogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENhbGxiYWNrKGJvb2wgaW5fcmV0dXJuX251bGwsIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmFtZWRDYWxsYmFjaz4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZSogaW5fcGFyY2VsKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T2xkTmFtZUludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU9sZE5hbWU+KiBfYWlkbF9yZXR1cm4pID0gMDsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXROZXdOYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJTmV3TmFtZT4qIF9haWRsX3JldHVybikgPSAwOwotICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldENwcEphdmFUZXN0cyg6Om5kazo6U3BBSUJpbmRlciogX2FpZGxfcmV0dXJuKSA9IDA7Ci0gIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QmFja2VuZFR5cGUoOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6QmFja2VuZFR5cGUqIF9haWRsX3JldHVybikgPSAwOwotcHJpdmF0ZToKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdFNlcnZpY2U+IGRlZmF1bHRfaW1wbDsKLX07Ci1jbGFzcyBJVGVzdFNlcnZpY2VEZWZhdWx0IDogcHVibGljIElUZXN0U2VydmljZSB7Ci1wdWJsaWM6Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFVuaW1wbGVtZW50ZWRNZXRob2QoaW50MzJfdCBpbl9hcmcsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIERlcHJlY2F0ZWQoKSBvdmVycmlkZSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiKSkpOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUZXN0T25ld2F5KCkgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEJvb2xlYW4oYm9vbCBpbl90b2tlbiwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qnl0ZShpbnQ4X3QgaW5fdG9rZW4sIGludDhfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Q2hhcihjaGFyMTZfdCBpbl90b2tlbiwgY2hhcjE2X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEludChpbnQzMl90IGluX3Rva2VuLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRMb25nKGludDY0X3QgaW5fdG9rZW4sIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdEZsb2F0KGZsb2F0IGluX3Rva2VuLCBmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0RG91YmxlKGRvdWJsZSBpbl90b2tlbiwgZG91YmxlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Rva2VuLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0Qnl0ZUVudW0oOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXRJbnRFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gaW5fdG9rZW4sIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdExvbmdFbnVtKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIGluX3Rva2VuLCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpMb25nRW51bSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJvb2xlYW4oY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjxib29sPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxib29sPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUJ5dGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjx1aW50OF90Piogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUNoYXIoY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZUludChjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlRmxvYXQoY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZmxvYXQ+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPGZsb2F0PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZURvdWJsZShjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3Rvcjxkb3VibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0X3JlcGVhdGVkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VCeXRlRW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4qIG91dF9yZXBlYXRlZCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Qnl0ZUVudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlSW50RW51bShjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiYgaW5faW5wdXQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlTG9uZ0VudW0oY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0T3RoZXJUZXN0U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgVmVyaWZ5TmFtZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5hbWVkQ2FsbGJhY2s+JiBpbl9zZXJ2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoY29uc3QgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yJiBpbl9yZWFkLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KGNvbnN0IHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4mIGluX2lucHV0LCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFRocm93U2VydmljZUV4Y2VwdGlvbihpbnQzMl90IGluX2NvZGUpIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZUludEFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50MzJfdD4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkJ5dGVFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bT4+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtPj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGluX2lucHV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShjb25zdCBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlPiYgaW5faW5wdXQsIHN0ZDo6b3B0aW9uYWw8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6U3RydWN0dXJlZFBhcmNlbGFibGU+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FuSUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgaW5faW5wdXQpIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2lucHV0KSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmVwZWF0VXRmOENwcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fdG9rZW4sIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGluX3Rva2VuLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4mIGluX2lucHV0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+Pj4qIG91dF9yZXBlYXRlZCwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPj4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbl9pbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRfcmVwZWF0ZWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q2FsbGJhY2soYm9vbCBpbl9yZXR1cm5fbnVsbCwgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOYW1lZENhbGxiYWNrPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlN0cnVjdHVyZWRQYXJjZWxhYmxlKiBpbl9wYXJjZWwpIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBHZXRPbGROYW1lSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIEdldE5ld05hbWVJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklOZXdOYW1lPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgR2V0Q3BwSmF2YVRlc3RzKDo6bmRrOjpTcEFJQmluZGVyKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRCYWNrZW5kVHlwZSg6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCYWNrZW5kVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKLSAgYm9vbCBpc1JlbW90ZSgpIG92ZXJyaWRlOwotfTsKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0cwotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjVhZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxhYmxlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uaD4KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1jbGFzcyBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotCi0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHNob3VsZENvbnRhaW5UaHJlZUZzOwotICBpbnQzMl90IGYgPSAwOwotICBzdGQ6OnN0cmluZyBzaG91bGRCZUplcnJ5OwotICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSBzaG91bGRCZUJ5dGVCYXIgPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SW50RW51bSBzaG91bGRCZUludEJhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0oMCk7Ci0gIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtIHNob3VsZEJlTG9uZ0JhciA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkxvbmdFbnVtKDApOwotICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpCeXRlRW51bT4gc2hvdWxkQ29udGFpblR3b0J5dGVGb29zOwotICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtPiBzaG91bGRDb250YWluVHdvSW50Rm9vczsKLSAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6TG9uZ0VudW0+IHNob3VsZENvbnRhaW5Ud29Mb25nRm9vczsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nRGVmYXVsdHNUb0ZvbyA9ICJmb28iOwotICBpbnQ4X3QgYnl0ZURlZmF1bHRzVG9Gb3VyID0gNDsKLSAgaW50MzJfdCBpbnREZWZhdWx0c1RvRml2ZSA9IDU7Ci0gIGludDY0X3QgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuID0gLTdMOwotICBib29sIGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSA9IHRydWU7Ci0gIGNoYXIxNl90IGNoYXJEZWZhdWx0c1RvQyA9ICdDJzsKLSAgZmxvYXQgZmxvYXREZWZhdWx0c1RvUGkgPSAzLjE0MDAwMGY7Ci0gIGRvdWJsZSBkb3VibGVXaXRoRGVmYXVsdCA9IC0zMTQwMDAwMDAwMDAwMDAwMDAuMDAwMDAwOwotICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBhcnJheURlZmF1bHRzVG8xMjMgPSB7MSwgMiwgM307Ci0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFycmF5RGVmYXVsdHNUb0VtcHR5ID0ge307Ci0gIGJvb2wgYm9vbERlZmF1bHQgPSBmYWxzZTsKLSAgaW50OF90IGJ5dGVEZWZhdWx0ID0gMDsKLSAgaW50MzJfdCBpbnREZWZhdWx0ID0gMDsKLSAgaW50NjRfdCBsb25nRGVmYXVsdCA9IDBMOwotICBmbG9hdCBmbG9hdERlZmF1bHQgPSAwLjAwMDAwMGY7Ci0gIGRvdWJsZSBkb3VibGVEZWZhdWx0ID0gMC4wMDAwMDA7Ci0gIGRvdWJsZSBjaGVja0RvdWJsZUZyb21GbG9hdCA9IDMuMTQwMDAwOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTEgPSB7ImEiLCAiYiJ9OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY2hlY2tTdHJpbmdBcnJheTIgPSB7ImEiLCAiYiJ9OwotICBpbnQzMl90IGludDMyX21pbiA9IC0yMTQ3NDgzNjQ4OwotICBpbnQzMl90IGludDMyX21heCA9IDIxNDc0ODM2NDc7Ci0gIGludDY0X3QgaW50NjRfbWF4ID0gOTIyMzM3MjAzNjg1NDc3NTgwN0w7Ci0gIGludDMyX3QgaGV4SW50MzJfbmVnXzEgPSAtMTsKLSAgOjpuZGs6OlNwQUlCaW5kZXIgaWJpbmRlcjsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50MzJfMSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKLSAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaW50NjRfMSA9IHsxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTCwgMUwsIDFMLCAxTH07Ci0gIGludDMyX3QgaGV4SW50MzJfcG9zXzEgPSAxOwotICBpbnQzMl90IGhleEludDY0X3Bvc18xID0gMTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18yID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18zID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc180ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc181ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc182ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc183ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc184ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc185ID0gOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSgwKTsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBjb25zdF9leHByc18xMCA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0oMCk7Ci0gIHN0ZDo6c3RyaW5nIGFkZFN0cmluZzEgPSAiaGVsbG8gd29ybGQhIjsKLSAgc3RkOjpzdHJpbmcgYWRkU3RyaW5nMiA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiI7Ci0gIGludDMyX3Qgc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSAwOwotICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiB1OwotICBzdGQ6Om9wdGlvbmFsPDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OlVuaW9uPiBzaG91bGRCZUNvbnN0UzE7Ci0gIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OkludEVudW0gZGVmYXVsdFdpdGhGb28gPSA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJbnRFbnVtOjpGT087Ci0KLSAgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3Q7Ci0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgIT0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPCBzdGQ6OnRpZShyaHMuc2hvdWxkQ29udGFpblRocmVlRnMsIHJocy5mLCByaHMuc2hvdWxkQmVKZXJyeSwgcmhzLnNob3VsZEJlQnl0ZUJhciwgcmhzLnNob3VsZEJlSW50QmFyLCByaHMuc2hvdWxkQmVMb25nQmFyLCByaHMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHJocy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHJocy5zdHJpbmdEZWZhdWx0c1RvRm9vLCByaHMuYnl0ZURlZmF1bHRzVG9Gb3VyLCByaHMuaW50RGVmYXVsdHNUb0ZpdmUsIHJocy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4sIHJocy5ib29sZWFuRGVmYXVsdHNUb1RydWUsIHJocy5jaGFyRGVmYXVsdHNUb0MsIHJocy5mbG9hdERlZmF1bHRzVG9QaSwgcmhzLmRvdWJsZVdpdGhEZWZhdWx0LCByaHMuYXJyYXlEZWZhdWx0c1RvMTIzLCByaHMuYXJyYXlEZWZhdWx0c1RvRW1wdHksIHJocy5ib29sRGVmYXVsdCwgcmhzLmJ5dGVEZWZhdWx0LCByaHMuaW50RGVmYXVsdCwgcmhzLmxvbmdEZWZhdWx0LCByaHMuZmxvYXREZWZhdWx0LCByaHMuZG91YmxlRGVmYXVsdCwgcmhzLmNoZWNrRG91YmxlRnJvbUZsb2F0LCByaHMuY2hlY2tTdHJpbmdBcnJheTEsIHJocy5jaGVja1N0cmluZ0FycmF5MiwgcmhzLmludDMyX21pbiwgcmhzLmludDMyX21heCwgcmhzLmludDY0X21heCwgcmhzLmhleEludDMyX25lZ18xLCByaHMuaWJpbmRlciwgcmhzLmludDMyXzEsIHJocy5pbnQ2NF8xLCByaHMuaGV4SW50MzJfcG9zXzEsIHJocy5oZXhJbnQ2NF9wb3NfMSwgcmhzLmNvbnN0X2V4cHJzXzEsIHJocy5jb25zdF9leHByc18yLCByaHMuY29uc3RfZXhwcnNfMywgcmhzLmNvbnN0X2V4cHJzXzQsIHJocy5jb25zdF9leHByc181LCByaHMuY29uc3RfZXhwcnNfNiwgcmhzLmNvbnN0X2V4cHJzXzcsIHJocy5jb25zdF9leHByc184LCByaHMuY29uc3RfZXhwcnNfOSwgcmhzLmNvbnN0X2V4cHJzXzEwLCByaHMuYWRkU3RyaW5nMSwgcmhzLmFkZFN0cmluZzIsIHJocy5zaG91bGRTZXRCaXQwQW5kQml0MiwgcmhzLnUsIHJocy5zaG91bGRCZUNvbnN0UzEsIHJocy5kZWZhdWx0V2l0aEZvbyk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKHNob3VsZENvbnRhaW5UaHJlZUZzLCBmLCBzaG91bGRCZUplcnJ5LCBzaG91bGRCZUJ5dGVCYXIsIHNob3VsZEJlSW50QmFyLCBzaG91bGRCZUxvbmdCYXIsIHNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgc2hvdWxkQ29udGFpblR3b0ludEZvb3MsIHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgc3RyaW5nRGVmYXVsdHNUb0ZvbywgYnl0ZURlZmF1bHRzVG9Gb3VyLCBpbnREZWZhdWx0c1RvRml2ZSwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCBib29sZWFuRGVmYXVsdHNUb1RydWUsIGNoYXJEZWZhdWx0c1RvQywgZmxvYXREZWZhdWx0c1RvUGksIGRvdWJsZVdpdGhEZWZhdWx0LCBhcnJheURlZmF1bHRzVG8xMjMsIGFycmF5RGVmYXVsdHNUb0VtcHR5LCBib29sRGVmYXVsdCwgYnl0ZURlZmF1bHQsIGludERlZmF1bHQsIGxvbmdEZWZhdWx0LCBmbG9hdERlZmF1bHQsIGRvdWJsZURlZmF1bHQsIGNoZWNrRG91YmxlRnJvbUZsb2F0LCBjaGVja1N0cmluZ0FycmF5MSwgY2hlY2tTdHJpbmdBcnJheTIsIGludDMyX21pbiwgaW50MzJfbWF4LCBpbnQ2NF9tYXgsIGhleEludDMyX25lZ18xLCBpYmluZGVyLCBpbnQzMl8xLCBpbnQ2NF8xLCBoZXhJbnQzMl9wb3NfMSwgaGV4SW50NjRfcG9zXzEsIGNvbnN0X2V4cHJzXzEsIGNvbnN0X2V4cHJzXzIsIGNvbnN0X2V4cHJzXzMsIGNvbnN0X2V4cHJzXzQsIGNvbnN0X2V4cHJzXzUsIGNvbnN0X2V4cHJzXzYsIGNvbnN0X2V4cHJzXzcsIGNvbnN0X2V4cHJzXzgsIGNvbnN0X2V4cHJzXzksIGNvbnN0X2V4cHJzXzEwLCBhZGRTdHJpbmcxLCBhZGRTdHJpbmcyLCBzaG91bGRTZXRCaXQwQW5kQml0MiwgdSwgc2hvdWxkQmVDb25zdFMxLCBkZWZhdWx0V2l0aEZvbykgPD0gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID09IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID4gc3RkOjp0aWUocmhzLnNob3VsZENvbnRhaW5UaHJlZUZzLCByaHMuZiwgcmhzLnNob3VsZEJlSmVycnksIHJocy5zaG91bGRCZUJ5dGVCYXIsIHJocy5zaG91bGRCZUludEJhciwgcmhzLnNob3VsZEJlTG9uZ0JhciwgcmhzLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29JbnRGb29zLCByaHMuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zLCByaHMuc3RyaW5nRGVmYXVsdHNUb0ZvbywgcmhzLmJ5dGVEZWZhdWx0c1RvRm91ciwgcmhzLmludERlZmF1bHRzVG9GaXZlLCByaHMubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCByaHMuYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCByaHMuY2hhckRlZmF1bHRzVG9DLCByaHMuZmxvYXREZWZhdWx0c1RvUGksIHJocy5kb3VibGVXaXRoRGVmYXVsdCwgcmhzLmFycmF5RGVmYXVsdHNUbzEyMywgcmhzLmFycmF5RGVmYXVsdHNUb0VtcHR5LCByaHMuYm9vbERlZmF1bHQsIHJocy5ieXRlRGVmYXVsdCwgcmhzLmludERlZmF1bHQsIHJocy5sb25nRGVmYXVsdCwgcmhzLmZsb2F0RGVmYXVsdCwgcmhzLmRvdWJsZURlZmF1bHQsIHJocy5jaGVja0RvdWJsZUZyb21GbG9hdCwgcmhzLmNoZWNrU3RyaW5nQXJyYXkxLCByaHMuY2hlY2tTdHJpbmdBcnJheTIsIHJocy5pbnQzMl9taW4sIHJocy5pbnQzMl9tYXgsIHJocy5pbnQ2NF9tYXgsIHJocy5oZXhJbnQzMl9uZWdfMSwgcmhzLmliaW5kZXIsIHJocy5pbnQzMl8xLCByaHMuaW50NjRfMSwgcmhzLmhleEludDMyX3Bvc18xLCByaHMuaGV4SW50NjRfcG9zXzEsIHJocy5jb25zdF9leHByc18xLCByaHMuY29uc3RfZXhwcnNfMiwgcmhzLmNvbnN0X2V4cHJzXzMsIHJocy5jb25zdF9leHByc180LCByaHMuY29uc3RfZXhwcnNfNSwgcmhzLmNvbnN0X2V4cHJzXzYsIHJocy5jb25zdF9leHByc183LCByaHMuY29uc3RfZXhwcnNfOCwgcmhzLmNvbnN0X2V4cHJzXzksIHJocy5jb25zdF9leHByc18xMCwgcmhzLmFkZFN0cmluZzEsIHJocy5hZGRTdHJpbmcyLCByaHMuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHJocy51LCByaHMuc2hvdWxkQmVDb25zdFMxLCByaHMuZGVmYXVsdFdpdGhGb28pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgU3RydWN0dXJlZFBhcmNlbGFibGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShzaG91bGRDb250YWluVGhyZWVGcywgZiwgc2hvdWxkQmVKZXJyeSwgc2hvdWxkQmVCeXRlQmFyLCBzaG91bGRCZUludEJhciwgc2hvdWxkQmVMb25nQmFyLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHNob3VsZENvbnRhaW5Ud29JbnRGb29zLCBzaG91bGRDb250YWluVHdvTG9uZ0Zvb3MsIHN0cmluZ0RlZmF1bHRzVG9Gb28sIGJ5dGVEZWZhdWx0c1RvRm91ciwgaW50RGVmYXVsdHNUb0ZpdmUsIGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlLCBjaGFyRGVmYXVsdHNUb0MsIGZsb2F0RGVmYXVsdHNUb1BpLCBkb3VibGVXaXRoRGVmYXVsdCwgYXJyYXlEZWZhdWx0c1RvMTIzLCBhcnJheURlZmF1bHRzVG9FbXB0eSwgYm9vbERlZmF1bHQsIGJ5dGVEZWZhdWx0LCBpbnREZWZhdWx0LCBsb25nRGVmYXVsdCwgZmxvYXREZWZhdWx0LCBkb3VibGVEZWZhdWx0LCBjaGVja0RvdWJsZUZyb21GbG9hdCwgY2hlY2tTdHJpbmdBcnJheTEsIGNoZWNrU3RyaW5nQXJyYXkyLCBpbnQzMl9taW4sIGludDMyX21heCwgaW50NjRfbWF4LCBoZXhJbnQzMl9uZWdfMSwgaWJpbmRlciwgaW50MzJfMSwgaW50NjRfMSwgaGV4SW50MzJfcG9zXzEsIGhleEludDY0X3Bvc18xLCBjb25zdF9leHByc18xLCBjb25zdF9leHByc18yLCBjb25zdF9leHByc18zLCBjb25zdF9leHByc180LCBjb25zdF9leHByc181LCBjb25zdF9leHByc182LCBjb25zdF9leHByc183LCBjb25zdF9leHByc184LCBjb25zdF9leHByc185LCBjb25zdF9leHByc18xMCwgYWRkU3RyaW5nMSwgYWRkU3RyaW5nMiwgc2hvdWxkU2V0Qml0MEFuZEJpdDIsIHUsIHNob3VsZEJlQ29uc3RTMSwgZGVmYXVsdFdpdGhGb28pID49IHN0ZDo6dGllKHJocy5zaG91bGRDb250YWluVGhyZWVGcywgcmhzLmYsIHJocy5zaG91bGRCZUplcnJ5LCByaHMuc2hvdWxkQmVCeXRlQmFyLCByaHMuc2hvdWxkQmVJbnRCYXIsIHJocy5zaG91bGRCZUxvbmdCYXIsIHJocy5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MsIHJocy5zaG91bGRDb250YWluVHdvSW50Rm9vcywgcmhzLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcywgcmhzLnN0cmluZ0RlZmF1bHRzVG9Gb28sIHJocy5ieXRlRGVmYXVsdHNUb0ZvdXIsIHJocy5pbnREZWZhdWx0c1RvRml2ZSwgcmhzLmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiwgcmhzLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgcmhzLmNoYXJEZWZhdWx0c1RvQywgcmhzLmZsb2F0RGVmYXVsdHNUb1BpLCByaHMuZG91YmxlV2l0aERlZmF1bHQsIHJocy5hcnJheURlZmF1bHRzVG8xMjMsIHJocy5hcnJheURlZmF1bHRzVG9FbXB0eSwgcmhzLmJvb2xEZWZhdWx0LCByaHMuYnl0ZURlZmF1bHQsIHJocy5pbnREZWZhdWx0LCByaHMubG9uZ0RlZmF1bHQsIHJocy5mbG9hdERlZmF1bHQsIHJocy5kb3VibGVEZWZhdWx0LCByaHMuY2hlY2tEb3VibGVGcm9tRmxvYXQsIHJocy5jaGVja1N0cmluZ0FycmF5MSwgcmhzLmNoZWNrU3RyaW5nQXJyYXkyLCByaHMuaW50MzJfbWluLCByaHMuaW50MzJfbWF4LCByaHMuaW50NjRfbWF4LCByaHMuaGV4SW50MzJfbmVnXzEsIHJocy5pYmluZGVyLCByaHMuaW50MzJfMSwgcmhzLmludDY0XzEsIHJocy5oZXhJbnQzMl9wb3NfMSwgcmhzLmhleEludDY0X3Bvc18xLCByaHMuY29uc3RfZXhwcnNfMSwgcmhzLmNvbnN0X2V4cHJzXzIsIHJocy5jb25zdF9leHByc18zLCByaHMuY29uc3RfZXhwcnNfNCwgcmhzLmNvbnN0X2V4cHJzXzUsIHJocy5jb25zdF9leHByc182LCByaHMuY29uc3RfZXhwcnNfNywgcmhzLmNvbnN0X2V4cHJzXzgsIHJocy5jb25zdF9leHByc185LCByaHMuY29uc3RfZXhwcnNfMTAsIHJocy5hZGRTdHJpbmcxLCByaHMuYWRkU3RyaW5nMiwgcmhzLnNob3VsZFNldEJpdDBBbmRCaXQyLCByaHMudSwgcmhzLnNob3VsZEJlQ29uc3RTMSwgcmhzLmRlZmF1bHRXaXRoRm9vKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Om5kazo6cGFyY2VsYWJsZV9zdGFiaWxpdHlfdCBfYWlkbF9zdGFiaWxpdHkgPSA6Om5kazo6U1RBQklMSVRZX0xPQ0FMOwotICBlbnVtIDogaW50MzJfdCB7IEJJVDAgPSAxIH07Ci0gIGVudW0gOiBpbnQzMl90IHsgQklUMSA9IDIgfTsKLSAgZW51bSA6IGludDMyX3QgeyBCSVQyID0gNCB9OwotICBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOwotICAgIG9zIDw8ICJTdHJ1Y3R1cmVkUGFyY2VsYWJsZXsiOwotICAgIG9zIDw8ICJzaG91bGRDb250YWluVGhyZWVGczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVGhyZWVGcyk7Ci0gICAgb3MgPDwgIiwgZjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhmKTsKLSAgICBvcyA8PCAiLCBzaG91bGRCZUplcnJ5OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlSmVycnkpOwotICAgIG9zIDw8ICIsIHNob3VsZEJlQnl0ZUJhcjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRCZUJ5dGVCYXIpOwotICAgIG9zIDw8ICIsIHNob3VsZEJlSW50QmFyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlSW50QmFyKTsKLSAgICBvcyA8PCAiLCBzaG91bGRCZUxvbmdCYXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQmVMb25nQmFyKTsKLSAgICBvcyA8PCAiLCBzaG91bGRDb250YWluVHdvQnl0ZUZvb3M6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkQ29udGFpblR3b0J5dGVGb29zKTsKLSAgICBvcyA8PCAiLCBzaG91bGRDb250YWluVHdvSW50Rm9vczogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzaG91bGRDb250YWluVHdvSW50Rm9vcyk7Ci0gICAgb3MgPDwgIiwgc2hvdWxkQ29udGFpblR3b0xvbmdGb29zOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyk7Ci0gICAgb3MgPDwgIiwgc3RyaW5nRGVmYXVsdHNUb0ZvbzogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhzdHJpbmdEZWZhdWx0c1RvRm9vKTsKLSAgICBvcyA8PCAiLCBieXRlRGVmYXVsdHNUb0ZvdXI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYnl0ZURlZmF1bHRzVG9Gb3VyKTsKLSAgICBvcyA8PCAiLCBpbnREZWZhdWx0c1RvRml2ZTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnREZWZhdWx0c1RvRml2ZSk7Ci0gICAgb3MgPDwgIiwgbG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbik7Ci0gICAgb3MgPDwgIiwgYm9vbGVhbkRlZmF1bHRzVG9UcnVlOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7Ci0gICAgb3MgPDwgIiwgY2hhckRlZmF1bHRzVG9DOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoYXJEZWZhdWx0c1RvQyk7Ci0gICAgb3MgPDwgIiwgZmxvYXREZWZhdWx0c1RvUGk6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXREZWZhdWx0c1RvUGkpOwotICAgIG9zIDw8ICIsIGRvdWJsZVdpdGhEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZVdpdGhEZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBhcnJheURlZmF1bHRzVG8xMjM6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYXJyYXlEZWZhdWx0c1RvMTIzKTsKLSAgICBvcyA8PCAiLCBhcnJheURlZmF1bHRzVG9FbXB0eTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhhcnJheURlZmF1bHRzVG9FbXB0eSk7Ci0gICAgb3MgPDwgIiwgYm9vbERlZmF1bHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYm9vbERlZmF1bHQpOwotICAgIG9zIDw8ICIsIGJ5dGVEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGJ5dGVEZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBpbnREZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGludERlZmF1bHQpOwotICAgIG9zIDw8ICIsIGxvbmdEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGxvbmdEZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBmbG9hdERlZmF1bHQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZmxvYXREZWZhdWx0KTsKLSAgICBvcyA8PCAiLCBkb3VibGVEZWZhdWx0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGRvdWJsZURlZmF1bHQpOwotICAgIG9zIDw8ICIsIGNoZWNrRG91YmxlRnJvbUZsb2F0OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNoZWNrRG91YmxlRnJvbUZsb2F0KTsKLSAgICBvcyA8PCAiLCBjaGVja1N0cmluZ0FycmF5MTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjaGVja1N0cmluZ0FycmF5MSk7Ci0gICAgb3MgPDwgIiwgY2hlY2tTdHJpbmdBcnJheTI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY2hlY2tTdHJpbmdBcnJheTIpOwotICAgIG9zIDw8ICIsIGludDMyX21pbjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl9taW4pOwotICAgIG9zIDw8ICIsIGludDMyX21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQzMl9tYXgpOwotICAgIG9zIDw8ICIsIGludDY0X21heDogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQ2NF9tYXgpOwotICAgIG9zIDw8ICIsIGhleEludDMyX25lZ18xOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGhleEludDMyX25lZ18xKTsKLSAgICBvcyA8PCAiLCBpYmluZGVyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGliaW5kZXIpOwotICAgIG9zIDw8ICIsIGludDMyXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW50MzJfMSk7Ci0gICAgb3MgPDwgIiwgaW50NjRfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbnQ2NF8xKTsKLSAgICBvcyA8PCAiLCBoZXhJbnQzMl9wb3NfMTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhoZXhJbnQzMl9wb3NfMSk7Ci0gICAgb3MgPDwgIiwgaGV4SW50NjRfcG9zXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaGV4SW50NjRfcG9zXzEpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzE6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfMSk7Ci0gICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfMjogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc18yKTsKLSAgICBvcyA8PCAiLCBjb25zdF9leHByc18zOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzMpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzQ6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfNCk7Ci0gICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfNTogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc181KTsKLSAgICBvcyA8PCAiLCBjb25zdF9leHByc182OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzYpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzc6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoY29uc3RfZXhwcnNfNyk7Ci0gICAgb3MgPDwgIiwgY29uc3RfZXhwcnNfODogIiA8PCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhjb25zdF9leHByc184KTsKLSAgICBvcyA8PCAiLCBjb25zdF9leHByc185OiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzkpOwotICAgIG9zIDw8ICIsIGNvbnN0X2V4cHJzXzEwOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGNvbnN0X2V4cHJzXzEwKTsKLSAgICBvcyA8PCAiLCBhZGRTdHJpbmcxOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGFkZFN0cmluZzEpOwotICAgIG9zIDw8ICIsIGFkZFN0cmluZzI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoYWRkU3RyaW5nMik7Ci0gICAgb3MgPDwgIiwgc2hvdWxkU2V0Qml0MEFuZEJpdDI6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoc2hvdWxkU2V0Qml0MEFuZEJpdDIpOwotICAgIG9zIDw8ICIsIHU6ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcodSk7Ci0gICAgb3MgPDwgIiwgc2hvdWxkQmVDb25zdFMxOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHNob3VsZEJlQ29uc3RTMSk7Ci0gICAgb3MgPDwgIiwgZGVmYXVsdFdpdGhGb286ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZGVmYXVsdFdpdGhGb28pOwotICAgIG9zIDw8ICJ9IjsKLSAgICByZXR1cm4gb3Muc3RyKCk7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2ZDk2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybTsKK3B1YmxpYyBpbnRlcmZhY2UgSVByb3RlY3RlZCBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSVByb3RlY3RlZC4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZAorICB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIFByb3RlY3RlZFdpdGhTb3VyY2VBdHRyaWJ1dGlvbihhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2Ugc291cmNlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKyAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZAorICB7CisgICAgLyoqIENvbnN0cnVjdCB0aGUgc3R1YiBhdCBhdHRhY2ggaXQgdG8gdGhlIGludGVyZmFjZS4gKi8KKyAgICBwdWJsaWMgU3R1YigpCisgICAgeworICAgICAgdGhpcy5hdHRhY2hJbnRlcmZhY2UodGhpcywgREVTQ1JJUFRPUik7CisgICAgfQorICAgIC8qKgorICAgICAqIENhc3QgYW4gSUJpbmRlciBvYmplY3QgaW50byBhbiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkIGludGVyZmFjZSwKKyAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZCBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgIHsKKyAgICAgIGlmICgob2JqPT1udWxsKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGFuZHJvaWQub3MuSUludGVyZmFjZSBpaW4gPSBvYmoucXVlcnlMb2NhbEludGVyZmFjZShERVNDUklQVE9SKTsKKyAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkKSkpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24ucGxhdGZvcm0uSVByb3RlY3RlZClpaW4pOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5wbGF0Zm9ybS5JUHJvdGVjdGVkLlN0dWIuUHJveHkob2JqKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yID0gREVTQ1JJUFRPUjsKKyAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoZGVzY3JpcHRvcik7CisgICAgICB9CisgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZGVzY3JpcHRvcik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9Qcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb246CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgX2FyZzA7CisgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UuQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBpZiAoKCh0aGlzLnBlcm1pc3Npb25DaGVja2VyV3JhcHBlcihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQsIHRoaXMuZ2V0Q2FsbGluZ1BpZCgpLCBfYXJnMCkmJnRoaXMucGVybWlzc2lvbkNoZWNrZXJXcmFwcGVyKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5WSUJSQVRFLCB0aGlzLmdldENhbGxpbmdQaWQoKSwgX2FyZzApKSE9dHJ1ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzIGRlbmllZCwgcmVxdWlyZXM6IGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9Iik7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMuUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eSBpbXBsZW1lbnRzIGFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLnBsYXRmb3JtLklQcm90ZWN0ZWQKKyAgICB7CisgICAgICBwcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlOworICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgIHsKKyAgICAgICAgbVJlbW90ZSA9IHJlbW90ZTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICB9CisgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIERFU0NSSVBUT1I7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uKGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3Qoc291cmNlLCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fUHJvdGVjdGVkV2l0aFNvdXJjZUF0dHJpYnV0aW9uLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBwZXJtaXNzaW9uQ2hlY2tlcldyYXBwZXIoCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICAgIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGN0eCA9CisgICAgICAgICAgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkuZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgcmV0dXJuIChhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAorICAgICAgICAgICAgICBjdHgsIHBlcm1pc3Npb24sIHBpZCwgYXR0cmlidXRpb25Tb3VyY2UsICIiIC8qbWVzc2FnZSovKSA9PQorICAgICAgICAgIGFuZHJvaWQuY29udGVudC5QZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1Byb3RlY3RlZFdpdGhTb3VyY2VBdHRyaWJ1dGlvbiA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICB9CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SID0gImFuZHJvaWQkYWlkbCR0ZXN0cyRwZXJtaXNzaW9uJHBsYXRmb3JtJElQcm90ZWN0ZWQiLnJlcGxhY2UoJyQnLCAnLicpOworICBAYW5kcm9pZC5hbm5vdGF0aW9uLkVuZm9yY2VQZXJtaXNzaW9uKGFsbE9mID0ge2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlZJQlJBVEV9KQorICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRXaXRoU291cmNlQXR0cmlidXRpb24oYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNTAwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhLmQKQEAgLTAsMCArMSwzIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1wbGF0Zm9ybS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vcGxhdGZvcm0vSVByb3RlY3RlZC5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9wbGF0Zm9ybS9JUHJvdGVjdGVkLmFpZGwgXAorICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXBsYXRmb3JtLWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQXJyYXlPZkludGVyZmFjZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0YjFmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLnJzCkBAIC0wLDAgKzEsMzk0IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgQXJyYXlPZkludGVyZmFjZXMgeworfQoraW1wbCBEZWZhdWx0IGZvciBBcnJheU9mSW50ZXJmYWNlcyB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBBcnJheU9mSW50ZXJmYWNlcyB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KK30KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEFycmF5T2ZJbnRlcmZhY2VzKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQXJyYXlPZkludGVyZmFjZXMpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEFycmF5T2ZJbnRlcmZhY2VzIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzIiB9Cit9CitwdWIgbW9kIElFbXB0eUludGVyZmFjZSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCisgICNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOworICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CisgIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgeworICAgIElFbXB0eUludGVyZmFjZVsiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSJdIHsKKyAgICAgIG5hdGl2ZTogQm5FbXB0eUludGVyZmFjZShvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBFbXB0eUludGVyZmFjZSB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElFbXB0eUludGVyZmFjZUFzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiIH0KKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYpIC0+IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElFbXB0eUludGVyZmFjZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiIH0KKyAgfQorICAjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgIGltcGwgQm5FbXB0eUludGVyZmFjZSB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUVtcHR5SW50ZXJmYWNlPgorICAgIHdoZXJlCisgICAgICBUOiBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElFbXB0eUludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgIH0KKyAgcHViIG1vZCB0cmFuc2FjdGlvbnMgeworICB9CisgIHB1YiB0eXBlIElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElFbXB0eUludGVyZmFjZURlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwRW1wdHlJbnRlcmZhY2UgeworICB9CisgIGltcGwgSUVtcHR5SW50ZXJmYWNlIGZvciBCcEVtcHR5SW50ZXJmYWNlIHsKKyAgfQorICBpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJRW1wdHlJbnRlcmZhY2VBc3luYzxQPiBmb3IgQnBFbXB0eUludGVyZmFjZSB7CisgIH0KKyAgaW1wbCBJRW1wdHlJbnRlcmZhY2UgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbkVtcHR5SW50ZXJmYWNlPiB7CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJRW1wdHlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgSU15SW50ZXJmYWNlIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSU15SW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwudGVzdHMuQXJyYXlPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIl0geworICAgICAgbmF0aXZlOiBCbk15SW50ZXJmYWNlKG9uX3RyYW5zYWN0KSwKKyAgICAgIHByb3h5OiBCcE15SW50ZXJmYWNlIHsKKyAgICAgIH0sCisgICAgICBhc3luYzogSU15SW50ZXJmYWNlQXN5bmMsCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2U6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkFycmF5T2ZJbnRlcmZhY2VzLklNeUludGVyZmFjZSIgfQorICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2FycmF5X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9hcnJheV9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PjsKKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElNeUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElNeUludGVyZmFjZURlZmF1bHRSZWYpIC0+IElNeUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlczwnYT4oJidhIHNlbGYsIF9hcmdfaWZhY2U6ICYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICYnYSBbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJidhIG11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICYnYSBtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+Pj47CisgIH0KKyAgI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KKyAgcHViIHRyYWl0IElNeUludGVyZmFjZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBhc3luYyBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj47CisgIH0KKyAgaW1wbCBCbk15SW50ZXJmYWNlIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICAgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJTXlJbnRlcmZhY2U+CisgICAgd2hlcmUKKyAgICAgIFQ6IElNeUludGVyZmFjZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgICBfaW5uZXI6IFQsCisgICAgICAgIF9ydDogUiwKKyAgICAgIH0KKyAgICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICAgIH0KKyAgICAgIGltcGw8VCwgUj4gSU15SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgICB3aGVyZQorICAgICAgICBUOiBJTXlJbnRlcmZhY2VBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgeworICAgICAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfYXJyYXlfaW4sIF9hcmdfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IG1ldGhvZFdpdGhJbnRlcmZhY2VzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgfQorICBwdWIgdHlwZSBJTXlJbnRlcmZhY2VEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJTXlJbnRlcmZhY2VEZWZhdWx0Pj47CisgIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CisgIGxhenlfc3RhdGljISB7CisgICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SU15SW50ZXJmYWNlRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CisgIH0KKyAgaW1wbCBCcE15SW50ZXJmYWNlIHsKKyAgICBmbiBidWlsZF9wYXJjZWxfbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZSk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX251bGxhYmxlX2lmYWNlKT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pZmFjZV9hcnJheV9pbik/OworICAgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX2lmYWNlX2FycmF5X291dCkpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lmYWNlX2FycmF5X2lub3V0KT87CisgICAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4pPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LmFzX2RlcmVmKCkpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KT87CisgICAgICBPayhhaWRsX2RhdGEpCisgICAgfQorICAgIGZuIHJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfYXJyYXlfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2FycmF5X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU15SW50ZXJmYWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5tZXRob2RXaXRoSW50ZXJmYWNlcyhfYXJnX2lmYWNlLCBfYXJnX251bGxhYmxlX2lmYWNlLCBfYXJnX2lmYWNlX2FycmF5X2luLCBfYXJnX2lmYWNlX2FycmF5X291dCwgX2FyZ19pZmFjZV9hcnJheV9pbm91dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX2lmYWNlX2FycmF5X291dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgIH0KKyAgaW1wbCBJTXlJbnRlcmZhY2UgZm9yIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2FycmF5X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9hcnJheV9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX21ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfYXJyYXlfaW4sIF9hcmdfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9hcnJheV9pbiwgX2FyZ19pZmFjZV9hcnJheV9vdXQsIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXBseSkKKyAgICB9CisgIH0KKyAgaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSU15SW50ZXJmYWNlQXN5bmM8UD4gZm9yIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzPCdhPigmJ2Egc2VsZiwgX2FyZ19pZmFjZTogJidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJidhIFtiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmJ2EgbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJidhIG11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+PiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX21ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfYXJyYXlfaW4sIF9hcmdfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX2lmYWNlX2FycmF5X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luLCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9hcnJheV9pbiwgX2FyZ19pZmFjZV9hcnJheV9vdXQsIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0LCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElNeUludGVyZmFjZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuTXlJbnRlcmZhY2U+IHsKKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9hcnJheV9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9hcnJheV9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geyBzZWxmLjAubWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9hcnJheV9pbiwgX2FyZ19pZmFjZV9hcnJheV9vdXQsIF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJTXlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pZmFjZTogYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19pZmFjZV9hcnJheV9pbjogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX2lmYWNlX2FycmF5X291dDogVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBfYWlkbF9kYXRhLnJlc2l6ZV9vdXRfdmVjKCZtdXQgX2FyZ19pZmFjZV9hcnJheV9vdXQpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX2lmYWNlX2FycmF5X2lub3V0OiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQ6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBfYWlkbF9kYXRhLnJlc2l6ZV9udWxsYWJsZV9vdXRfdmVjKCZtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9vdXQpPzsKKyAgICAgICAgbGV0IG11dCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0OiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UubWV0aG9kV2l0aEludGVyZmFjZXMoJl9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UuYXNfcmVmKCksICZfYXJnX2lmYWNlX2FycmF5X2luLCAmbXV0IF9hcmdfaWZhY2VfYXJyYXlfb3V0LCAmbXV0IF9hcmdfaWZhY2VfYXJyYXlfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfaW4uYXNfZGVyZWYoKSwgJm11dCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X291dCwgJm11dCBfYXJnX251bGxhYmxlX2lmYWNlX2FycmF5X2lub3V0KTsKKyAgICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfaWZhY2VfYXJyYXlfb3V0KT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19pZmFjZV9hcnJheV9pbm91dCk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfYXJyYXlfb3V0KT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19udWxsYWJsZV9pZmFjZV9hcnJheV9pbm91dCk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICAgIH0KKyAgfQorfQorcHViIG1vZCBNeVBhcmNlbGFibGUgeworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBzdHJ1Y3QgTXlQYXJjZWxhYmxlIHsKKyAgICBwdWIgaWZhY2U6IE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sCisgICAgcHViIG51bGxhYmxlX2lmYWNlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LAorICAgIHB1YiBpZmFjZV9hcnJheTogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwKKyAgICBwdWIgbnVsbGFibGVfaWZhY2VfYXJyYXk6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgTXlQYXJjZWxhYmxlIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmIHsKKyAgICAgICAgaWZhY2U6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfaWZhY2U6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgaWZhY2VfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfaWZhY2VfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIE15UGFyY2VsYWJsZSB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgbGV0IF9fZmllbGRfcmVmID0gc2VsZi5pZmFjZS5hc19yZWYoKS5va19vcihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2lmYWNlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pZmFjZV9hcnJheSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfaWZhY2VfYXJyYXkpPzsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmlmYWNlID0gU29tZShzdWJwYXJjZWwucmVhZCgpPyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9pZmFjZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuaWZhY2VfYXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX2lmYWNlX2FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVBhcmNlbGFibGUpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKE15UGFyY2VsYWJsZSk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBNeVBhcmNlbGFibGUgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVBhcmNlbGFibGUiIH0KKyAgfQorfQorcHViIG1vZCBNeVVuaW9uIHsKKyAgI1tkZXJpdmUoRGVidWcpXQorICBwdWIgZW51bSBNeVVuaW9uIHsKKyAgICBJZmFjZShPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBOdWxsYWJsZV9pZmFjZShPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBJZmFjZV9hcnJheShWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+KSwKKyAgICBOdWxsYWJsZV9pZmFjZV9hcnJheShPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiksCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBNeVVuaW9uIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmOjpJZmFjZShEZWZhdWx0OjpkZWZhdWx0KCkpCisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBNeVVuaW9uIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBtYXRjaCBzZWxmIHsKKyAgICAgICAgU2VsZjo6SWZhY2UodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OworICAgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHYuYXNfcmVmKCkub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6TnVsbGFibGVfaWZhY2UodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OklmYWNlX2FycmF5KHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjJpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpOdWxsYWJsZV9pZmFjZV9hcnJheSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYzaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIGxldCB0YWc6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgbWF0Y2ggdGFnIHsKKyAgICAgICAgMCA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gU29tZShwYXJjZWwucmVhZCgpPyk7CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJZmFjZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMSA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpOdWxsYWJsZV9pZmFjZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMiA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJZmFjZV9hcnJheSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMyA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6TnVsbGFibGVfaWZhY2VfYXJyYXkodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIF8gPT4geworICAgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVVuaW9uKTsKKyAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVVuaW9uKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15VW5pb24geworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5BcnJheU9mSW50ZXJmYWNlcy5NeVVuaW9uIiB9CisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkFycmF5T2ZJbnRlcmZhY2VzIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTdfQXJyYXlPZkludGVyZmFjZXM7CisgcHViIHVzZSBzdXBlcjo6SUVtcHR5SW50ZXJmYWNlOjpJRW1wdHlJbnRlcmZhY2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U7CisgcHViIHVzZSBzdXBlcjo6SU15SW50ZXJmYWNlOjpJTXlJbnRlcmZhY2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xMl9JTXlJbnRlcmZhY2U7CisgcHViIHVzZSBzdXBlcjo6TXlQYXJjZWxhYmxlOjpNeVBhcmNlbGFibGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xN19BcnJheU9mSW50ZXJmYWNlc18xMl9NeVBhcmNlbGFibGU7CisgcHViIHVzZSBzdXBlcjo6TXlVbmlvbjo6TXlVbmlvbiBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE3X0FycmF5T2ZJbnRlcmZhY2VzXzdfTXlVbmlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTdkYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9BcnJheU9mSW50ZXJmYWNlcy5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0FycmF5T2ZJbnRlcmZhY2VzLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0JhY2tlbmRUeXBlLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUucnMKaW5kZXggNWQ4ZDA1OS4uN2Y0YmU1NiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQmFja2VuZFR5cGUucnMKQEAgLTEsOSArMSwxNSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07Ci1kZWNsYXJlX2JpbmRlcl9lbnVtISB7IEJhY2tlbmRUeXBlIDogaTggewotICBDUFAgPSAwLAotICBKQVZBID0gMSwKLSAgTkRLID0gMiwKLSAgUlVTVCA9IDMsCi19IH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpCYWNrZW5kVHlwZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlOyB9CitkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgIEJhY2tlbmRUeXBlIDogW2k4OyA0XSB7CisgICAgQ1BQID0gMCwKKyAgICBKQVZBID0gMSwKKyAgICBOREsgPSAyLAorICAgIFJVU1QgPSAzLAorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpCYWNrZW5kVHlwZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0ucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5ycwppbmRleCA3OTYxNTMyLi41N2M2MWVlIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9CeXRlRW51bS5ycwpAQCAtMSw4ICsxLDE0IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKLWRlY2xhcmVfYmluZGVyX2VudW0hIHsgQnl0ZUVudW0gOiBpOCB7Ci0gIEZPTyA9IDEsCi0gIEJBUiA9IDIsCi0gIEJBWiA9IDMsCi19IH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpCeXRlRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgQnl0ZUVudW0gOiBbaTg7IDNdIHsKKyAgICBGT08gPSAxLAorICAgIEJBUiA9IDIsCisgICAgQkFaID0gMywKKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6Qnl0ZUVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0ucnMKaW5kZXggZTFkYWU3ZC4uMzJhMTk0MiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvQ29uc3RhbnRFeHByZXNzaW9uRW51bS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLnJzCkBAIC0xLDE1ICsxLDIxIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKLWRlY2xhcmVfYmluZGVyX2VudW0hIHsgQ29uc3RhbnRFeHByZXNzaW9uRW51bSA6IGkzMiB7Ci0gIGRlY0ludDMyXzEgPSAxLAotICBkZWNJbnQzMl8yID0gMSwKLSAgZGVjSW50NjRfMSA9IDEsCi0gIGRlY0ludDY0XzIgPSAxLAotICBkZWNJbnQ2NF8zID0gMSwKLSAgZGVjSW50NjRfNCA9IDEsCi0gIGhleEludDMyXzEgPSAxLAotICBoZXhJbnQzMl8yID0gMSwKLSAgaGV4SW50MzJfMyA9IDEsCi0gIGhleEludDY0XzEgPSAxLAotfSB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIyX0NvbnN0YW50RXhwcmVzc2lvbkVudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgQ29uc3RhbnRFeHByZXNzaW9uRW51bSA6IFtpMzI7IDEwXSB7CisgICAgZGVjSW50MzJfMSA9IDEsCisgICAgZGVjSW50MzJfMiA9IDEsCisgICAgZGVjSW50NjRfMSA9IDEsCisgICAgZGVjSW50NjRfMiA9IDEsCisgICAgZGVjSW50NjRfMyA9IDEsCisgICAgZGVjSW50NjRfNCA9IDEsCisgICAgaGV4SW50MzJfMSA9IDEsCisgICAgaGV4SW50MzJfMiA9IDEsCisgICAgaGV4SW50MzJfMyA9IDEsCisgICAgaGV4SW50NjRfMSA9IDEsCisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkNvbnN0YW50RXhwcmVzc2lvbkVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMl9Db25zdGFudEV4cHJlc3Npb25FbnVtOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZEVudW0ucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5ycwppbmRleCAwZDQ1ZDdkLi41ZDNiMDU0IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkRW51bS5ycwpAQCAtMSw4ICsxLDE1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfZW51bTsKLWRlY2xhcmVfYmluZGVyX2VudW0hIHsgRGVwcmVjYXRlZEVudW0gOiBpMzIgewotICBBID0gMCwKLSAgQiA9IDEsCi0gIEMgPSAyLAotfSB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6RGVwcmVjYXRlZEVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9EZXByZWNhdGVkRW51bTsgfQorZGVjbGFyZV9iaW5kZXJfZW51bSEgeworICAjW2RlcHJlY2F0ZWQgPSAidGVzdCJdCisgIERlcHJlY2F0ZWRFbnVtIDogW2kzMjsgM10geworICAgIEEgPSAwLAorICAgIEIgPSAxLAorICAgIEMgPSAyLAorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpEZXByZWNhdGVkRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0RlcHJlY2F0ZWRFbnVtOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRGVwcmVjYXRlZFBhcmNlbGFibGUucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5ycwppbmRleCAxOGJhODc1Li5hMTNkZWI2IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9EZXByZWNhdGVkUGFyY2VsYWJsZS5ycwpAQCAtMSw1NSArMSwzMiBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjW2Rlcml2ZShEZWJ1ZyldCiAjW2RlcHJlY2F0ZWQgPSAidGVzdCJdCiBwdWIgc3RydWN0IERlcHJlY2F0ZWRQYXJjZWxhYmxlIHsKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpEZXByZWNhdGVkUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX0RlcHJlY2F0ZWRQYXJjZWxhYmxlOyB9CiBpbXBsIERlZmF1bHQgZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGYgewogICAgIH0KICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplIGZvciBEZXByZWNhdGVkUGFyY2VsYWJsZSB7Ci0gIGZuIHNlcmlhbGl6ZSgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbj46OnNlcmlhbGl6ZV9vcHRpb24oU29tZShzZWxmKSwgcGFyY2VsKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVBcnJheSBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUgewotICBmbiBzZXJpYWxpemVfb3B0aW9uKHRoaXM6IE9wdGlvbjwmU2VsZj4sIHBhcmNlbDogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewotICAgIGxldCB0aGlzID0gaWYgbGV0IFNvbWUodGhpcykgPSB0aGlzIHsKLSAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OwotICAgICAgdGhpcwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcGFyY2VsLndyaXRlKCYwaTMyKTsKLSAgICB9OworaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIERlcHJlY2F0ZWRQYXJjZWxhYmxlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CiAgICAgICBPaygoKSkKICAgICB9KQogICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZSBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUgewotICBmbiBkZXNlcmlhbGl6ZShwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxTZWxmPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uPjo6ZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbCkKLSAgICAgICAudHJhbnNwb3NlKCkKLSAgICAgICAudW53cmFwX29yKEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCkpCisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgT2soKCkpCisgICAgfSkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVBcnJheSBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uIGZvciBEZXByZWNhdGVkUGFyY2VsYWJsZSB7Ci0gIGZuIGRlc2VyaWFsaXplX29wdGlvbihwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U2VsZj4+IHsKLSAgICBsZXQgc3RhdHVzOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiBzdGF0dXMgPT0gMCB7IHJldHVybiBPayhOb25lKTsgfQotICAgIGxldCBzdGFydF9wb3MgPSBwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKTsKLSAgICBsZXQgcGFyY2VsYWJsZV9zaXplOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiBwYXJjZWxhYmxlX3NpemUgPCAwIHsgcmV0dXJuIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSk7IH0KLSAgICBpZiBzdGFydF9wb3MuY2hlY2tlZF9hZGQocGFyY2VsYWJsZV9zaXplKS5pc19ub25lKCkgewotICAgICAgcmV0dXJuIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSk7Ci0gICAgfQotICAgIGxldCBtdXQgcmVzdWx0ID0gU2VsZjo6ZGVmYXVsdCgpOwotICAgIHVuc2FmZSB7Ci0gICAgICBwYXJjZWwuc2V0X2RhdGFfcG9zaXRpb24oc3RhcnRfcG9zICsgcGFyY2VsYWJsZV9zaXplKT87Ci0gICAgfQotICAgIE9rKFNvbWUocmVzdWx0KSkKLSAgfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRGVwcmVjYXRlZFBhcmNlbGFibGUpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEZXByZWNhdGVkUGFyY2VsYWJsZSk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRGVwcmVjYXRlZFBhcmNlbGFibGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuRGVwcmVjYXRlZFBhcmNlbGFibGUiIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkRlcHJlY2F0ZWRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfRGVwcmVjYXRlZFBhcmNlbGFibGU7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3M2Y3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5ycwpAQCAtMCwwICsxLDIyNCBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IEZpeGVkU2l6ZSB7Cit9CitpbXBsIERlZmF1bHQgZm9yIEZpeGVkU2l6ZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBGaXhlZFNpemUgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGaXhlZFNpemUpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGaXhlZFNpemUpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEZpeGVkU2l6ZSB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUiIH0KK30KK3B1YiBtb2QgRml4ZWRQYXJjZWxhYmxlIHsKKyAgI1tkZXJpdmUoRGVidWcpXQorICBwdWIgc3RydWN0IEZpeGVkUGFyY2VsYWJsZSB7CisgICAgcHViIGJvb2xlYW5WYWx1ZTogYm9vbCwKKyAgICBwdWIgYnl0ZVZhbHVlOiBpOCwKKyAgICBwdWIgY2hhclZhbHVlOiB1MTYsCisgICAgcHViIGludFZhbHVlOiBpMzIsCisgICAgcHViIGxvbmdWYWx1ZTogaTY0LAorICAgIHB1YiBmbG9hdFZhbHVlOiBmMzIsCisgICAgcHViIGRvdWJsZVZhbHVlOiBmNjQsCisgICAgcHViIGVudW1WYWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSwKKyAgICBwdWIgcGFyY2VsYWJsZVZhbHVlOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X0ZpeGVkU2l6ZV8xMF9GaXhlZFVuaW9uLAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgRml4ZWRQYXJjZWxhYmxlIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmIHsKKyAgICAgICAgYm9vbGVhblZhbHVlOiBmYWxzZSwKKyAgICAgICAgYnl0ZVZhbHVlOiAwLAorICAgICAgICBjaGFyVmFsdWU6ICdcMCcgYXMgdTE2LAorICAgICAgICBpbnRWYWx1ZTogMCwKKyAgICAgICAgbG9uZ1ZhbHVlOiAwLAorICAgICAgICBmbG9hdFZhbHVlOiAwLjAwMDAwMGYzMiwKKyAgICAgICAgZG91YmxlVmFsdWU6IDAuMDAwMDAwZjY0LAorICAgICAgICBlbnVtVmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW06OkZPTywKKyAgICAgICAgcGFyY2VsYWJsZVZhbHVlOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICB9CisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBGaXhlZFBhcmNlbGFibGUgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ib29sZWFuVmFsdWUpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVWYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hhclZhbHVlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnRWYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ1ZhbHVlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5mbG9hdFZhbHVlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kb3VibGVWYWx1ZSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZW51bVZhbHVlKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wYXJjZWxhYmxlVmFsdWUpPzsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmJvb2xlYW5WYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuYnl0ZVZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5jaGFyVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmludFZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5sb25nVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmZsb2F0VmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmRvdWJsZVZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5lbnVtVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLnBhcmNlbGFibGVWYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRml4ZWRQYXJjZWxhYmxlKTsKKyAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGaXhlZFBhcmNlbGFibGUpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRml4ZWRQYXJjZWxhYmxlIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuRml4ZWRTaXplLkZpeGVkUGFyY2VsYWJsZSIgfQorICB9Cit9CitwdWIgbW9kIEZpeGVkVW5pb24geworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBlbnVtIEZpeGVkVW5pb24geworICAgIEJvb2xlYW5WYWx1ZShib29sKSwKKyAgICBCeXRlVmFsdWUoaTgpLAorICAgIENoYXJWYWx1ZSh1MTYpLAorICAgIEludFZhbHVlKGkzMiksCisgICAgTG9uZ1ZhbHVlKGk2NCksCisgICAgRmxvYXRWYWx1ZShmMzIpLAorICAgIERvdWJsZVZhbHVlKGY2NCksCisgICAgRW51bVZhbHVlKGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pLAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgRml4ZWRVbmlvbiB7CisgICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgICAgU2VsZjo6Qm9vbGVhblZhbHVlKGZhbHNlKQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRml4ZWRVbmlvbiB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgbWF0Y2ggc2VsZiB7CisgICAgICAgIFNlbGY6OkJvb2xlYW5WYWx1ZSh2KSA9PiB7CisgICAgICAgICAgcGFyY2VsLndyaXRlKCYwaTMyKT87CisgICAgICAgICAgcGFyY2VsLndyaXRlKHYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6Qnl0ZVZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpDaGFyVmFsdWUodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMmkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OkludFZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjNpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpMb25nVmFsdWUodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmNGkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OkZsb2F0VmFsdWUodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmNWkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OkRvdWJsZVZhbHVlKHYpID0+IHsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoJjZpMzIpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUodikKKyAgICAgICAgfQorICAgICAgICBTZWxmOjpFbnVtVmFsdWUodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmN2kzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBsZXQgdGFnOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgIG1hdGNoIHRhZyB7CisgICAgICAgIDAgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogYm9vbCA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6Qm9vbGVhblZhbHVlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICAxID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IGk4ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpCeXRlVmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDIgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogdTE2ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpDaGFyVmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDMgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJbnRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgNCA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBpNjQgPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgICAqc2VsZiA9IFNlbGY6OkxvbmdWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgNSA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBmMzIgPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgICAqc2VsZiA9IFNlbGY6OkZsb2F0VmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIDYgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogZjY0ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpEb3VibGVWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgNyA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpFbnVtVmFsdWUodmFsdWUpOworICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgICAgIF8gPT4geworICAgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGaXhlZFVuaW9uKTsKKyAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShGaXhlZFVuaW9uKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIEZpeGVkVW5pb24geworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5GaXhlZFNpemUuRml4ZWRVbmlvbiIgfQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpGaXhlZFNpemUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X0ZpeGVkU2l6ZTsKKyBwdWIgdXNlIHN1cGVyOjpGaXhlZFBhcmNlbGFibGU6OkZpeGVkUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfRml4ZWRTaXplXzE1X0ZpeGVkUGFyY2VsYWJsZTsKKyBwdWIgdXNlIHN1cGVyOjpGaXhlZFVuaW9uOjpGaXhlZFVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9GaXhlZFNpemVfMTBfRml4ZWRVbmlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvRml4ZWRTaXplLnJzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzNWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ZpeGVkU2l6ZS5ycy5kCkBAIC0wLDAgKzEsMyBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9GaXhlZFNpemUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUucnMKaW5kZXggMjRmY2Q5OS4uMjcyOWY1MSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0dlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5ycwpAQCAtMSw5ICsxLDEwIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnKV0KIHB1YiBzdHJ1Y3QgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKICAgcHViIGE6IGkzMiwKICAgcHViIGI6IGkzMiwKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yN19HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU7IH0KIGltcGwgRGVmYXVsdCBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGYgewpAQCAtMTIsNTcgKzEzLDMxIEBACiAgICAgfQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci0gIGZuIHNlcmlhbGl6ZSgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbj46OnNlcmlhbGl6ZV9vcHRpb24oU29tZShzZWxmKSwgcGFyY2VsKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVBcnJheSBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVPcHRpb24gZm9yIEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci0gIGZuIHNlcmlhbGl6ZV9vcHRpb24odGhpczogT3B0aW9uPCZTZWxmPiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMgewotICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87Ci0gICAgICB0aGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpOwotICAgIH07CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5hKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYik/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0pCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplIGZvciBHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgewotICBmbiBkZXNlcmlhbGl6ZShwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxTZWxmPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uPjo6ZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbCkKLSAgICAgICAudHJhbnNwb3NlKCkKLSAgICAgICAudW53cmFwX29yKEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVORVhQRUNURURfTlVMTCkpCi0gIH0KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSk7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkdlbmVyaWNTdHJ1Y3R1cmVkUGFyY2VsYWJsZSIgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVBcnJheSBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9Ci0gICAgbGV0IHN0YXJ0X3BvcyA9IHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpOwotICAgIGxldCBwYXJjZWxhYmxlX3NpemU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHBhcmNlbGFibGVfc2l6ZSA8IDAgeyByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsgfQotICAgIGlmIHN0YXJ0X3Bvcy5jaGVja2VkX2FkZChwYXJjZWxhYmxlX3NpemUpLmlzX25vbmUoKSB7Ci0gICAgICByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsKLSAgICB9Ci0gICAgbGV0IG11dCByZXN1bHQgPSBTZWxmOjpkZWZhdWx0KCk7Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5hID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5iID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgdW5zYWZlIHsKLSAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbihzdGFydF9wb3MgKyBwYXJjZWxhYmxlX3NpemUpPzsKLSAgICB9Ci0gICAgT2soU29tZShyZXN1bHQpKQotICB9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpHZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yN19HZW5lcmljU3RydWN0dXJlZFBhcmNlbGFibGU7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JRGVwcmVjYXRlZC5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLnJzCmluZGV4IDU5MjA2NTQuLjU5OWE2NTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lEZXByZWNhdGVkLnJzCkBAIC0xLDEyICsxLDE1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQotI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OklCaW5kZXJJbnRlcm5hbDsKKyNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOwogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlOwogZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CiAgIElEZXByZWNhdGVkWyJhbmRyb2lkLmFpZGwudGVzdHMuSURlcHJlY2F0ZWQiXSB7CiAgICAgbmF0aXZlOiBCbkRlcHJlY2F0ZWQob25fdHJhbnNhY3QpLAogICAgIHByb3h5OiBCcERlcHJlY2F0ZWQgewogICAgIH0sCisgICAgYXN5bmM6IElEZXByZWNhdGVkQXN5bmMsCiAgIH0KIH0KICNbZGVwcmVjYXRlZCA9ICJ0ZXN0Il0KQEAgLTE5LDYgKzIyLDQwIEBACiAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKICAgfQogfQorI1tkZXByZWNhdGVkID0gInRlc3QiXQorcHViIHRyYWl0IElEZXByZWNhdGVkQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JRGVwcmVjYXRlZCIgfQorfQorI1tkZXByZWNhdGVkID0gInRlc3QiXQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJRGVwcmVjYXRlZEFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSURlcHJlY2F0ZWQiIH0KK30KK2ltcGwgQm5EZXByZWNhdGVkIHsKKyAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElEZXByZWNhdGVkPgorICB3aGVyZQorICAgIFQ6IElEZXByZWNhdGVkQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgIHsKKyAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICBfaW5uZXI6IFQsCisgICAgICBfcnQ6IFIsCisgICAgfQorICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgIH0KKyAgICBpbXBsPFQsIFI+IElEZXByZWNhdGVkIGZvciBXcmFwcGVyPFQsIFI+CisgICAgd2hlcmUKKyAgICAgIFQ6IElEZXByZWNhdGVkQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQogcHViIHRyYWl0IElEZXByZWNhdGVkRGVmYXVsdDogU2VuZCArIFN5bmMgewogfQogcHViIG1vZCB0cmFuc2FjdGlvbnMgewpAQCAtMjgsMTMgKzY1LDE5IEBACiBsYXp5X3N0YXRpYyEgewogICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJRGVwcmVjYXRlZERlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOwogfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OklEZXByZWNhdGVkIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfSURlcHJlY2F0ZWQ7IH0KK2ltcGwgQnBEZXByZWNhdGVkIHsKK30KIGltcGwgSURlcHJlY2F0ZWQgZm9yIEJwRGVwcmVjYXRlZCB7CiB9Ci1pbXBsIElEZXByZWNhdGVkIGZvciBiaW5kZXI6OkJpbmRlcjxCbkRlcHJlY2F0ZWQ+IHsKK2ltcGw8UDogYmluZGVyOjpCaW5kZXJBc3luY1Bvb2w+IElEZXByZWNhdGVkQXN5bmM8UD4gZm9yIEJwRGVwcmVjYXRlZCB7CiB9Ci1mbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElEZXByZWNhdGVkLCBfYWlkbF9jb2RlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwsIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CitpbXBsIElEZXByZWNhdGVkIGZvciBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXI8Qm5EZXByZWNhdGVkPiB7Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElEZXByZWNhdGVkLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgIG1hdGNoIF9haWRsX2NvZGUgewogICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKICAgfQogfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SURlcHJlY2F0ZWQgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9JRGVwcmVjYXRlZDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOYW1lZENhbGxiYWNrLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2sucnMKaW5kZXggZjhkMWZiYS4uNDlhZTU4NCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2sucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU5hbWVkQ2FsbGJhY2sucnMKQEAgLTEsMTcgKzEsMjAgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCi0jW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6SUJpbmRlckludGVybmFsOworI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CiBkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKICAgSU5hbWVkQ2FsbGJhY2tbImFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayJdIHsKICAgICBuYXRpdmU6IEJuTmFtZWRDYWxsYmFjayhvbl90cmFuc2FjdCksCiAgICAgcHJveHk6IEJwTmFtZWRDYWxsYmFjayB7CiAgICAgfSwKKyAgICBhc3luYzogSU5hbWVkQ2FsbGJhY2tBc3luYywKICAgfQogfQogcHViIHRyYWl0IElOYW1lZENhbGxiYWNrOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgewogICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSU5hbWVkQ2FsbGJhY2siIH0KLSAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPjsKKyAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJTmFtZWRDYWxsYmFja0RlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgewogICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQogICB9CkBAIC0xOSwyNSArMjIsNjIgQEAKICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQogICB9CiB9CitwdWIgdHJhaXQgSU5hbWVkQ2FsbGJhY2tBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklOYW1lZENhbGxiYWNrIiB9CisgIGZuIEdldE5hbWU8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj47Cit9CisjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorcHViIHRyYWl0IElOYW1lZENhbGxiYWNrQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjayIgfQorICBhc3luYyBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OworfQoraW1wbCBCbk5hbWVkQ2FsbGJhY2sgeworICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s+CisgIHdoZXJlCisgICAgVDogSU5hbWVkQ2FsbGJhY2tBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgeworICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgIF9pbm5lcjogVCwKKyAgICAgIF9ydDogUiwKKyAgICB9CisgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgfQorICAgIGltcGw8VCwgUj4gSU5hbWVkQ2FsbGJhY2sgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICB3aGVyZQorICAgICAgVDogSU5hbWVkQ2FsbGJhY2tBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0TmFtZSgpKQorICAgICAgfQorICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQogcHViIHRyYWl0IElOYW1lZENhbGxiYWNrRGVmYXVsdDogU2VuZCArIFN5bmMgewotICBmbiBHZXROYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsKKyAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KIH0KIHB1YiBtb2QgdHJhbnNhY3Rpb25zIHsKLSAgcHViIGNvbnN0IEdldE5hbWU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IEdldE5hbWU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOwogfQogcHViIHR5cGUgSU5hbWVkQ2FsbGJhY2tEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJTmFtZWRDYWxsYmFja0RlZmF1bHQ+PjsKIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CiBsYXp5X3N0YXRpYyEgewogICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJTmFtZWRDYWxsYmFja0RlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOwogfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OklOYW1lZENhbGxiYWNrIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s7IH0KLWltcGwgSU5hbWVkQ2FsbGJhY2sgZm9yIEJwTmFtZWRDYWxsYmFjayB7Ci0gIGZuIEdldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TmFtZSwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKK2ltcGwgQnBOYW1lZENhbGxiYWNrIHsKKyAgZm4gYnVpbGRfcGFyY2VsX0dldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXROYW1lKCZzZWxmLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJTmFtZWRDYWxsYmFjaz46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldE5hbWUoKTsKQEAgLTUwLDEwICs5MCwzMiBAQAogICAgIE9rKF9haWRsX3JldHVybikKICAgfQogfQotaW1wbCBJTmFtZWRDYWxsYmFjayBmb3IgYmluZGVyOjpCaW5kZXI8Qm5OYW1lZENhbGxiYWNrPiB7Ci0gIGZuIEdldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geyBzZWxmLjAuR2V0TmFtZSgpIH0KK2ltcGwgSU5hbWVkQ2FsbGJhY2sgZm9yIEJwTmFtZWRDYWxsYmFjayB7CisgIGZuIEdldE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfR2V0TmFtZSgpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXROYW1lLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROYW1lKF9haWRsX3JlcGx5KQorICB9CiB9Ci1mbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElOYW1lZENhbGxiYWNrLCBfYWlkbF9jb2RlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwsIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CitpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJTmFtZWRDYWxsYmFja0FzeW5jPFA+IGZvciBCcE5hbWVkQ2FsbGJhY2sgeworICBmbiBHZXROYW1lPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldE5hbWUoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXROYW1lLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0TmFtZShfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KK30KK2ltcGwgSU5hbWVkQ2FsbGJhY2sgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCbk5hbWVkQ2FsbGJhY2s+IHsKKyAgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7IHNlbGYuMC5HZXROYW1lKCkgfQorfQorZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJTmFtZWRDYWxsYmFjaywgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICBtYXRjaCBfYWlkbF9jb2RlIHsKICAgICB0cmFuc2FjdGlvbnM6OkdldE5hbWUgPT4gewogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuR2V0TmFtZSgpOwpAQCAtNjksMyArMTMxLDYgQEAKICAgICBfID0+IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pCiAgIH0KIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OklOYW1lZENhbGxiYWNrIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JTmV3TmFtZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLnJzCmluZGV4IDcwYjZiZDEuLmY4MDAzYjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lOZXdOYW1lLnJzCkBAIC0xLDE3ICsxLDIwIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQotI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OklCaW5kZXJJbnRlcm5hbDsKKyNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOwogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlOwogZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CiAgIElOZXdOYW1lWyJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiXSB7CiAgICAgbmF0aXZlOiBCbk5ld05hbWUob25fdHJhbnNhY3QpLAogICAgIHByb3h5OiBCcE5ld05hbWUgewogICAgIH0sCisgICAgYXN5bmM6IElOZXdOYW1lQXN5bmMsCiAgIH0KIH0KIHB1YiB0cmFpdCBJTmV3TmFtZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIiB9Ci0gIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+OworICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJTmV3TmFtZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgewogICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQogICB9CkBAIC0xOSwyNSArMjIsNjIgQEAKICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQogICB9CiB9CitwdWIgdHJhaXQgSU5ld05hbWVBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIiB9CisgIGZuIFJlYWxOYW1lPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+OworfQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJTmV3TmFtZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSU9sZE5hbWUiIH0KKyAgYXN5bmMgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz47Cit9CitpbXBsIEJuTmV3TmFtZSB7CisgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJTmV3TmFtZT4KKyAgd2hlcmUKKyAgICBUOiBJTmV3TmFtZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICB7CisgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgX2lubmVyOiBULAorICAgICAgX3J0OiBSLAorICAgIH0KKyAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICB9CisgICAgaW1wbDxULCBSPiBJTmV3TmFtZSBmb3IgV3JhcHBlcjxULCBSPgorICAgIHdoZXJlCisgICAgICBUOiBJTmV3TmFtZUFzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVhbE5hbWUoKSkKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9OworICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgIH0KK30KIHB1YiB0cmFpdCBJTmV3TmFtZURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKLSAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4geworICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KIH0KIHB1YiBtb2QgdHJhbnNhY3Rpb25zIHsKLSAgcHViIGNvbnN0IFJlYWxOYW1lOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CisgIHB1YiBjb25zdCBSZWFsTmFtZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CiB9CiBwdWIgdHlwZSBJTmV3TmFtZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElOZXdOYW1lRGVmYXVsdD4+OwogdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKIGxhenlfc3RhdGljISB7CiAgIHN0YXRpYyByZWYgREVGQVVMVF9JTVBMOiBzdGQ6OnN5bmM6Ok11dGV4PElOZXdOYW1lRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6SU5ld05hbWUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lOyB9Ci1pbXBsIElOZXdOYW1lIGZvciBCcE5ld05hbWUgewotICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZWFsTmFtZSwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKK2ltcGwgQnBOZXdOYW1lIHsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVhbE5hbWUoJnNlbGYsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElOZXdOYW1lPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVhbE5hbWUoKTsKQEAgLTUwLDEwICs5MCwzMiBAQAogICAgIE9rKF9haWRsX3JldHVybikKICAgfQogfQotaW1wbCBJTmV3TmFtZSBmb3IgYmluZGVyOjpCaW5kZXI8Qm5OZXdOYW1lPiB7Ci0gIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlYWxOYW1lKCkgfQoraW1wbCBJTmV3TmFtZSBmb3IgQnBOZXdOYW1lIHsKKyAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVhbE5hbWUoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVhbE5hbWUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlYWxOYW1lKF9haWRsX3JlcGx5KQorICB9CiB9Ci1mbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElOZXdOYW1lLCBfYWlkbF9jb2RlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwsIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CitpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJTmV3TmFtZUFzeW5jPFA+IGZvciBCcE5ld05hbWUgeworICBmbiBSZWFsTmFtZTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZWFsTmFtZSgpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlYWxOYW1lLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVhbE5hbWUoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9Cit9CitpbXBsIElOZXdOYW1lIGZvciBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXI8Qm5OZXdOYW1lPiB7CisgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlYWxOYW1lKCkgfQorfQorZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJTmV3TmFtZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICBtYXRjaCBfYWlkbF9jb2RlIHsKICAgICB0cmFuc2FjdGlvbnM6OlJlYWxOYW1lID0+IHsKICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlYWxOYW1lKCk7CkBAIC02OSwzICsxMzEsNiBAQAogICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKICAgfQogfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SU5ld05hbWUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5ycwppbmRleCBhNjFkNjY0Li5lMTBiZjkyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JT2xkTmFtZS5ycwpAQCAtMSwxNyArMSwyMCBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjIVthbGxvdyhub25fdXBwZXJfY2FzZV9nbG9iYWxzKV0KICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KLSNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpJQmluZGVySW50ZXJuYWw7CisjW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6YmluZGVyX2ltcGw6OklCaW5kZXJJbnRlcm5hbDsKIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgewogICBJT2xkTmFtZVsiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIl0gewogICAgIG5hdGl2ZTogQm5PbGROYW1lKG9uX3RyYW5zYWN0KSwKICAgICBwcm94eTogQnBPbGROYW1lIHsKICAgICB9LAorICAgIGFzeW5jOiBJT2xkTmFtZUFzeW5jLAogICB9CiB9CiBwdWIgdHJhaXQgSU9sZE5hbWU6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CiAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSIgfQotICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPjsKKyAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz47CiAgIGZuIGdldERlZmF1bHRJbXBsKCkgLT4gSU9sZE5hbWVEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKICAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKICAgfQpAQCAtMTksMjUgKzIyLDYyIEBACiAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKICAgfQogfQorcHViIHRyYWl0IElPbGROYW1lQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JT2xkTmFtZSIgfQorICBmbiBSZWFsTmFtZTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PjsKK30KKyNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCitwdWIgdHJhaXQgSU9sZE5hbWVBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklPbGROYW1lIiB9CisgIGFzeW5jIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OworfQoraW1wbCBCbk9sZE5hbWUgeworICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSU9sZE5hbWU+CisgIHdoZXJlCisgICAgVDogSU9sZE5hbWVBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgeworICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgIF9pbm5lcjogVCwKKyAgICAgIF9ydDogUiwKKyAgICB9CisgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgfQorICAgIGltcGw8VCwgUj4gSU9sZE5hbWUgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICB3aGVyZQorICAgICAgVDogSU9sZE5hbWVBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlYWxOYW1lKCkpCisgICAgICB9CisgICAgfQorICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICB9Cit9CiBwdWIgdHJhaXQgSU9sZE5hbWVEZWZhdWx0OiBTZW5kICsgU3luYyB7Ci0gIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsKKyAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9CiB9CiBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7Ci0gIHB1YiBjb25zdCBSZWFsTmFtZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBwdWIgY29uc3QgUmVhbE5hbWU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOwogfQogcHViIHR5cGUgSU9sZE5hbWVEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJT2xkTmFtZURlZmF1bHQ+PjsKIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CiBsYXp5X3N0YXRpYyEgewogICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJT2xkTmFtZURlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOwogfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OklPbGROYW1lIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZTsgfQotaW1wbCBJT2xkTmFtZSBmb3IgQnBPbGROYW1lIHsKLSAgZm4gUmVhbE5hbWUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVhbE5hbWUsIGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgT2soKCkpCi0gICAgfSk7CitpbXBsIEJwT2xkTmFtZSB7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlYWxOYW1lKCZzZWxmLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJT2xkTmFtZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlYWxOYW1lKCk7CkBAIC01MCwxMCArOTAsMzIgQEAKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KIH0KLWltcGwgSU9sZE5hbWUgZm9yIGJpbmRlcjo6QmluZGVyPEJuT2xkTmFtZT4gewotICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7IHNlbGYuMC5SZWFsTmFtZSgpIH0KK2ltcGwgSU9sZE5hbWUgZm9yIEJwT2xkTmFtZSB7CisgIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlYWxOYW1lKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlYWxOYW1lLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZWFsTmFtZShfYWlkbF9yZXBseSkKKyAgfQogfQotZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJT2xkTmFtZSwgX2FpZGxfY29kZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsLCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSU9sZE5hbWVBc3luYzxQPiBmb3IgQnBPbGROYW1lIHsKKyAgZm4gUmVhbE5hbWU8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVhbE5hbWUoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZWFsTmFtZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlYWxOYW1lKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorfQoraW1wbCBJT2xkTmFtZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuT2xkTmFtZT4geworICBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7IHNlbGYuMC5SZWFsTmFtZSgpIH0KK30KK2ZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSU9sZE5hbWUsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKICAgbWF0Y2ggX2FpZGxfY29kZSB7CiAgICAgdHJhbnNhY3Rpb25zOjpSZWFsTmFtZSA9PiB7CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZWFsTmFtZSgpOwpAQCAtNjksMyArMTMxLDYgQEAKICAgICBfID0+IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pCiAgIH0KIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OklPbGROYW1lIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycwppbmRleCAyZTM0ZGJhLi45ZThmZDkyIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSVRlc3RTZXJ2aWNlLnJzCkBAIC0xLDY4ICsxLDg1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQogIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQotI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OklCaW5kZXJJbnRlcm5hbDsKKyNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOwogdXNlIGJpbmRlcjo6ZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlOwogZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CiAgIElUZXN0U2VydmljZVsiYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZSJdIHsKICAgICBuYXRpdmU6IEJuVGVzdFNlcnZpY2Uob25fdHJhbnNhY3QpLAogICAgIHByb3h5OiBCcFRlc3RTZXJ2aWNlIHsKICAgICB9LAorICAgIGFzeW5jOiBJVGVzdFNlcnZpY2VBc3luYywKICAgfQogfQogcHViIHRyYWl0IElUZXN0U2VydmljZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZSIgfQotICBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpMzI+OworICBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+OwogICAjW2RlcHJlY2F0ZWQgPSAidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIl0KLSAgZm4gRGVwcmVjYXRlZCgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+OwotICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT47Ci0gIGZuIFJlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJvb2w+OwotICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTg+OwotICBmbiBSZXBlYXRDaGFyKCZzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PHUxNj47Ci0gIGZuIFJlcGVhdEludCgmc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpMzI+OwotICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGk2ND47Ci0gIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGYzMj47Ci0gIGZuIFJlcGVhdERvdWJsZSgmc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxmNjQ+OwotICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz47Ci0gIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPjsKLSAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+OwotICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT47Ci0gIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGJvb2w+PjsKLSAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1OD4+OwotICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8dTE2Pj47Ci0gIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGkzMj4+OwotICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTY0Pj47Ci0gIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjMyPj47Ci0gIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGY2ND4+OwotICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PjsKLSAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PjsKLSAgZm4gUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+OwotICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+OwotICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKCZzZWxmLCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+OwotICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJvb2w+OwotICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8U3RyaW5nPj47Ci0gIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj47Ci0gIGZuIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+OwotICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT47Ci0gIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGkzMj4+PjsKLSAgZm4gUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+PjsKLSAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PjsKLSAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+PjsKLSAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+OwotICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj47Ci0gIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4+OwotICBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogJmJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT47Ci0gIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPjsKLSAgZm4gUmVwZWF0VXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPjsKLSAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PjsKLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+OwotICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKLSAgZm4gR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj47Ci0gIGZuIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19wYXJjZWw6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGUpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPjsKLSAgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+PjsKLSAgZm4gR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+PjsKLSAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PjsKLSAgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPjsKKyAgZm4gRGVwcmVjYXRlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIFJlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8aTg+OworICBmbiBSZXBlYXRDaGFyKCZzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj47CisgIGZuIFJlcGVhdEludCgmc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+OworICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGk2ND47CisgIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGYzMj47CisgIGZuIFJlcGVhdERvdWJsZSgmc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+OworICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz47CisgIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPjsKKyAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+OworICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT47CisgIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PjsKKyAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+OworICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj47CisgIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGkzMj4+OworICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTY0Pj47CisgIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjMyPj47CisgIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGY2ND4+OworICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PjsKKyAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PjsKKyAgZm4gUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+OworICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+OworICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKCZzZWxmLCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+OworICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBmbiBHZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+OworICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPjsKKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj47CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPjsKKyAgZm4gR2V0SW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj47CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPjsKKyAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+OworICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmc2VsZiwgX2FyZ19yZWFkOiAmYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj47CisgIGZuIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3JdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+OworICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGkzMj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+OworICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+OworICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+OworICBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogJmJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gUmVwZWF0VXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKKyAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PjsKKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+OworICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKKyAgZm4gR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj47CisgIGZuIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19wYXJjZWw6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfZXA6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3Q+OworICBmbiBSZXZlcnNlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+OworICBmbiBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4+OworICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+OworICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+OworICBmbiBHZXRDcHBKYXZhVGVzdHMoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+OworICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+OwogICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElUZXN0U2VydmljZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgewogICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQogICB9CkBAIC03MCwyMTMgKzg3LDYyOCBAQAogICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCiAgIH0KIH0KK3B1YiB0cmFpdCBJVGVzdFNlcnZpY2VBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZSIgfQorICBmbiBVbmltcGxlbWVudGVkTWV0aG9kPCdhPigmJ2Egc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGkzMj4+OworICAjW2RlcHJlY2F0ZWQgPSAidG8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIGluIHN5c3RlbS90b29scy9haWRsIHdoaWNoIGRvZXMgYSBjb21waWxlIGNoZWNrIG9mIGRlcHJlY2F0ZWQgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIHJlZmxlY3RlZCBpbiBnb2xkZW5zIl0KKyAgZm4gRGVwcmVjYXRlZDwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBzdGQ6OmZ1dHVyZTo6UmVhZHk8YmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gUmVwZWF0Qm9vbGVhbjwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxib29sPj47CisgIGZuIFJlcGVhdEJ5dGU8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGk4Pj47CisgIGZuIFJlcGVhdENoYXI8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDx1MTY+PjsKKyAgZm4gUmVwZWF0SW50PCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8aTMyPj47CisgIGZuIFJlcGVhdExvbmc8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpNjQ+PjsKKyAgZm4gUmVwZWF0RmxvYXQ8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxmMzI+PjsKKyAgZm4gUmVwZWF0RG91YmxlPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8ZjY0Pj47CisgIGZuIFJlcGVhdFN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46ICYnYSBzdHIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PjsKKyAgZm4gUmVwZWF0Qnl0ZUVudW08J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+OworICBmbiBSZXBlYXRJbnRFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj47CisgIGZuIFJlcGVhdExvbmdFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+PjsKKyAgZm4gUmV2ZXJzZUJvb2xlYW48J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxib29sPj4+OworICBmbiBSZXZlcnNlQnl0ZTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbdThdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8dTg+Pj47CisgIGZuIFJldmVyc2VDaGFyPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPHUxNj4+PjsKKyAgZm4gUmV2ZXJzZUludDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbaTMyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxpMzI+Pj47CisgIGZuIFJldmVyc2VMb25nPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtpNjRdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGk2ND4+PjsKKyAgZm4gUmV2ZXJzZUZsb2F0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtmMzJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGYzMj4+PjsKKyAgZm4gUmV2ZXJzZURvdWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbZjY0XSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxmNjQ+Pj47CisgIGZuIFJldmVyc2VTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4+OworICBmbiBSZXZlcnNlQnl0ZUVudW08J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+OworICBmbiBSZXZlcnNlSW50RW51bTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj47CisgIGZuIFJldmVyc2VMb25nRW51bTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj47CisgIGZuIEdldE90aGVyVGVzdFNlcnZpY2U8J2E+KCYnYSBzZWxmLCBfYXJnX25hbWU6ICYnYSBzdHIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj47CisgIGZuIFZlcmlmeU5hbWU8J2E+KCYnYSBzZWxmLCBfYXJnX3NlcnZpY2U6ICYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICYnYSBzdHIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxib29sPj47CisgIGZuIEdldEludGVyZmFjZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19uYW1lczogJidhIFtTdHJpbmddKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj47CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19zZXJ2aWNlczogJidhIFtiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJidhIFtTdHJpbmddKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+OworICBmbiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+PjsKKyAgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+OworICBmbiBHZXRJbnRlcmZhY2VMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+PjsKKyAgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+OworICBmbiBSZXZlcnNlU3RyaW5nTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+Pj47CisgIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yPCdhPigmJ2Egc2VsZiwgX2FyZ19yZWFkOiAmJ2EgYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PjsKKyAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2JpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3JdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+Pj47CisgIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbjwnYT4oJidhIHNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW2kzMl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4+OworICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4+OworICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj4+OworICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4+OworICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2Egc3RyPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj47CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+PjsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+Pj47CisgIGZuIFRha2VzQW5JQmluZGVyPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIGJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBUYWtlc0FuSUJpbmRlckxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2JpbmRlcjo6U3BJQmluZGVyXSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj47CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogJidhIHN0cikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+OworICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JidhIHN0cj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4+OworICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+Pj47CisgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4+OworICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4+OworICBmbiBHZXRDYWxsYmFjazwnYT4oJidhIHNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+PjsKKyAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlPCdhPigmJ2Egc2VsZiwgX2FyZ19wYXJjZWw6ICYnYSBtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGUpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfZXA6ICYnYSBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICYnYSBtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBSZXZlcnNlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfbGlzdDogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0Pj47CisgIGZuIFJldmVyc2VJQmluZGVyQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTcElCaW5kZXI+Pj47CisgIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+Pj47CisgIGZuIEdldE9sZE5hbWVJbnRlcmZhY2U8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+Pj47CisgIGZuIEdldE5ld05hbWVJbnRlcmZhY2U8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+Pj47CisgIGZuIEdldENwcEphdmFUZXN0czwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj47CisgIGZuIGdldEJhY2tlbmRUeXBlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPj47Cit9CisjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorcHViIHRyYWl0IElUZXN0U2VydmljZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlIiB9CisgIGFzeW5jIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47CisgICNbZGVwcmVjYXRlZCA9ICJ0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgaW4gc3lzdGVtL3Rvb2xzL2FpZGwgd2hpY2ggZG9lcyBhIGNvbXBpbGUgY2hlY2sgb2YgZGVwcmVjYXRlZCBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgcmVmbGVjdGVkIGluIGdvbGRlbnMiXQorICBhc3luYyBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGFzeW5jIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD47CisgIGFzeW5jIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OlJlc3VsdDxpOD47CisgIGFzeW5jIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpSZXN1bHQ8dTE2PjsKKyAgYXN5bmMgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj47CisgIGFzeW5jIGZuIFJlcGVhdExvbmcoJnNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PjsKKyAgYXN5bmMgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPjsKKyAgYXN5bmMgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGY2ND47CisgIGFzeW5jIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPjsKKyAgYXN5bmMgZm4gUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+OworICBhc3luYyBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT47CisgIGFzeW5jIGZuIFJlcGVhdExvbmdFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPjsKKyAgYXN5bmMgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+OworICBhc3luYyBmbiBSZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj47CisgIGFzeW5jIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1MTY+PjsKKyAgYXN5bmMgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj47CisgIGFzeW5jIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+PjsKKyAgYXN5bmMgZm4gUmV2ZXJzZUZsb2F0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+PjsKKyAgYXN5bmMgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj47CisgIGFzeW5jIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+OworICBhc3luYyBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+OworICBhc3luYyBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj47CisgIGFzeW5jIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj47CisgIGFzeW5jIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj47CisgIGFzeW5jIGZuIFZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD47CisgIGFzeW5jIGZuIEdldEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj47CisgIGFzeW5jIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz5dLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBhc3luYyBmbiBHZXROdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PjsKKyAgYXN5bmMgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBhc3luYyBmbiBHZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PjsKKyAgYXN5bmMgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+OworICBhc3luYyBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj47CisgIGFzeW5jIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPjsKKyAgYXN5bmMgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj47CisgIGFzeW5jIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj47CisgIGFzeW5jIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PjsKKyAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj47CisgIGFzeW5jIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PjsKKyAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj47CisgIGFzeW5jIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGFzeW5jIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+OworICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+OworICBhc3luYyBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj47CisgIGFzeW5jIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OworICBhc3luYyBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+OworICBhc3luYyBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PjsKKyAgYXN5bmMgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19lcDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYXJnX2VwMjogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBSZXZlcnNlTGlzdCgmc2VsZiwgX2FyZ19saXN0OiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD47CisgIGFzeW5jIGZuIFJldmVyc2VJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3BJQmluZGVyPj47CisgIGFzeW5jIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj47CisgIGFzeW5jIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj47CisgIGFzeW5jIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj47CisgIGFzeW5jIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj47CisgIGFzeW5jIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT47Cit9CitpbXBsIEJuVGVzdFNlcnZpY2UgeworICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSVRlc3RTZXJ2aWNlPgorICB3aGVyZQorICAgIFQ6IElUZXN0U2VydmljZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICB7CisgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgX2lubmVyOiBULAorICAgICAgX3J0OiBSLAorICAgIH0KKyAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICB9CisgICAgaW1wbDxULCBSPiBJVGVzdFNlcnZpY2UgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICB3aGVyZQorICAgICAgVDogSVRlc3RTZXJ2aWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZCgmc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlVuaW1wbGVtZW50ZWRNZXRob2QoX2FyZ19hcmcpKQorICAgICAgfQorICAgICAgZm4gRGVwcmVjYXRlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuRGVwcmVjYXRlZCgpKQorICAgICAgfQorICAgICAgZm4gVGVzdE9uZXdheSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVGVzdE9uZXdheSgpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRCb29sZWFuKF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0Qnl0ZSgmc2VsZiwgX2FyZ190b2tlbjogaTgpIC0+IGJpbmRlcjo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEJ5dGUoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRDaGFyKCZzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRDaGFyKF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRJbnQoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRMb25nKF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEZsb2F0KF9hcmdfdG9rZW4pKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXREb3VibGUoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRTdHJpbmcoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRCeXRlRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdEludEVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdEludEVudW0oX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRMb25nRW51bShfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZUJ5dGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlQ2hhcihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGkzMj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpNjQ+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VMb25nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUZsb2F0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2YzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGYzMj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VGbG9hdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGY2ND4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZVN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VCeXRlRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlQnl0ZUVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlTG9uZ0VudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKCZzZWxmLCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0T3RoZXJUZXN0U2VydmljZShfYXJnX25hbWUpKQorICAgICAgfQorICAgICAgZm4gVmVyaWZ5TmFtZSgmc2VsZiwgX2FyZ19zZXJ2aWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpKQorICAgICAgfQorICAgICAgZm4gR2V0SW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfbmFtZXM6ICZbU3RyaW5nXSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLkdldEludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMpKQorICAgICAgfQorICAgICAgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPl0sIF9hcmdfbmFtZXM6ICZbU3RyaW5nXSkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKSkKKyAgICAgIH0KKyAgICAgIGZuIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKSkKKyAgICAgIH0KKyAgICAgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcykpCisgICAgICB9CisgICAgICBmbiBHZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLkdldEludGVyZmFjZUxpc3QoX2FyZ19uYW1lcykpCisgICAgICB9CisgICAgICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmc2VsZiwgX2FyZ19yZWFkOiAmYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnX3JlYWQpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlRocm93U2VydmljZUV4Y2VwdGlvbihfYXJnX2NvZGUpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShfYXJnX2lucHV0KSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KF9hcmdfaW5wdXQpKQorICAgICAgfQorICAgICAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KF9hcmdfaW5wdXQpKQorICAgICAgfQorICAgICAgZm4gVGFrZXNBbklCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZiaW5kZXI6OlNwSUJpbmRlcikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5UYWtlc0FuSUJpbmRlckxpc3QoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dCkpCisgICAgICB9CisgICAgICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmVwZWF0VXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbikpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSkKKyAgICAgIH0KKyAgICAgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLkdldENhbGxiYWNrKF9hcmdfcmV0dXJuX251bGwpKQorICAgICAgfQorICAgICAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKF9hcmdfcGFyY2VsKSkKKyAgICAgIH0KKyAgICAgIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShfYXJnX2VwLCBfYXJnX2VwMikpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlTGlzdCgmc2VsZiwgX2FyZ19saXN0OiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5SZXZlcnNlTGlzdChfYXJnX2xpc3QpKQorICAgICAgfQorICAgICAgZm4gUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTcElCaW5kZXI+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLlJldmVyc2VJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkpCisgICAgICB9CisgICAgICBmbiBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpKQorICAgICAgfQorICAgICAgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLkdldE9sZE5hbWVJbnRlcmZhY2UoKSkKKyAgICAgIH0KKyAgICAgIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5HZXROZXdOYW1lSW50ZXJmYWNlKCkpCisgICAgICB9CisgICAgICBmbiBHZXRDcHBKYXZhVGVzdHMoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuR2V0Q3BwSmF2YVRlc3RzKCkpCisgICAgICB9CisgICAgICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuZ2V0QmFja2VuZFR5cGUoKSkKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IHdyYXBwZWQgPSBXcmFwcGVyIHsgX2lubmVyOiBpbm5lciwgX3J0OiBydCB9OworICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgIH0KK30KIHB1YiB0cmFpdCBJVGVzdFNlcnZpY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7Ci0gIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGkzMj4geworICBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geworICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7CisgIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Ym9vbD4geworICBmbiBSZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0Qnl0ZSgmc2VsZiwgX2FyZ190b2tlbjogaTgpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGk4PiB7CisgIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OlJlc3VsdDxpOD4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8dTE2PiB7CisgIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpSZXN1bHQ8dTE2PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGkzMj4geworICBmbiBSZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TG9uZygmc2VsZiwgX2FyZ190b2tlbjogaTY0KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpNjQ+IHsKKyAgZm4gUmVwZWF0TG9uZygmc2VsZiwgX2FyZ190b2tlbjogaTY0KSAtPiBiaW5kZXI6OlJlc3VsdDxpNjQ+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRGbG9hdCgmc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxmMzI+IHsKKyAgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGY2ND4geworICBmbiBSZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpSZXN1bHQ8ZjY0PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsKKyAgZm4gUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRCeXRlRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4geworICBmbiBSZXBlYXRCeXRlRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdEludEVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7CisgIGZuIFJlcGVhdEludEVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+IHsKKyAgZm4gUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlQm9vbGVhbigmc2VsZiwgX2FyZ19pbnB1dDogJltib29sXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Ym9vbD4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxib29sPj4geworICBmbiBSZXZlcnNlQm9vbGVhbigmc2VsZiwgX2FyZ19pbnB1dDogJltib29sXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Ym9vbD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxib29sPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8dTg+PiB7CisgIGZuIFJldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTg+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPHUxNj4+IHsKKyAgZm4gUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHUxNj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlSW50KCZzZWxmLCBfYXJnX2lucHV0OiAmW2kzMl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGkzMj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxpMzI+PiB7CisgIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGkzMj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTY0Pj4geworICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTY0Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjMyPj4geworICBmbiBSZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGYzMj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlRG91YmxlKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Y2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGY2ND4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxmNjQ+PiB7CisgIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGY2ND4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+IHsKKyAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKKyAgZm4gUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKKyAgZm4gUmV2ZXJzZUxvbmdFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7CisgIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Ym9vbD4geworICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICBmbiBHZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmc2VsZiwgX2FyZ19yZWFkOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+IHsKKyAgZm4gVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPl0sIF9hcmdfbmFtZXM6ICZbU3RyaW5nXSkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+IHsKKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgX2FyZ19jb2RlOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+IHsKKyAgZm4gR2V0SW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4geworICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+Pj4geworICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4geworICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmc2VsZiwgX2FyZ19yZWFkOiAmYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PiB7CisgIGZuIFJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3JdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogJmJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geworICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geworICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PiB7CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JnN0cj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+IHsKICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKICAgfQotICBmbiBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJnNlbGYsIF9hcmdfcGFyY2VsOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geworICBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogJmJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj4geworICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4geworICBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQogICB9Ci0gIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4geworICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KLSAgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPiB7CisgIGZuIFJlcGVhdFV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIEdldENhbGxiYWNrKCZzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBGaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJnNlbGYsIF9hcmdfcGFyY2VsOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9CisgIGZuIFJldmVyc2VMaXN0KCZzZWxmLCBfYXJnX2xpc3Q6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTcElCaW5kZXI+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU5ld05hbWU+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPiB7CiAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCiAgIH0KIH0KIHB1YiBtb2QgdHJhbnNhY3Rpb25zIHsKLSAgcHViIGNvbnN0IFVuaW1wbGVtZW50ZWRNZXRob2Q6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKLSAgcHViIGNvbnN0IERlcHJlY2F0ZWQ6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKLSAgcHViIGNvbnN0IFRlc3RPbmV3YXk6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKLSAgcHViIGNvbnN0IFJlcGVhdEJvb2xlYW46IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKLSAgcHViIGNvbnN0IFJlcGVhdEJ5dGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKLSAgcHViIGNvbnN0IFJlcGVhdENoYXI6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTsKLSAgcHViIGNvbnN0IFJlcGVhdEludDogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2OwotICBwdWIgY29uc3QgUmVwZWF0TG9uZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OwotICBwdWIgY29uc3QgUmVwZWF0RmxvYXQ6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgODsKLSAgcHViIGNvbnN0IFJlcGVhdERvdWJsZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA5OwotICBwdWIgY29uc3QgUmVwZWF0U3RyaW5nOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEwOwotICBwdWIgY29uc3QgUmVwZWF0Qnl0ZUVudW06IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTE7Ci0gIHB1YiBjb25zdCBSZXBlYXRJbnRFbnVtOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEyOwotICBwdWIgY29uc3QgUmVwZWF0TG9uZ0VudW06IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTM7Ci0gIHB1YiBjb25zdCBSZXZlcnNlQm9vbGVhbjogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNDsKLSAgcHViIGNvbnN0IFJldmVyc2VCeXRlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE1OwotICBwdWIgY29uc3QgUmV2ZXJzZUNoYXI6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY7Ci0gIHB1YiBjb25zdCBSZXZlcnNlSW50OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE3OwotICBwdWIgY29uc3QgUmV2ZXJzZUxvbmc6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTg7Ci0gIHB1YiBjb25zdCBSZXZlcnNlRmxvYXQ6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7Ci0gIHB1YiBjb25zdCBSZXZlcnNlRG91YmxlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIwOwotICBwdWIgY29uc3QgUmV2ZXJzZVN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMTsKLSAgcHViIGNvbnN0IFJldmVyc2VCeXRlRW51bTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKLSAgcHViIGNvbnN0IFJldmVyc2VJbnRFbnVtOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIzOwotICBwdWIgY29uc3QgUmV2ZXJzZUxvbmdFbnVtOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI0OwotICBwdWIgY29uc3QgR2V0T3RoZXJUZXN0U2VydmljZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNTsKLSAgcHViIGNvbnN0IFZlcmlmeU5hbWU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjY7Ci0gIHB1YiBjb25zdCBSZXZlcnNlU3RyaW5nTGlzdDogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyNzsKLSAgcHViIGNvbnN0IFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI4OwotICBwdWIgY29uc3QgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXk6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjk7Ci0gIHB1YiBjb25zdCBUaHJvd1NlcnZpY2VFeGNlcHRpb246IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzA7Ci0gIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZUludEFycmF5OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMxOwotICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5OiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMyOwotICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXk6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzM7Ci0gIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXk6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzQ7Ci0gIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNTsKLSAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdDogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNjsKLSAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNzsKLSAgcHViIGNvbnN0IFRha2VzQW5JQmluZGVyOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM4OwotICBwdWIgY29uc3QgVGFrZXNBTnVsbGFibGVJQmluZGVyOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM5OwotICBwdWIgY29uc3QgUmVwZWF0VXRmOENwcFN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MDsKLSAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MTsKLSAgcHViIGNvbnN0IFJldmVyc2VVdGY4Q3BwU3RyaW5nOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQyOwotICBwdWIgY29uc3QgUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZzogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MzsKLSAgcHViIGNvbnN0IFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdDogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NDsKLSAgcHViIGNvbnN0IEdldENhbGxiYWNrOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ1OwotICBwdWIgY29uc3QgRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlOiBiaW5kZXI6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2OwotICBwdWIgY29uc3QgR2V0T2xkTmFtZUludGVyZmFjZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0NzsKLSAgcHViIGNvbnN0IEdldE5ld05hbWVJbnRlcmZhY2U6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDg7Ci0gIHB1YiBjb25zdCBHZXRDcHBKYXZhVGVzdHM6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDk7Ci0gIHB1YiBjb25zdCBnZXRCYWNrZW5kVHlwZTogYmluZGVyOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MDsKKyAgcHViIGNvbnN0IFVuaW1wbGVtZW50ZWRNZXRob2Q6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICBwdWIgY29uc3QgRGVwcmVjYXRlZDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgIHB1YiBjb25zdCBUZXN0T25ld2F5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKKyAgcHViIGNvbnN0IFJlcGVhdEJvb2xlYW46IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOworICBwdWIgY29uc3QgUmVwZWF0Qnl0ZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ7CisgIHB1YiBjb25zdCBSZXBlYXRDaGFyOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTsKKyAgcHViIGNvbnN0IFJlcGVhdEludDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CisgIHB1YiBjb25zdCBSZXBlYXRMb25nOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKKyAgcHViIGNvbnN0IFJlcGVhdEZsb2F0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgODsKKyAgcHViIGNvbnN0IFJlcGVhdERvdWJsZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDk7CisgIHB1YiBjb25zdCBSZXBlYXRTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxMDsKKyAgcHViIGNvbnN0IFJlcGVhdEJ5dGVFbnVtOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTE7CisgIHB1YiBjb25zdCBSZXBlYXRJbnRFbnVtOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTI7CisgIHB1YiBjb25zdCBSZXBlYXRMb25nRW51bTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDEzOworICBwdWIgY29uc3QgUmV2ZXJzZUJvb2xlYW46IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNDsKKyAgcHViIGNvbnN0IFJldmVyc2VCeXRlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTU7CisgIHB1YiBjb25zdCBSZXZlcnNlQ2hhcjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2OworICBwdWIgY29uc3QgUmV2ZXJzZUludDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE3OworICBwdWIgY29uc3QgUmV2ZXJzZUxvbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxODsKKyAgcHViIGNvbnN0IFJldmVyc2VGbG9hdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE5OworICBwdWIgY29uc3QgUmV2ZXJzZURvdWJsZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIwOworICBwdWIgY29uc3QgUmV2ZXJzZVN0cmluZzogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOworICBwdWIgY29uc3QgUmV2ZXJzZUJ5dGVFbnVtOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjI7CisgIHB1YiBjb25zdCBSZXZlcnNlSW50RW51bTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIzOworICBwdWIgY29uc3QgUmV2ZXJzZUxvbmdFbnVtOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjQ7CisgIHB1YiBjb25zdCBHZXRPdGhlclRlc3RTZXJ2aWNlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjU7CisgIHB1YiBjb25zdCBWZXJpZnlOYW1lOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjY7CisgIHB1YiBjb25zdCBHZXRJbnRlcmZhY2VBcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI3OworICBwdWIgY29uc3QgVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyODsKKyAgcHViIGNvbnN0IEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOTsKKyAgcHViIGNvbnN0IFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMDsKKyAgcHViIGNvbnN0IEdldEludGVyZmFjZUxpc3Q6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMTsKKyAgcHViIGNvbnN0IFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3Q6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzMjsKKyAgcHViIGNvbnN0IFJldmVyc2VTdHJpbmdMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzM7CisgIHB1YiBjb25zdCBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM0OworICBwdWIgY29uc3QgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzNTsKKyAgcHViIGNvbnN0IFRocm93U2VydmljZUV4Y2VwdGlvbjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM2OworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVJbnRBcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM3OworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzg7CisgIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM5OworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDA7CisgIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVN0cmluZzogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQxOworICBwdWIgY29uc3QgUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDI7CisgIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0MzsKKyAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDQ7CisgIHB1YiBjb25zdCBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDU7CisgIHB1YiBjb25zdCBUYWtlc0FuSUJpbmRlcjogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ2OworICBwdWIgY29uc3QgVGFrZXNBTnVsbGFibGVJQmluZGVyOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDc7CisgIHB1YiBjb25zdCBUYWtlc0FuSUJpbmRlckxpc3Q6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0ODsKKyAgcHViIGNvbnN0IFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3Q6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OTsKKyAgcHViIGNvbnN0IFJlcGVhdFV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MDsKKyAgcHViIGNvbnN0IFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZzogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDUxOworICBwdWIgY29uc3QgUmV2ZXJzZVV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MjsKKyAgcHViIGNvbnN0IFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmc6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1MzsKKyAgcHViIGNvbnN0IFJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdDogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU0OworICBwdWIgY29uc3QgR2V0Q2FsbGJhY2s6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NTsKKyAgcHViIGNvbnN0IEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU2OworICBwdWIgY29uc3QgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1NzsKKyAgcHViIGNvbnN0IFJldmVyc2VMaXN0OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTg7CisgIHB1YiBjb25zdCBSZXZlcnNlSUJpbmRlckFycmF5OiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTk7CisgIHB1YiBjb25zdCBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXk6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MDsKKyAgcHViIGNvbnN0IEdldE9sZE5hbWVJbnRlcmZhY2U6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MTsKKyAgcHViIGNvbnN0IEdldE5ld05hbWVJbnRlcmZhY2U6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2MjsKKyAgcHViIGNvbnN0IEdldENwcEphdmFUZXN0czogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDYzOworICBwdWIgY29uc3QgZ2V0QmFja2VuZFR5cGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2NDsKIH0KIHB1YiB0eXBlIElUZXN0U2VydmljZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElUZXN0U2VydmljZURlZmF1bHQ+PjsKIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CkBAIC0zNTcsMTQgKzc4OSwxNCBAQAogcHViIGNvbnN0IEE1NTogaTMyID0gMTsKIHB1YiBjb25zdCBBNTY6IGkzMiA9IDE7CiBwdWIgY29uc3QgQTU3OiBpMzIgPSAxOwotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OklUZXN0U2VydmljZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZTsgfQotaW1wbCBJVGVzdFNlcnZpY2UgZm9yIEJwVGVzdFNlcnZpY2UgewotICBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpMzI+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfYXJnKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKK2ltcGwgQnBUZXN0U2VydmljZSB7CisgIGZuIGJ1aWxkX3BhcmNlbF9VbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfYXJnX2FyZzogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2FyZyk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1VuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlVuaW1wbGVtZW50ZWRNZXRob2QoX2FyZ19hcmcpOwpAQCAtMzc2LDExICs4MDgsMTIgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBpMzIgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6RGVwcmVjYXRlZCwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9EZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfRGVwcmVjYXRlZCgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5EZXByZWNhdGVkKCk7CkBAIC0zOTEsMTEgKzgyNCwxMiBAQAogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIE9rKCgpKQogICB9Ci0gIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUZXN0T25ld2F5LCBiaW5kZXI6OkZMQUdfT05FV0FZIHwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9UZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGVzdE9uZXdheSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UZXN0T25ld2F5KCk7CkBAIC00MDQsMTIgKzgzOCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBPaygoKSkKICAgfQotICBmbiBSZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxib29sPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCb29sZWFuLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRCb29sZWFuKCZzZWxmLCBfYXJnX3Rva2VuOiBib29sLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuKTsKQEAgLTQyMSwxMiArODU2LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogYm9vbCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpOD4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGk4PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEJ5dGUoX2FyZ190b2tlbik7CkBAIC00MzgsMTIgKzg3NCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGk4ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDx1MTY+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdENoYXIsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0Q2hhcigmc2VsZiwgX2FyZ190b2tlbjogdTE2LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRDaGFyKF9hcmdfdG9rZW4pOwpAQCAtNDU1LDEyICs4OTIsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiB1MTYgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTMyPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRJbnQsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRJbnQoJnNlbGYsIF9hcmdfdG9rZW46IGkzMiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0SW50KF9hcmdfdG9rZW4pOwpAQCAtNDcyLDEyICs5MTAsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBpMzIgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGk2ND4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZywgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdExvbmcoX2FyZ190b2tlbik7CkBAIC00ODksMTIgKzkyOCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGk2NCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGYzMj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0RmxvYXQsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEZsb2F0KF9hcmdfdG9rZW4pOwpAQCAtNTA2LDEyICs5NDYsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBmMzIgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8ZjY0PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXREb3VibGUsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXREb3VibGUoJnNlbGYsIF9hcmdfdG9rZW46IGY2NCwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0RG91YmxlKF9hcmdfdG9rZW4pOwpAQCAtNTIzLDEyICs5NjQsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBmNjQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFN0cmluZz4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0U3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdFN0cmluZyhfYXJnX3Rva2VuKTsKQEAgLTU0MCwxMiArOTgyLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogU3RyaW5nID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGVFbnVtLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZUVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKTsKQEAgLTU1NywxMiArMTAwMCwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50RW51bSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ190b2tlbik/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEludEVudW0oX2FyZ190b2tlbik7CkBAIC01NzQsMTIgKzEwMTgsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZ0VudW0sIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pOwpAQCAtNTkxLDEzICsxMDM2LDE0IEBACiAgICAgbGV0IF9haWRsX3JldHVybjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGJvb2w+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQm9vbGVhbiwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlQm9vbGVhbigmc2VsZiwgX2FyZ19pbnB1dDogJltib29sXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Ym9vbD4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlQm9vbGVhbigmc2VsZiwgX2FyZ19pbnB1dDogJltib29sXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Ym9vbD4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtNjA3LDE2ICsxMDUzLDE3IEBACiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxib29sPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8dTg+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlQnl0ZSgmc2VsZiwgX2FyZ19pbnB1dDogJlt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUJ5dGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC02MjYsMTYgKzEwNzMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPHU4PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1MTY+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQ2hhciwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlQ2hhcihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTY0NSwxNiArMTA5MywxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8dTE2PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGkzMj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VJbnQsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxpMzI+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VJbnQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC02NjQsMTYgKzExMTMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGkzMj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTY0Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUxvbmcsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUxvbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTY0PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGk2ND4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC02ODMsMTYgKzExMzMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGk2ND4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGYzMj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VGbG9hdCwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmMzI+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VGbG9hdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTcwMiwxNiArMTE1MywxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8ZjMyPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGY2ND4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VEb3VibGUsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxmNjQ+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VEb3VibGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC03MjEsMTYgKzExNzMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGY2ND4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKLSAgICAgIF9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtNzQwLDE2ICsxMTkzLDE3IEBACiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxTdHJpbmc+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZUVudW0sIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VCeXRlRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTc1OSwxNiArMTIxMywxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUludEVudW0sIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VJbnRFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUludEVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC03NzgsMTYgKzEyMzMsMTcgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwotICAgICpfYXJnX3JlcGVhdGVkID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMb25nRW51bSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlX3NsaWNlX3NpemUoU29tZShfYXJnX3JlcGVhdGVkKSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUxvbmdFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUxvbmdFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtNzk3LDE1ICsxMjUzLDE2IEBACiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0T3RoZXJUZXN0U2VydmljZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX25hbWUpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX0dldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0ciwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldE90aGVyVGVzdFNlcnZpY2UoX2FyZ19uYW1lKTsKQEAgLTgxNywxMyArMTI3NCwxNCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJvb2w+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlZlcmlmeU5hbWUsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19zZXJ2aWNlKT87Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZSk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19zZXJ2aWNlKT87CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZSk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWUoJnNlbGYsIF9hcmdfc2VydmljZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJnN0ciwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpOwpAQCAtODM1LDEyICsxMjkzLDEyNCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJvb2wgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXZlcnNlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVN0cmluZ0xpc3QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZXMpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPl0sIF9hcmdfbmFtZXM6ICZbU3RyaW5nXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX3NlcnZpY2VzKT87CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfbmFtZXMpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcyk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogYm9vbCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX25hbWVzKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+PiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcyk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19zZXJ2aWNlcyk/OworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19uYW1lcyk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBib29sID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX0dldEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfbmFtZXMpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3NlcnZpY2VzKT87CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX25hbWVzKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IGJvb2wgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTg1MCwxNSArMTQyMCwxNiBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8U3RyaW5nPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19yZWFkKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfcmVhZCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoX2FyZ19yZWFkKTsKQEAgLTg2NywxNiArMTQzOCwxNyBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9Ci0gICAgbGV0IF9haWRsX3JldHVybjogYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXksIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OwotICAgICAgX2FpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CkBAIC04ODUsMTYgKzE0NTcsMTcgQEAKICAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CiAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQotICAgIGxldCBfYWlkbF9yZXR1cm46IFZlYzxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgbGV0IF9haWRsX3JldHVybjogVmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGhyb3dTZXJ2aWNlRXhjZXB0aW9uLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2NvZGUpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19jb2RlKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UaHJvd1NlcnZpY2VFeGNlcHRpb24oX2FyZ19jb2RlKTsKQEAgLTkwNSwxMiArMTQ3OCwxMyBAQAogICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQogICAgIE9rKCgpKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGkzMj4+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUludEFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50QXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2kzMl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTIyLDEyICsxNDk2LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxpMzI+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTM5LDEyICsxNTE0LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTU2LDEyICsxNTMyLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5LCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXT4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpOwpAQCAtOTczLDEyICsxNTUwLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVTdHJpbmcsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JnN0cj4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCk7CkBAIC05OTAsMTIgKzE1NjgsMTMgQEAKICAgICBsZXQgX2FpZGxfcmV0dXJuOiBPcHRpb248U3RyaW5nPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCk7CkBAIC0xMDA3LDEyICsxNTg2LDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQpOwpAQCAtMTAyMSwxNSArMTYwMSw1MiBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9Ci0gICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlciwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KF9hcmdfaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KF9hcmdfaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBPayhfYWlkbF9yZXR1cm4pCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1Rha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1Rha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCk7CkBAIC0xMDQwLDEyICsxNjU3LDEzIEBACiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgT2soKCkpCiAgIH0KLSAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQU51bGxhYmxlSUJpbmRlciwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9UYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZ19pbnB1dCk7CkBAIC0xMDU2LDEyICsxNjc0LDQ3IEBACiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgT2soKCkpCiAgIH0KLSAgZm4gUmVwZWF0VXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8U3RyaW5nPiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRVdGY4Q3BwU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSkgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX2lucHV0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UYWtlc0FuSUJpbmRlckxpc3QoX2FyZ19pbnB1dCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgT2soKCkpCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KF9hcmdfaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIE9rKCgpKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9SZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfdG9rZW4pPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXBlYXRVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4pOwpAQCAtMTA3MywxMiArMTcyNiwxMyBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IFN0cmluZyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3Rva2VuKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiBPcHRpb248JnN0cj4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKF9hcmdfdG9rZW4pOwpAQCAtMTA5MCwxMyArMTc0NCwxNCBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxTdHJpbmc+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VVdGY4Q3BwU3RyaW5nLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBfYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKLSAgICAgIF9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX1JldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19pbnB1dCk/OworICAgIGFpZGxfZGF0YS53cml0ZV9zbGljZV9zaXplKFNvbWUoX2FyZ19yZXBlYXRlZCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpOwpAQCAtMTEwNiwxNiArMTc2MSwxNyBAQAogICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KICAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8U3RyaW5nPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87Ci0gICAgKl9hcmdfcmVwZWF0ZWQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIF9haWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShfYXJnX3JlcGVhdGVkLmFzX2RlcmVmKCkpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShfYXJnX3JlcGVhdGVkLmFzX2RlcmVmKCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTExMjUsMTUgKzE3ODEsMTYgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7Ci0gICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIudHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19pbnB1dCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKQEAgLTExNDMsMTUgKzE4MDAsMTYgQEAKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKLSAgICAqX2FyZ19yZXBlYXRlZCA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfcmVwZWF0ZWQpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q2FsbGJhY2ssIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIF9haWRsX2RhdGEud3JpdGUoJl9hcmdfcmV0dXJuX251bGwpPzsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfR2V0Q2FsbGJhY2soJnNlbGYsIF9hcmdfcmV0dXJuX251bGw6IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfcmV0dXJuX251bGwpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9HZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCk7CkBAIC0xMTYzLDEyICsxODIxLDEzIEBACiAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKICAgICBPayhfYWlkbF9yZXR1cm4pCiAgIH0KLSAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgX2FpZGxfZGF0YS53cml0ZShfYXJnX3BhcmNlbCk/OwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJnNlbGYsIF9hcmdfcGFyY2VsOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfcGFyY2VsKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoX2FyZ19wYXJjZWwpOwpAQCAtMTE3NywxNCArMTgzNiw5MSBAQAogICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKICAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9Ci0gICAgKl9hcmdfcGFyY2VsID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19wYXJjZWwpPzsKICAgICBPaygoKSkKICAgfQotICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE9sZE5hbWVJbnRlcmZhY2UsIGJpbmRlcjo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OkZMQUdfUFJJVkFURV9MT0NBTCwgfF9haWRsX2RhdGF8IHsKLSAgICAgIF9haWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKLSAgICAgIE9rKCgpKQotICAgIH0pOworICBmbiBidWlsZF9wYXJjZWxfUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJnNlbGYsIF9hcmdfZXA6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICZtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19lcCk/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgeworICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKF9hcmdfZXAsIF9hcmdfZXAyKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19lcDIpPzsKKyAgICBPaygoKSkKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19saXN0KT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlTGlzdChfYXJnX2xpc3QpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIGxldCBfYWlkbF9yZXR1cm46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShTb21lKF9hcmdfcmVwZWF0ZWQpKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+LCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuUmV2ZXJzZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBsZXQgX2FpZGxfcmV0dXJuOiBWZWM8YmluZGVyOjpTcElCaW5kZXI+ID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19yZXBlYXRlZCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEubWFya19zZW5zaXRpdmUoKTsKKyAgICBhaWRsX2RhdGEud3JpdGUoJl9hcmdfaW5wdXQpPzsKKyAgICBhaWRsX2RhdGEud3JpdGVfc2xpY2Vfc2l6ZShfYXJnX3JlcGVhdGVkLmFzX2RlcmVmKCkpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+Pj4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJVGVzdFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX3JlcGVhdGVkKT87CisgICAgT2soX2FpZGxfcmV0dXJuKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0T2xkTmFtZUludGVyZmFjZSgpOwpAQCAtMTE5NiwxMSArMTkzMiwxMiBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TmV3TmFtZUludGVyZmFjZSwgYmluZGVyOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6RkxBR19QUklWQVRFX0xPQ0FMLCB8X2FpZGxfZGF0YXwgewotICAgICAgX2FpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOwotICAgICAgT2soKCkpCi0gICAgfSk7CisgIGZuIGJ1aWxkX3BhcmNlbF9HZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuR2V0TmV3TmFtZUludGVyZmFjZSgpOwpAQCAtMTIxMiwxMSArMTk0OSwxMiBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CiAgICAgT2soX2FpZGxfcmV0dXJuKQogICB9Ci0gIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4gewotICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnRyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q3BwSmF2YVRlc3RzLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX0dldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS5tYXJrX3NlbnNpdGl2ZSgpOworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX0dldENwcEphdmFUZXN0cygmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7CiAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgewogICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElUZXN0U2VydmljZT46OmdldERlZmF1bHRJbXBsKCkgewogICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLkdldENwcEphdmFUZXN0cygpOwpAQCAtMTIyOCwxMSArMTk2NiwxMiBAQAogICAgIGxldCBfYWlkbF9yZXR1cm46IE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4gPSBfYWlkbF9yZXBseS5yZWFkKCk/OwogICAgIE9rKF9haWRsX3JldHVybikKICAgfQotICBmbiBnZXRCYWNrZW5kVHlwZSgmc2VsZikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKLSAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci50cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmdldEJhY2tlbmRUeXBlLCBiaW5kZXI6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpGTEFHX1BSSVZBVEVfTE9DQUwsIHxfYWlkbF9kYXRhfCB7Ci0gICAgICBfYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7Ci0gICAgICBPaygoKSkKLSAgICB9KTsKKyAgZm4gYnVpbGRfcGFyY2VsX2dldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgYWlkbF9kYXRhLm1hcmtfc2Vuc2l0aXZlKCk7CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfZ2V0QmFja2VuZFR5cGUoJnNlbGYsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTFfQmFja2VuZFR5cGU+IHsKICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CiAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSVRlc3RTZXJ2aWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CiAgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuZ2V0QmFja2VuZFR5cGUoKTsKQEAgLTEyNDUsNjAgKzE5ODQsMTI0MyBAQAogICAgIE9rKF9haWRsX3JldHVybikKICAgfQogfQotaW1wbCBJVGVzdFNlcnZpY2UgZm9yIGJpbmRlcjo6QmluZGVyPEJuVGVzdFNlcnZpY2U+IHsKLSAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZCgmc2VsZiwgX2FyZ19hcmc6IGkzMikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8aTMyPiB7IHNlbGYuMC5VbmltcGxlbWVudGVkTWV0aG9kKF9hcmdfYXJnKSB9Ci0gIGZuIERlcHJlY2F0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7IHNlbGYuMC5EZXByZWNhdGVkKCkgfQotICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGVzdE9uZXdheSgpIH0KLSAgZm4gUmVwZWF0Qm9vbGVhbigmc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Ym9vbD4geyBzZWxmLjAuUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdEJ5dGUoJnNlbGYsIF9hcmdfdG9rZW46IGk4KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpOD4geyBzZWxmLjAuUmVwZWF0Qnl0ZShfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdENoYXIoJnNlbGYsIF9hcmdfdG9rZW46IHUxNikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8dTE2PiB7IHNlbGYuMC5SZXBlYXRDaGFyKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0SW50KCZzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGkzMj4geyBzZWxmLjAuUmVwZWF0SW50KF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0TG9uZygmc2VsZiwgX2FyZ190b2tlbjogaTY0KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxpNjQ+IHsgc2VsZi4wLlJlcGVhdExvbmcoX2FyZ190b2tlbikgfQotICBmbiBSZXBlYXRGbG9hdCgmc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxmMzI+IHsgc2VsZi4wLlJlcGVhdEZsb2F0KF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0RG91YmxlKCZzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGY2ND4geyBzZWxmLjAuUmVwZWF0RG91YmxlKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0U3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlcGVhdFN0cmluZyhfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7IHNlbGYuMC5SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKSB9Ci0gIGZuIFJlcGVhdEludEVudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPiB7IHNlbGYuMC5SZXBlYXRJbnRFbnVtKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmVwZWF0TG9uZ0VudW0oJnNlbGYsIF9hcmdfdG9rZW46IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+IHsgc2VsZi4wLlJlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4pIH0KLSAgZm4gUmV2ZXJzZUJvb2xlYW4oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYm9vbF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGJvb2w+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Ym9vbD4+IHsgc2VsZi4wLlJldmVyc2VCb29sZWFuKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzx1OD4+IHsgc2VsZi4wLlJldmVyc2VCeXRlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZUNoYXIoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdTE2XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTE2PikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPHUxNj4+IHsgc2VsZi4wLlJldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZUludCgmc2VsZiwgX2FyZ19pbnB1dDogJltpMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8aTMyPj4geyBzZWxmLjAuUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VMb25nKCZzZWxmLCBfYXJnX2lucHV0OiAmW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxpNjQ+PiB7IHNlbGYuMC5SZXZlcnNlTG9uZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjMyPj4geyBzZWxmLjAuUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmV2ZXJzZURvdWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogJltmNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmNjQ+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8ZjY0Pj4geyBzZWxmLjAuUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQotICBmbiBSZXZlcnNlQnl0ZUVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4+IHsgc2VsZi4wLlJldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VJbnRFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiB7IHNlbGYuMC5SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VMb25nRW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4geyBzZWxmLjAuUmV2ZXJzZUxvbmdFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gR2V0T3RoZXJUZXN0U2VydmljZSgmc2VsZiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiB7IHNlbGYuMC5HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSkgfQotICBmbiBWZXJpZnlOYW1lKCZzZWxmLCBfYXJnX3NlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+LCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJvb2w+IHsgc2VsZi4wLlZlcmlmeU5hbWUoX2FyZ19zZXJ2aWNlLCBfYXJnX25hbWUpIH0KLSAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsgc2VsZi4wLlJldmVyc2VTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KLSAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoJnNlbGYsIF9hcmdfcmVhZDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiB7IHNlbGYuMC5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnX3JlYWQpIH0KLSAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxWZWM8YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4geyBzZWxmLjAuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQotICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSkgfQotICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltpMzJdPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0KSB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQpIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0KSB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlU3RyaW5nKF9hcmdfaW5wdXQpIH0KLSAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChfYXJnX2lucHV0KSB9Ci0gIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZT4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShfYXJnX2lucHV0KSB9Ci0gIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0KSB9Ci0gIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PCgpPiB7IHNlbGYuMC5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoX2FyZ19pbnB1dCkgfQotICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbikgfQotICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSB9Ci0gIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7IHNlbGYuMC5SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQotICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9Ci0gIGZuIEdldENhbGxiYWNrKCZzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsgc2VsZi4wLkdldENhbGxiYWNrKF9hcmdfcmV0dXJuX251bGwpIH0KLSAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpwdWJsaWNfYXBpOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCkgfQotICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsgc2VsZi4wLkdldE9sZE5hbWVJbnRlcmZhY2UoKSB9Ci0gIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6cHVibGljX2FwaTo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4geyBzZWxmLjAuR2V0TmV3TmFtZUludGVyZmFjZSgpIH0KLSAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7IHNlbGYuMC5HZXRDcHBKYXZhVGVzdHMoKSB9Ci0gIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OnB1YmxpY19hcGk6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4geyBzZWxmLjAuZ2V0QmFja2VuZFR5cGUoKSB9CitpbXBsIElUZXN0U2VydmljZSBmb3IgQnBUZXN0U2VydmljZSB7CisgIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfVW5pbXBsZW1lbnRlZE1ldGhvZChfYXJnX2FyZyk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVW5pbXBsZW1lbnRlZE1ldGhvZChfYXJnX2FyZywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gRGVwcmVjYXRlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0RlcHJlY2F0ZWQoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6RGVwcmVjYXRlZCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9EZXByZWNhdGVkKF9haWRsX3JlcGx5KQorICB9CisgIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9UZXN0T25ld2F5KCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRlc3RPbmV3YXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfT05FV0FZIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9UZXN0T25ld2F5KF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJvb2xlYW4oX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJvb2xlYW4sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qm9vbGVhbihfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8aTg+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEJ5dGUoX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJ5dGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRDaGFyKCZzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0Q2hhcihfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Q2hhciwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRDaGFyKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEludCgmc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludChfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEludChfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRMb25nKCZzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6UmVzdWx0PGk2ND4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TG9uZyhfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TG9uZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRMb25nKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEZsb2F0KCZzZWxmLCBfYXJnX3Rva2VuOiBmMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGYzMj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0RmxvYXQoX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEZsb2F0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEZsb2F0KF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdERvdWJsZSgmc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdERvdWJsZShfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0RG91YmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdERvdWJsZShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0U3RyaW5nKF9hcmdfdG9rZW4pPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0U3RyaW5nKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEJ5dGVFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0Qnl0ZUVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZUVudW0oX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0SW50RW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEludEVudW0oX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEludEVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0SW50RW51bShfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRMb25nRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TG9uZ0VudW0oX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdExvbmdFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdExvbmdFbnVtKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQm9vbGVhbihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUJvb2xlYW4sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUJvb2xlYW4oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUJ5dGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbdThdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1OD4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VCeXRlKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQnl0ZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlQ2hhcigmc2VsZiwgX2FyZ19pbnB1dDogJlt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTE2Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUNoYXIoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VDaGFyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VDaGFyKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGkzMj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJbnQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VJbnQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTY0Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMb25nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VGbG9hdCgmc2VsZiwgX2FyZ19pbnB1dDogJltmMzJdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8ZjMyPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlRmxvYXQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUZsb2F0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGY2ND4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VEb3VibGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VEb3VibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQnl0ZUVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VCeXRlRW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlQnl0ZUVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUludEVudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJbnRFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlSW50RW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUxvbmdFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXRPdGhlclRlc3RTZXJ2aWNlKCZzZWxmLCBfYXJnX25hbWU6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0dldE90aGVyVGVzdFNlcnZpY2UoX2FyZ19uYW1lKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0T3RoZXJUZXN0U2VydmljZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRPdGhlclRlc3RTZXJ2aWNlKF9hcmdfbmFtZSwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gVmVyaWZ5TmFtZSgmc2VsZiwgX2FyZ19zZXJ2aWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXRJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0dldEludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXRJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0SW50ZXJmYWNlTGlzdCgmc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0SW50ZXJmYWNlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRJbnRlcmZhY2VMaXN0KF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pl0+LCBfYXJnX25hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZVN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmc2VsZiwgX2FyZ19yZWFkOiAmYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoX2FyZ19yZWFkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoX2FyZ19yZWFkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKCZzZWxmLCBfYXJnX2NvZGU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1Rocm93U2VydmljZUV4Y2VwdGlvbihfYXJnX2NvZGUpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUaHJvd1NlcnZpY2VFeGNlcHRpb24sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbaTMyXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8aTMyPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50QXJyYXkoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlSW50QXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtXT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5KF9hcmdfaW5wdXQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUxvbmdFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZzdHI+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlU3RyaW5nKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiAmYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGFrZXNBbklCaW5kZXIsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JmJpbmRlcjo6U3BJQmluZGVyPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0KT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGFrZXNBTnVsbGFibGVJQmluZGVyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBUYWtlc0FuSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBbklCaW5kZXJMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdFV0ZjhDcHBTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0VXRmOENwcFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZygmc2VsZiwgX2FyZ19pbnB1dDogJltTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8U3RyaW5nPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXRDYWxsYmFjaygmc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRDYWxsYmFjayhfYXJnX3JldHVybl9udWxsKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0Q2FsbGJhY2ssIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0Q2FsbGJhY2soX2FyZ19yZXR1cm5fbnVsbCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoX2FyZ19wYXJjZWwsIF9haWRsX3JlcGx5KQorICB9CisgIGZuIFJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX2VwOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUsIF9hcmdfZXAyOiAmbXV0IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZ19lcCwgX2FyZ19lcDIpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZShfYXJnX2VwLCBfYXJnX2VwMiwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIF9hcmdfbGlzdDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3Q+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VMaXN0KF9hcmdfbGlzdCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VMaXN0KF9hcmdfbGlzdCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTcElCaW5kZXI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlSUJpbmRlckFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gR2V0T2xkTmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfSU9sZE5hbWU+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRPbGROYW1lSW50ZXJmYWNlKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE9sZE5hbWVJbnRlcmZhY2UsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0T2xkTmFtZUludGVyZmFjZShfYWlkbF9yZXBseSkKKyAgfQorICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JTmV3TmFtZT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX0dldE5ld05hbWVJbnRlcmZhY2UoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6R2V0TmV3TmFtZUludGVyZmFjZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROZXdOYW1lSW50ZXJmYWNlKF9haWRsX3JlcGx5KQorICB9CisgIGZuIEdldENwcEphdmFUZXN0cygmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfR2V0Q3BwSmF2YVRlc3RzKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldENwcEphdmFUZXN0cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRDcHBKYXZhVGVzdHMoX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX0JhY2tlbmRUeXBlPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9nZXRCYWNrZW5kVHlwZSgpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpnZXRCYWNrZW5kVHlwZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9nZXRCYWNrZW5kVHlwZShfYWlkbF9yZXBseSkKKyAgfQogfQotZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJVGVzdFNlcnZpY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKK2ltcGw8UDogYmluZGVyOjpCaW5kZXJBc3luY1Bvb2w+IElUZXN0U2VydmljZUFzeW5jPFA+IGZvciBCcFRlc3RTZXJ2aWNlIHsKKyAgZm4gVW5pbXBsZW1lbnRlZE1ldGhvZDwnYT4oJidhIHNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpMzI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9VbmltcGxlbWVudGVkTWV0aG9kKF9hcmdfYXJnKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpVbmltcGxlbWVudGVkTWV0aG9kLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9VbmltcGxlbWVudGVkTWV0aG9kKF9hcmdfYXJnLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gRGVwcmVjYXRlZDwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0RlcHJlY2F0ZWQoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpEZXByZWNhdGVkLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9EZXByZWNhdGVkKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBUZXN0T25ld2F5KCZzZWxmKSAtPiBzdGQ6OmZ1dHVyZTo6UmVhZHk8YmluZGVyOjpSZXN1bHQ8KCk+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9UZXN0T25ld2F5KCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpLAorICAgIH07CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6VGVzdE9uZXdheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19PTkVXQVkgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc3RkOjpmdXR1cmU6OnJlYWR5KHNlbGYucmVhZF9yZXNwb25zZV9UZXN0T25ld2F5KF9haWRsX3JlcGx5KSkKKyAgfQorICBmbiBSZXBlYXRCb29sZWFuPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogYm9vbCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRCb29sZWFuKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEJvb2xlYW4sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEJvb2xlYW4oX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdEJ5dGU8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGk4Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0Qnl0ZShfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCeXRlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRCeXRlKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXRDaGFyPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogdTE2KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8dTE2Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0Q2hhcihfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRDaGFyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRDaGFyKF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXRJbnQ8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBpMzIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpMzI+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRJbnQoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0SW50LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRJbnQoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdExvbmc8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBpNjQpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxpNjQ+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRMb25nKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdExvbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdExvbmcoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdEZsb2F0PCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogZjMyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8ZjMyPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0RmxvYXQoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0RmxvYXQsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEZsb2F0KF9hcmdfdG9rZW4sIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXREb3VibGU8J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBmNjQpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxmNjQ+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXREb3VibGUoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0RG91YmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXREb3VibGUoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdFN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfdG9rZW46ICYnYSBzdHIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRTdHJpbmcoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0U3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRTdHJpbmcoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdEJ5dGVFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRCeXRlRW51bShfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRCeXRlRW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0Qnl0ZUVudW0oX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdEludEVudW08J2E+KCYnYSBzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRJbnRFbnVtKF9hcmdfdG9rZW4pIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdEludEVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdEludEVudW0oX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdExvbmdFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRMb25nRW51bShfYXJnX3Rva2VuKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRMb25nRW51bSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TG9uZ0VudW0oX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VCb29sZWFuPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtib29sXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8Ym9vbD4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Ym9vbD4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQm9vbGVhbihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQm9vbGVhbiwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUJvb2xlYW4oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VCeXRlPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFt1OF0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPHU4PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzx1OD4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQnl0ZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUJ5dGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VDaGFyPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFt1MTZdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzx1MTY+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPHUxNj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlQ2hhcihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQ2hhciwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUNoYXIoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VJbnQ8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2kzMl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGkzMj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8aTMyPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJbnQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUludCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUludChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUxvbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2k2NF0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGk2ND4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8aTY0Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VMb25nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VMb25nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTG9uZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUZsb2F0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtmMzJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxmMzI+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPGYzMj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlRmxvYXQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUZsb2F0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlRmxvYXQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VEb3VibGU8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2Y2NF0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGY2ND4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8ZjY0Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VEb3VibGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZURvdWJsZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZURvdWJsZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZVN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbU3RyaW5nXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8U3RyaW5nPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZVN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlQnl0ZUVudW08J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlQnl0ZUVudW0sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VCeXRlRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUludEVudW08J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VJbnRFbnVtKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VJbnRFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlSW50RW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUxvbmdFbnVtPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtXSwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlTG9uZ0VudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZUxvbmdFbnVtLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlTG9uZ0VudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldE90aGVyVGVzdFNlcnZpY2U8J2E+KCYnYSBzZWxmLCBfYXJnX25hbWU6ICYnYSBzdHIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0T3RoZXJUZXN0U2VydmljZShfYXJnX25hbWUpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldE90aGVyVGVzdFNlcnZpY2UsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldE90aGVyVGVzdFNlcnZpY2UoX2FyZ19uYW1lLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVmVyaWZ5TmFtZTwnYT4oJidhIHNlbGYsIF9hcmdfc2VydmljZTogJidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4sIF9hcmdfbmFtZTogJidhIHN0cikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gR2V0SW50ZXJmYWNlQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX25hbWVzOiAmJ2EgW1N0cmluZ10pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXRJbnRlcmZhY2VBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0SW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19zZXJ2aWNlczogJidhIFtiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJidhIFtTdHJpbmddKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Ym9vbD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX25hbWVzKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXROdWxsYWJsZUludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19zZXJ2aWNlczogT3B0aW9uPCYnYSBbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+XT4sIF9hcmdfbmFtZXM6IE9wdGlvbjwmJ2EgW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxib29sPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBHZXRJbnRlcmZhY2VMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9HZXRJbnRlcmZhY2VMaXN0KF9hcmdfbmFtZXMpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldEludGVyZmFjZUxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX0dldEludGVyZmFjZUxpc3QoX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJvb2w+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KF9hcmdfc2VydmljZXMsIF9hcmdfbmFtZXMpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1ZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcywgX2FyZ19uYW1lcywgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VTdHJpbmdMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZVN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yPCdhPigmJ2Egc2VsZiwgX2FyZ19yZWFkOiAmJ2EgYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnX3JlYWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnX3JlYWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICYnYSBtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbjwnYT4oJidhIHNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9UaHJvd1NlcnZpY2VFeGNlcHRpb24oX2FyZ19jb2RlKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUaHJvd1NlcnZpY2VFeGNlcHRpb24sIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rocm93U2VydmljZUV4Y2VwdGlvbihfYXJnX2NvZGUsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbaTMyXT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGkzMj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUludEFycmF5LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZUludEFycmF5KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtXT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUJ5dGVFbnVtQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheShfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXk8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZUludEVudW1BcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW1dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZzwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2Egc3RyPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmcoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVTdHJpbmcsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JlcGVhdE51bGxhYmxlU3RyaW5nKF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVN0cmluZ0xpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGU8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pl0+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoX2FyZ19pbnB1dCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3Q8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZ19pbnB1dCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVGFrZXNBbklCaW5kZXI8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiAmJ2EgYmluZGVyOjpTcElCaW5kZXIpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQW5JQmluZGVyKF9hcmdfaW5wdXQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlRha2VzQW5JQmluZGVyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9UYWtlc0FuSUJpbmRlcihfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBiaW5kZXI6OlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FOdWxsYWJsZUlCaW5kZXIsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rha2VzQU51bGxhYmxlSUJpbmRlcihfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVGFrZXNBbklCaW5kZXJMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtiaW5kZXI6OlNwSUJpbmRlcl0pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1Rha2VzQW5JQmluZGVyTGlzdChfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlckxpc3QsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Rha2VzQW5JQmluZGVyTGlzdChfYXJnX2lucHV0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChfYXJnX2lucHV0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9UYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KF9hcmdfaW5wdXQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogJidhIHN0cikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFN0cmluZz4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0VXRmOENwcFN0cmluZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0VXRmOENwcFN0cmluZyhfYXJnX3Rva2VuLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ190b2tlbjogT3B0aW9uPCYnYSBzdHI+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbiwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nPCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogJidhIFtTdHJpbmddLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxTdHJpbmc+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8VmVjPFN0cmluZz4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlVXRmOENwcFN0cmluZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmc8J2E+KCYnYSBzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JidhIFtPcHRpb248U3RyaW5nPl0+LCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZU51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0PCdhPigmJ2Egc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCYnYSBbT3B0aW9uPFN0cmluZz5dPiwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0LCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9SZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIEdldENhbGxiYWNrPCdhPigmJ2Egc2VsZiwgX2FyZ19yZXR1cm5fbnVsbDogYm9vbCkgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldENhbGxiYWNrKF9hcmdfcmV0dXJuX251bGwpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldENhbGxiYWNrLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRDYWxsYmFjayhfYXJnX3JldHVybl9udWxsLCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlPCdhPigmJ2Egc2VsZiwgX2FyZ19wYXJjZWw6ICYnYSBtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGUpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0ZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6RmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoX2FyZ19wYXJjZWwsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZTwnYT4oJidhIHNlbGYsIF9hcmdfZXA6ICYnYSBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FyZ19lcDI6ICYnYSBtdXQgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fMjBfRXh0ZW5kYWJsZVBhcmNlbGFibGUpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX1JlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKF9hcmdfZXAsIF9hcmdfZXAyKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoX2FyZ19lcCwgX2FyZ19lcDIsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBSZXZlcnNlTGlzdDwnYT4oJidhIHNlbGYsIF9hcmdfbGlzdDogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEzX1JlY3Vyc2l2ZUxpc3QpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZUxpc3QoX2FyZ19saXN0KSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpSZXZlcnNlTGlzdCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZUxpc3QoX2FyZ19saXN0LCBfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gUmV2ZXJzZUlCaW5kZXJBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6ICYnYSBbYmluZGVyOjpTcElCaW5kZXJdLCBfYXJnX3JlcGVhdGVkOiAmJ2EgbXV0IFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9SZXZlcnNlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VJQmluZGVyQXJyYXksIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1JldmVyc2VJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCwgX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheTwnYT4oJidhIHNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPiwgX2FyZ19yZXBlYXRlZDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+Pj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lPbGROYW1lPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldE9sZE5hbWVJbnRlcmZhY2UoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXRPbGROYW1lSW50ZXJmYWNlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXRPbGROYW1lSW50ZXJmYWNlKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlPCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldE5ld05hbWVJbnRlcmZhY2UoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpHZXROZXdOYW1lSW50ZXJmYWNlLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX0NMRUFSX0JVRiB8IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICBtb3ZlIHxfYWlkbF9yZXBseXwgYXN5bmMgbW92ZSB7CisgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9HZXROZXdOYW1lSW50ZXJmYWNlKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBHZXRDcHBKYXZhVGVzdHM8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX0dldENwcEphdmFUZXN0cygpIHsKKyAgICAgIE9rKF9haWRsX2RhdGEpID0+IF9haWRsX2RhdGEsCisgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgfTsKKyAgICBsZXQgYmluZGVyID0gc2VsZi5iaW5kZXIuY2xvbmUoKTsKKyAgICBQOjpzcGF3bigKKyAgICAgIG1vdmUgfHwgYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OkdldENwcEphdmFUZXN0cywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19DTEVBUl9CVUYgfCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfR2V0Q3BwSmF2YVRlc3RzKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBnZXRCYWNrZW5kVHlwZTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX2dldEJhY2tlbmRUeXBlKCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6Z2V0QmFja2VuZFR5cGUsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfQ0xFQVJfQlVGIHwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2dldEJhY2tlbmRUeXBlKF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorfQoraW1wbCBJVGVzdFNlcnZpY2UgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCblRlc3RTZXJ2aWNlPiB7CisgIGZuIFVuaW1wbGVtZW50ZWRNZXRob2QoJnNlbGYsIF9hcmdfYXJnOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geyBzZWxmLjAuVW5pbXBsZW1lbnRlZE1ldGhvZChfYXJnX2FyZykgfQorICBmbiBEZXByZWNhdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuRGVwcmVjYXRlZCgpIH0KKyAgZm4gVGVzdE9uZXdheSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLlRlc3RPbmV3YXkoKSB9CisgIGZuIFJlcGVhdEJvb2xlYW4oJnNlbGYsIF9hcmdfdG9rZW46IGJvb2wpIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsgc2VsZi4wLlJlcGVhdEJvb2xlYW4oX2FyZ190b2tlbikgfQorICBmbiBSZXBlYXRCeXRlKCZzZWxmLCBfYXJnX3Rva2VuOiBpOCkgLT4gYmluZGVyOjpSZXN1bHQ8aTg+IHsgc2VsZi4wLlJlcGVhdEJ5dGUoX2FyZ190b2tlbikgfQorICBmbiBSZXBlYXRDaGFyKCZzZWxmLCBfYXJnX3Rva2VuOiB1MTYpIC0+IGJpbmRlcjo6UmVzdWx0PHUxNj4geyBzZWxmLjAuUmVwZWF0Q2hhcihfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdEludCgmc2VsZiwgX2FyZ190b2tlbjogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDxpMzI+IHsgc2VsZi4wLlJlcGVhdEludChfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdExvbmcoJnNlbGYsIF9hcmdfdG9rZW46IGk2NCkgLT4gYmluZGVyOjpSZXN1bHQ8aTY0PiB7IHNlbGYuMC5SZXBlYXRMb25nKF9hcmdfdG9rZW4pIH0KKyAgZm4gUmVwZWF0RmxvYXQoJnNlbGYsIF9hcmdfdG9rZW46IGYzMikgLT4gYmluZGVyOjpSZXN1bHQ8ZjMyPiB7IHNlbGYuMC5SZXBlYXRGbG9hdChfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdERvdWJsZSgmc2VsZiwgX2FyZ190b2tlbjogZjY0KSAtPiBiaW5kZXI6OlJlc3VsdDxmNjQ+IHsgc2VsZi4wLlJlcGVhdERvdWJsZShfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgX2FyZ190b2tlbjogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7IHNlbGYuMC5SZXBlYXRTdHJpbmcoX2FyZ190b2tlbikgfQorICBmbiBSZXBlYXRCeXRlRW51bSgmc2VsZiwgX2FyZ190b2tlbjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bT4geyBzZWxmLjAuUmVwZWF0Qnl0ZUVudW0oX2FyZ190b2tlbikgfQorICBmbiBSZXBlYXRJbnRFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0pIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4geyBzZWxmLjAuUmVwZWF0SW50RW51bShfYXJnX3Rva2VuKSB9CisgIGZuIFJlcGVhdExvbmdFbnVtKCZzZWxmLCBfYXJnX3Rva2VuOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0xvbmdFbnVtPiB7IHNlbGYuMC5SZXBlYXRMb25nRW51bShfYXJnX3Rva2VuKSB9CisgIGZuIFJldmVyc2VCb29sZWFuKCZzZWxmLCBfYXJnX2lucHV0OiAmW2Jvb2xdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxib29sPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJvb2w+PiB7IHNlbGYuMC5SZXZlcnNlQm9vbGVhbihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VCeXRlKCZzZWxmLCBfYXJnX2lucHV0OiAmW3U4XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8dTg+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8dTg+PiB7IHNlbGYuMC5SZXZlcnNlQnl0ZShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VDaGFyKCZzZWxmLCBfYXJnX2lucHV0OiAmW3UxNl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPHUxNj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzx1MTY+PiB7IHNlbGYuMC5SZXZlcnNlQ2hhcihfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VJbnQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbaTMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8aTMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGkzMj4+IHsgc2VsZi4wLlJldmVyc2VJbnQoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlTG9uZygmc2VsZiwgX2FyZ19pbnB1dDogJltpNjRdLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxpNjQ+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8aTY0Pj4geyBzZWxmLjAuUmV2ZXJzZUxvbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlRmxvYXQoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjMyXSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjMyPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGYzMj4+IHsgc2VsZi4wLlJldmVyc2VGbG9hdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VEb3VibGUoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbZjY0XSwgX2FyZ19yZXBlYXRlZDogJm11dCBWZWM8ZjY0PikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGY2ND4+IHsgc2VsZi4wLlJldmVyc2VEb3VibGUoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7IHNlbGYuMC5SZXZlcnNlU3RyaW5nKF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZUJ5dGVFbnVtKCZzZWxmLCBfYXJnX2lucHV0OiAmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0J5dGVFbnVtPikgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+PiB7IHNlbGYuMC5SZXZlcnNlQnl0ZUVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlSW50RW51bSgmc2VsZiwgX2FyZ19pbnB1dDogJltjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW1dLCBfYXJnX3JlcGVhdGVkOiAmbXV0IFZlYzxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtPj4geyBzZWxmLjAuUmV2ZXJzZUludEVudW0oX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlTG9uZ0VudW0oJnNlbGYsIF9hcmdfaW5wdXQ6ICZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bT4+IHsgc2VsZi4wLlJldmVyc2VMb25nRW51bShfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIEdldE90aGVyVGVzdFNlcnZpY2UoJnNlbGYsIF9hcmdfbmFtZTogJnN0cikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4geyBzZWxmLjAuR2V0T3RoZXJUZXN0U2VydmljZShfYXJnX25hbWUpIH0KKyAgZm4gVmVyaWZ5TmFtZSgmc2VsZiwgX2FyZ19zZXJ2aWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPiwgX2FyZ19uYW1lOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7IHNlbGYuMC5WZXJpZnlOYW1lKF9hcmdfc2VydmljZSwgX2FyZ19uYW1lKSB9CisgIGZuIEdldEludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX25hbWVzOiAmW1N0cmluZ10pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4geyBzZWxmLjAuR2V0SW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcykgfQorICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmc2VsZiwgX2FyZ19zZXJ2aWNlczogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+XSwgX2FyZ19uYW1lczogJltTdHJpbmddKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7IHNlbGYuMC5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKSB9CisgIGZuIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoJnNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+IHsgc2VsZi4wLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcykgfQorICBmbiBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geyBzZWxmLjAuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKSB9CisgIGZuIEdldEludGVyZmFjZUxpc3QoJnNlbGYsIF9hcmdfbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNF9JTmFtZWRDYWxsYmFjaz4+Pj4+IHsgc2VsZi4wLkdldEludGVyZmFjZUxpc3QoX2FyZ19uYW1lcykgfQorICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KCZzZWxmLCBfYXJnX3NlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj5dPiwgX2FyZ19uYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPikgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geyBzZWxmLjAuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChfYXJnX3NlcnZpY2VzLCBfYXJnX25hbWVzKSB9CisgIGZuIFJldmVyc2VTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7IHNlbGYuMC5SZXZlcnNlU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yKCZzZWxmLCBfYXJnX3JlYWQ6ICZiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiB7IHNlbGYuMC5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcihfYXJnX3JlYWQpIH0KKyAgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6ICZbYmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4geyBzZWxmLjAuUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBUaHJvd1NlcnZpY2VFeGNlcHRpb24oJnNlbGYsIF9hcmdfY29kZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGhyb3dTZXJ2aWNlRXhjZXB0aW9uKF9hcmdfY29kZSkgfQorICBmbiBSZXBlYXROdWxsYWJsZUludEFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltpMzJdPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxpMzI+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVJbnRBcnJheShfYXJnX2lucHV0KSB9CisgIGZuIFJlcGVhdE51bGxhYmxlQnl0ZUVudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5KF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVJbnRFbnVtQXJyYXkoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW2NyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bT4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZUludEVudW1BcnJheShfYXJnX2lucHV0KSB9CisgIGZuIFJlcGVhdE51bGxhYmxlTG9uZ0VudW1BcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZbY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bV0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0+Pj4geyBzZWxmLjAuUmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5KF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlU3RyaW5nKF9hcmdfaW5wdXQpIH0KKyAgZm4gUmVwZWF0TnVsbGFibGVTdHJpbmdMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlU3RyaW5nTGlzdChfYXJnX2lucHV0KSB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19pbnB1dDogT3B0aW9uPCZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShfYXJnX2lucHV0KSB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+XT4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+PiB7IHNlbGYuMC5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0KSB9CisgIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT5dPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZ19pbnB1dCkgfQorICBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgX2FyZ19pbnB1dDogJmJpbmRlcjo6U3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGFrZXNBbklCaW5kZXIoX2FyZ19pbnB1dCkgfQorICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXIoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmYmluZGVyOjpTcElCaW5kZXI+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuVGFrZXNBTnVsbGFibGVJQmluZGVyKF9hcmdfaW5wdXQpIH0KKyAgZm4gVGFrZXNBbklCaW5kZXJMaXN0KCZzZWxmLCBfYXJnX2lucHV0OiAmW2JpbmRlcjo6U3BJQmluZGVyXSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLlRha2VzQW5JQmluZGVyTGlzdChfYXJnX2lucHV0KSB9CisgIGZuIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj5dPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dCkgfQorICBmbiBSZXBlYXRVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX3Rva2VuOiAmc3RyKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsgc2VsZi4wLlJlcGVhdFV0ZjhDcHBTdHJpbmcoX2FyZ190b2tlbikgfQorICBmbiBSZXBlYXROdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfdG9rZW46IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsgc2VsZi4wLlJlcGVhdE51bGxhYmxlVXRmOENwcFN0cmluZyhfYXJnX3Rva2VuKSB9CisgIGZuIFJldmVyc2VVdGY4Q3BwU3RyaW5nKCZzZWxmLCBfYXJnX2lucHV0OiAmW1N0cmluZ10sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPFN0cmluZz4pIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTdHJpbmc+PiB7IHNlbGYuMC5SZXZlcnNlVXRmOENwcFN0cmluZyhfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBSZXZlcnNlVXRmOENwcFN0cmluZ0xpc3QoJnNlbGYsIF9hcmdfaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4+IHsgc2VsZi4wLlJldmVyc2VVdGY4Q3BwU3RyaW5nTGlzdChfYXJnX2lucHV0LCBfYXJnX3JlcGVhdGVkKSB9CisgIGZuIEdldENhbGxiYWNrKCZzZWxmLCBfYXJnX3JldHVybl9udWxsOiBib29sKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+IHsgc2VsZi4wLkdldENhbGxiYWNrKF9hcmdfcmV0dXJuX251bGwpIH0KKyAgZm4gRmlsbE91dFN0cnVjdHVyZWRQYXJjZWxhYmxlKCZzZWxmLCBfYXJnX3BhcmNlbDogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMF9TdHJ1Y3R1cmVkUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLkZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZShfYXJnX3BhcmNlbCkgfQorICBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgmc2VsZiwgX2FyZ19lcDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlLCBfYXJnX2VwMjogJm11dCBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKF9hcmdfZXAsIF9hcmdfZXAyKSB9CisgIGZuIFJldmVyc2VMaXN0KCZzZWxmLCBfYXJnX2xpc3Q6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0PiB7IHNlbGYuMC5SZXZlcnNlTGlzdChfYXJnX2xpc3QpIH0KKyAgZm4gUmV2ZXJzZUlCaW5kZXJBcnJheSgmc2VsZiwgX2FyZ19pbnB1dDogJltiaW5kZXI6OlNwSUJpbmRlcl0sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxWZWM8YmluZGVyOjpTcElCaW5kZXI+PiB7IHNlbGYuMC5SZXZlcnNlSUJpbmRlckFycmF5KF9hcmdfaW5wdXQsIF9hcmdfcmVwZWF0ZWQpIH0KKyAgZm4gUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCZzZWxmLCBfYXJnX2lucHV0OiBPcHRpb248JltPcHRpb248YmluZGVyOjpTcElCaW5kZXI+XT4sIF9hcmdfcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+PiB7IHNlbGYuMC5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoX2FyZ19pbnB1dCwgX2FyZ19yZXBlYXRlZCkgfQorICBmbiBHZXRPbGROYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9JT2xkTmFtZT4+IHsgc2VsZi4wLkdldE9sZE5hbWVJbnRlcmZhY2UoKSB9CisgIGZuIEdldE5ld05hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c184X0lOZXdOYW1lPj4geyBzZWxmLjAuR2V0TmV3TmFtZUludGVyZmFjZSgpIH0KKyAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiB7IHNlbGYuMC5HZXRDcHBKYXZhVGVzdHMoKSB9CisgIGZuIGdldEJhY2tlbmRUeXBlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMV9CYWNrZW5kVHlwZT4geyBzZWxmLjAuZ2V0QmFja2VuZFR5cGUoKSB9Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElUZXN0U2VydmljZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICBtYXRjaCBfYWlkbF9jb2RlIHsKICAgICB0cmFuc2FjdGlvbnM6OlVuaW1wbGVtZW50ZWRNZXRob2QgPT4gewogICAgICAgbGV0IF9hcmdfYXJnOiBpMzIgPSBfYWlkbF9kYXRhLnJlYWQoKT87CkBAIC0xNjQ4LDYgKzM1NzAsODEgQEAKICAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OkdldEludGVyZmFjZUFycmF5ID0+IHsKKyAgICAgIGxldCBfYXJnX25hbWVzOiBWZWM8U3RyaW5nPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLkdldEludGVyZmFjZUFycmF5KCZfYXJnX25hbWVzKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlQXJyYXkgPT4geworICAgICAgbGV0IF9hcmdfc2VydmljZXM6IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX25hbWVzOiBWZWM8U3RyaW5nPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KCZfYXJnX3NlcnZpY2VzLCAmX2FyZ19uYW1lcyk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkgPT4geworICAgICAgbGV0IF9hcmdfbmFtZXM6IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoX2FyZ19uYW1lcy5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6VmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSA9PiB7CisgICAgICBsZXQgX2FyZ19zZXJ2aWNlczogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE0X0lOYW1lZENhbGxiYWNrPj4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX25hbWVzOiBPcHRpb248VmVjPE9wdGlvbjxTdHJpbmc+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KF9hcmdfc2VydmljZXMuYXNfZGVyZWYoKSwgX2FyZ19uYW1lcy5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIHRyYW5zYWN0aW9uczo6R2V0SW50ZXJmYWNlTGlzdCA9PiB7CisgICAgICBsZXQgX2FyZ19uYW1lczogT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuR2V0SW50ZXJmYWNlTGlzdChfYXJnX25hbWVzLmFzX2RlcmVmKCkpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0ID0+IHsKKyAgICAgIGxldCBfYXJnX3NlcnZpY2VzOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTRfSU5hbWVkQ2FsbGJhY2s+Pj4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9hcmdfbmFtZXM6IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoX2FyZ19zZXJ2aWNlcy5hc19kZXJlZigpLCBfYXJnX25hbWVzLmFzX2RlcmVmKCkpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CiAgICAgdHJhbnNhY3Rpb25zOjpSZXZlcnNlU3RyaW5nTGlzdCA9PiB7CiAgICAgICBsZXQgX2FyZ19pbnB1dDogVmVjPFN0cmluZz4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CiAgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFZlYzxTdHJpbmc+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOwpAQCAtMTY2Myw3ICszNjYwLDcgQEAKICAgICAgIE9rKCgpKQogICAgIH0KICAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdFBhcmNlbEZpbGVEZXNjcmlwdG9yID0+IHsKLSAgICAgIGxldCBfYXJnX3JlYWQ6IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvciA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX3JlYWQ6IGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3IgPSBfYWlkbF9kYXRhLnJlYWQoKT87CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXBlYXRQYXJjZWxGaWxlRGVzY3JpcHRvcigmX2FyZ19yZWFkKTsKICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4gewogICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKQEAgLTE2NzUsOCArMzY3Miw4IEBACiAgICAgICBPaygoKSkKICAgICB9CiAgICAgdHJhbnNhY3Rpb25zOjpSZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSA9PiB7Ci0gICAgICBsZXQgX2FyZ19pbnB1dDogVmVjPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87Ci0gICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFZlYzxPcHRpb248YmluZGVyOjpwYXJjZWw6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPj4gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICBsZXQgX2FyZ19pbnB1dDogVmVjPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IG11dCBfYXJnX3JlcGVhdGVkOiBWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+PiA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKICAgICAgIF9haWRsX2RhdGEucmVzaXplX291dF92ZWMoJm11dCBfYXJnX3JlcGVhdGVkKT87CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXZlcnNlUGFyY2VsRmlsZURlc2NyaXB0b3JBcnJheSgmX2FyZ19pbnB1dCwgJm11dCBfYXJnX3JlcGVhdGVkKTsKICAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4gewpAQCAtMTc3NCw3ICszNzcxLDcgQEAKICAgICAgIE9rKCgpKQogICAgIH0KICAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSA9PiB7Ci0gICAgICBsZXQgX2FyZ19pbnB1dDogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIwX1N0cnVjdHVyZWRQYXJjZWxhYmxlPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OwogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlKF9hcmdfaW5wdXQuYXNfcmVmKCkpOwogICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CiAgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4gewpAQCAtMTc4NSw2ICszNzgyLDMwIEBACiAgICAgICB9CiAgICAgICBPaygoKSkKICAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSA9PiB7CisgICAgICBsZXQgX2FyZ19pbnB1dDogT3B0aW9uPFZlYzxPcHRpb248Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShfYXJnX2lucHV0LmFzX2RlcmVmKCkpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVMaXN0ID0+IHsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBPcHRpb248VmVjPE9wdGlvbjxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eT4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoX2FyZ19pbnB1dC5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9yZXR1cm4pPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQogICAgIHRyYW5zYWN0aW9uczo6VGFrZXNBbklCaW5kZXIgPT4gewogICAgICAgbGV0IF9hcmdfaW5wdXQ6IGJpbmRlcjo6U3BJQmluZGVyID0gX2FpZGxfZGF0YS5yZWFkKCk/OwogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuVGFrZXNBbklCaW5kZXIoJl9hcmdfaW5wdXQpOwpAQCAtMTgwNyw2ICszODI4LDI4IEBACiAgICAgICB9CiAgICAgICBPaygoKSkKICAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpUYWtlc0FuSUJpbmRlckxpc3QgPT4geworICAgICAgbGV0IF9hcmdfaW5wdXQ6IFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5UYWtlc0FuSUJpbmRlckxpc3QoJl9hcmdfaW5wdXQpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0ID0+IHsKKyAgICAgIGxldCBfYXJnX2lucHV0OiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoX2FyZ19pbnB1dC5hc19kZXJlZigpKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQogICAgIHRyYW5zYWN0aW9uczo6UmVwZWF0VXRmOENwcFN0cmluZyA9PiB7CiAgICAgICBsZXQgX2FyZ190b2tlbjogU3RyaW5nID0gX2FpZGxfZGF0YS5yZWFkKCk/OwogICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0VXRmOENwcFN0cmluZygmX2FyZ190b2tlbik7CkBAIC0xODk5LDYgKzM5NDIsNjEgQEAKICAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlID0+IHsKKyAgICAgIGxldCBfYXJnX2VwOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl8yMF9FeHRlbmRhYmxlUGFyY2VsYWJsZSA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBtdXQgX2FyZ19lcDI6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoJl9hcmdfZXAsICZtdXQgX2FyZ19lcDIpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX2VwMik/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpSZXZlcnNlTGlzdCA9PiB7CisgICAgICBsZXQgX2FyZ19saXN0OiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xM19SZWN1cnNpdmVMaXN0ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuUmV2ZXJzZUxpc3QoJl9hcmdfbGlzdCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OlJldmVyc2VJQmluZGVyQXJyYXkgPT4geworICAgICAgbGV0IF9hcmdfaW5wdXQ6IFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+PiA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICAgIF9haWRsX2RhdGEucmVzaXplX291dF92ZWMoJm11dCBfYXJnX3JlcGVhdGVkKT87CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5SZXZlcnNlSUJpbmRlckFycmF5KCZfYXJnX2lucHV0LCAmbXV0IF9hcmdfcmVwZWF0ZWQpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3JldHVybik/OworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX3JlcGVhdGVkKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSA9PiB7CisgICAgICBsZXQgX2FyZ19pbnB1dDogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4gPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICBsZXQgbXV0IF9hcmdfcmVwZWF0ZWQ6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgX2FpZGxfZGF0YS5yZXNpemVfbnVsbGFibGVfb3V0X3ZlYygmbXV0IF9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLlJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheShfYXJnX2lucHV0LmFzX2RlcmVmKCksICZtdXQgX2FyZ19yZXBlYXRlZCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfcmVwZWF0ZWQpPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQogICAgIHRyYW5zYWN0aW9uczo6R2V0T2xkTmFtZUludGVyZmFjZSA9PiB7CiAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5HZXRPbGROYW1lSW50ZXJmYWNlKCk7CiAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKQEAgLTE5NDYsMyArNDA0NCwxNzQgQEAKICAgICBfID0+IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pCiAgIH0KIH0KK3B1YiBtb2QgRW1wdHkgeworICAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCisgIHB1YiBzdHJ1Y3QgRW1wdHkgeworICB9CisgIGltcGwgRGVmYXVsdCBmb3IgRW1wdHkgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRW1wdHkgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFbXB0eSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRW1wdHkpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRW1wdHkgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuRW1wdHkiIH0KKyAgfQorfQorcHViIG1vZCBDb21waWxlckNoZWNrcyB7CisgICNbZGVyaXZlKERlYnVnKV0KKyAgcHViIHN0cnVjdCBDb21waWxlckNoZWNrcyB7CisgICAgcHViIGJpbmRlcjogT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPiwKKyAgICBwdWIgbnVsbGFibGVfYmluZGVyOiBPcHRpb248YmluZGVyOjpTcElCaW5kZXI+LAorICAgIHB1YiBiaW5kZXJfYXJyYXk6IFZlYzxiaW5kZXI6OlNwSUJpbmRlcj4sCisgICAgcHViIG51bGxhYmxlX2JpbmRlcl9hcnJheTogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4sCisgICAgcHViIGJpbmRlcl9saXN0OiBWZWM8YmluZGVyOjpTcElCaW5kZXI+LAorICAgIHB1YiBudWxsYWJsZV9iaW5kZXJfbGlzdDogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTcElCaW5kZXI+Pj4sCisgICAgcHViIHBmZDogT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+LAorICAgIHB1YiBudWxsYWJsZV9wZmQ6IE9wdGlvbjxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiwKKyAgICBwdWIgcGZkX2FycmF5OiBWZWM8YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4sCisgICAgcHViIG51bGxhYmxlX3BmZF9hcnJheTogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4+PiwKKyAgICBwdWIgcGZkX2xpc3Q6IFZlYzxiaW5kZXI6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiwKKyAgICBwdWIgbnVsbGFibGVfcGZkX2xpc3Q6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+Pj4sCisgICAgcHViIHBhcmNlbDogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHksCisgICAgcHViIG51bGxhYmxlX3BhcmNlbDogT3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PiwKKyAgICBwdWIgcGFyY2VsX2FycmF5OiBWZWM8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTJfSVRlc3RTZXJ2aWNlXzVfRW1wdHk+LAorICAgIHB1YiBudWxsYWJsZV9wYXJjZWxfYXJyYXk6IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+LAorICAgIHB1YiBwYXJjZWxfbGlzdDogVmVjPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5PiwKKyAgICBwdWIgbnVsbGFibGVfcGFyY2VsX2xpc3Q6IE9wdGlvbjxWZWM8T3B0aW9uPGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZV81X0VtcHR5Pj4+LAorICB9CisgIGltcGwgRGVmYXVsdCBmb3IgQ29tcGlsZXJDaGVja3MgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgICBiaW5kZXI6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfYmluZGVyOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIGJpbmRlcl9hcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9iaW5kZXJfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgYmluZGVyX2xpc3Q6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfYmluZGVyX2xpc3Q6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgcGZkOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX3BmZDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBwZmRfYXJyYXk6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfcGZkX2FycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIHBmZF9saXN0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX3BmZF9saXN0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIHBhcmNlbDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9wYXJjZWw6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgcGFyY2VsX2FycmF5OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX3BhcmNlbF9hcnJheTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBwYXJjZWxfbGlzdDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgICBudWxsYWJsZV9wYXJjZWxfbGlzdDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgQ29tcGlsZXJDaGVja3MgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHNlbGYuYmluZGVyLmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZik/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfYmluZGVyKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5iaW5kZXJfYXJyYXkpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2JpbmRlcl9hcnJheSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYmluZGVyX2xpc3QpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2JpbmRlcl9saXN0KT87CisgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHNlbGYucGZkLmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZik/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfcGZkKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wZmRfYXJyYXkpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX3BmZF9hcnJheSk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGZkX2xpc3QpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX3BmZF9saXN0KT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5wYXJjZWwpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX3BhcmNlbCk/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsX2FycmF5KT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5udWxsYWJsZV9wYXJjZWxfYXJyYXkpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbF9saXN0KT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5udWxsYWJsZV9wYXJjZWxfbGlzdCk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuYmluZGVyID0gU29tZShzdWJwYXJjZWwucmVhZCgpPyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9iaW5kZXIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmJpbmRlcl9hcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfYmluZGVyX2FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5iaW5kZXJfbGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfYmluZGVyX2xpc3QgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLnBmZCA9IFNvbWUoc3VicGFyY2VsLnJlYWQoKT8pOworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfcGZkID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5wZmRfYXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX3BmZF9hcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYucGZkX2xpc3QgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX3BmZF9saXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5wYXJjZWwgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLm51bGxhYmxlX3BhcmNlbCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYucGFyY2VsX2FycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9wYXJjZWxfYXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgfQorICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLnBhcmNlbF9saXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9wYXJjZWxfbGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQ29tcGlsZXJDaGVja3MpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKENvbXBpbGVyQ2hlY2tzKTsKKyAgaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIENvbXBpbGVyQ2hlY2tzIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlLkNvbXBpbGVyQ2hlY2tzIiB9CisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OklUZXN0U2VydmljZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEyX0lUZXN0U2VydmljZTsKKyBwdWIgdXNlIHN1cGVyOjpFbXB0eTo6RW1wdHkgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfNV9FbXB0eTsKKyBwdWIgdXNlIHN1cGVyOjpDb21waWxlckNoZWNrczo6Q29tcGlsZXJDaGVja3MgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xMl9JVGVzdFNlcnZpY2VfMTRfQ29tcGlsZXJDaGVja3M7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JVGVzdFNlcnZpY2UucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycy5kCmluZGV4IDU3M2UzOTkuLjNmMjExMWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycy5kCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0lUZXN0U2VydmljZS5ycy5kCkBAIC03LDQgKzcsOCBAQAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvSU9sZE5hbWUuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTG9uZ0VudW0uYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvU3RydWN0dXJlZFBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Db25zdGFudEV4cHJlc3Npb25FbnVtLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0ucnMKaW5kZXggZmY5YzZhOS4uNWZmNGQ5NSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvSW50RW51bS5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLnJzCkBAIC0xLDggKzEsMTQgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOwotZGVjbGFyZV9iaW5kZXJfZW51bSEgeyBJbnRFbnVtIDogaTMyIHsKLSAgRk9PID0gMTAwMCwKLSAgQkFSID0gMjAwMCwKLSAgQkFaID0gMjAwMSwKLX0gfQotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OkludEVudW0gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c183X0ludEVudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgSW50RW51bSA6IFtpMzI7IDNdIHsKKyAgICBGT08gPSAxMDAwLAorICAgIEJBUiA9IDIwMDAsCisgICAgQkFaID0gMjAwMSwKKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SW50RW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzdfSW50RW51bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLnJzCkBAIC0wLDAgKzEsMzkwIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgTGlzdE9mSW50ZXJmYWNlcyB7Cit9CitpbXBsIERlZmF1bHQgZm9yIExpc3RPZkludGVyZmFjZXMgeworICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgU2VsZiB7CisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTGlzdE9mSW50ZXJmYWNlcyB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KK30KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKExpc3RPZkludGVyZmFjZXMpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShMaXN0T2ZJbnRlcmZhY2VzKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBMaXN0T2ZJbnRlcmZhY2VzIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMiIH0KK30KK3B1YiBtb2QgSUVtcHR5SW50ZXJmYWNlIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSUVtcHR5SW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiXSB7CisgICAgICBuYXRpdmU6IEJuRW1wdHlJbnRlcmZhY2Uob25fdHJhbnNhY3QpLAorICAgICAgcHJveHk6IEJwRW1wdHlJbnRlcmZhY2UgeworICAgICAgfSwKKyAgICAgIGFzeW5jOiBJRW1wdHlJbnRlcmZhY2VBc3luYywKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElFbXB0eUludGVyZmFjZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiIH0KKyAgICBmbiBnZXREZWZhdWx0SW1wbCgpIC0+IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgICAgfQorICAgIGZuIHNldERlZmF1bHRJbXBsKGQ6IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYpIC0+IElFbXB0eUludGVyZmFjZURlZmF1bHRSZWYgd2hlcmUgU2VsZjogU2l6ZWQgeworICAgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgICB9CisgIH0KKyAgcHViIHRyYWl0IElFbXB0eUludGVyZmFjZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5MaXN0T2ZJbnRlcmZhY2VzLklFbXB0eUludGVyZmFjZSIgfQorICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJRW1wdHlJbnRlcmZhY2VBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JRW1wdHlJbnRlcmZhY2UiIH0KKyAgfQorICBpbXBsIEJuRW1wdHlJbnRlcmZhY2UgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgICAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElFbXB0eUludGVyZmFjZT4KKyAgICB3aGVyZQorICAgICAgVDogSUVtcHR5SW50ZXJmYWNlQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICAgIF9pbm5lcjogVCwKKyAgICAgICAgX3J0OiBSLAorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgICAgfQorICAgICAgaW1wbDxULCBSPiBJRW1wdHlJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4KKyAgICAgIHdoZXJlCisgICAgICAgIFQ6IElFbXB0eUludGVyZmFjZUFzeW5jU2VydmVyICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICB7CisgICAgICB9CisgICAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUVtcHR5SW50ZXJmYWNlRGVmYXVsdDogU2VuZCArIFN5bmMgeworICB9CisgIHB1YiBtb2QgdHJhbnNhY3Rpb25zIHsKKyAgfQorICBwdWIgdHlwZSBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJRW1wdHlJbnRlcmZhY2VEZWZhdWx0Pj47CisgIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CisgIGxhenlfc3RhdGljISB7CisgICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SUVtcHR5SW50ZXJmYWNlRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CisgIH0KKyAgaW1wbCBCcEVtcHR5SW50ZXJmYWNlIHsKKyAgfQorICBpbXBsIElFbXB0eUludGVyZmFjZSBmb3IgQnBFbXB0eUludGVyZmFjZSB7CisgIH0KKyAgaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSUVtcHR5SW50ZXJmYWNlQXN5bmM8UD4gZm9yIEJwRW1wdHlJbnRlcmZhY2UgeworICB9CisgIGltcGwgSUVtcHR5SW50ZXJmYWNlIGZvciBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXI8Qm5FbXB0eUludGVyZmFjZT4geworICB9CisgIGZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSUVtcHR5SW50ZXJmYWNlLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggX2FpZGxfY29kZSB7CisgICAgICBfID0+IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pCisgICAgfQorICB9Cit9CitwdWIgbW9kIElNeUludGVyZmFjZSB7CisgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAjIVthbGxvdyhub25fc25ha2VfY2FzZSldCisgICNbYWxsb3codW51c2VkX2ltcG9ydHMpXSB1c2UgYmluZGVyOjpiaW5kZXJfaW1wbDo6SUJpbmRlckludGVybmFsOworICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CisgIGRlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgeworICAgIElNeUludGVyZmFjZVsiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIl0geworICAgICAgbmF0aXZlOiBCbk15SW50ZXJmYWNlKG9uX3RyYW5zYWN0KSwKKyAgICAgIHByb3h5OiBCcE15SW50ZXJmYWNlIHsKKyAgICAgIH0sCisgICAgICBhc3luYzogSU15SW50ZXJmYWNlQXN5bmMsCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2U6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIiB9CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2xpc3RfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfbGlzdF9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+OworICAgIGZuIGdldERlZmF1bHRJbXBsKCkgLT4gSU15SW50ZXJmYWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKKyAgICB9CisgICAgZm4gc2V0RGVmYXVsdEltcGwoZDogSU15SW50ZXJmYWNlRGVmYXVsdFJlZikgLT4gSU15SW50ZXJmYWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSU15SW50ZXJmYWNlQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLkxpc3RPZkludGVyZmFjZXMuSU15SW50ZXJmYWNlIiB9CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXM8J2E+KCYnYSBzZWxmLCBfYXJnX2lmYWNlOiAmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCYnYSBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmJ2EgW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmJ2EgbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICYnYSBtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmJ2EgW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmJ2EgbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4+OworICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2VBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5JTXlJbnRlcmZhY2UiIH0KKyAgICBhc3luYyBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj47CisgIH0KKyAgaW1wbCBCbk15SW50ZXJmYWNlIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGFzeW5jIGJpbmRlciBzZXJ2aWNlLgorICAgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJTXlJbnRlcmZhY2U+CisgICAgd2hlcmUKKyAgICAgIFQ6IElNeUludGVyZmFjZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgICBfaW5uZXI6IFQsCisgICAgICAgIF9ydDogUiwKKyAgICAgIH0KKyAgICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICAgIH0KKyAgICAgIGltcGw8VCwgUj4gSU15SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgICB3aGVyZQorICAgICAgICBUOiBJTXlJbnRlcmZhY2VBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgeworICAgICAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfbGlzdF9pbiwgX2FyZ19pZmFjZV9saXN0X291dCwgX2FyZ19pZmFjZV9saXN0X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCkpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICAgIFNlbGY6Om5ld19iaW5kZXIod3JhcHBlZCwgZmVhdHVyZXMpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJTXlJbnRlcmZhY2VEZWZhdWx0OiBTZW5kICsgU3luYyB7CisgICAgZm4gbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2xpc3RfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfbGlzdF9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IG1ldGhvZFdpdGhJbnRlcmZhY2VzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgfQorICBwdWIgdHlwZSBJTXlJbnRlcmZhY2VEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJTXlJbnRlcmZhY2VEZWZhdWx0Pj47CisgIHVzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CisgIGxhenlfc3RhdGljISB7CisgICAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SU15SW50ZXJmYWNlRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7CisgIH0KKyAgaW1wbCBCcE15SW50ZXJmYWNlIHsKKyAgICBmbiBidWlsZF9wYXJjZWxfbWV0aG9kV2l0aEludGVyZmFjZXMoJnNlbGYsIF9hcmdfaWZhY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+LCBfYXJnX251bGxhYmxlX2lmYWNlOiBPcHRpb248JmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX2lmYWNlX2xpc3RfaW46ICZbYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPl0sIF9hcmdfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgVmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4sIF9hcmdfaWZhY2VfbGlzdF9pbm91dDogJm11dCBWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbjogT3B0aW9uPCZbT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+XT4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4pIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaWZhY2UpPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19udWxsYWJsZV9pZmFjZSk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaWZhY2VfbGlzdF9pbik/OworICAgICAgYWlkbF9kYXRhLndyaXRlKF9hcmdfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW4pPzsKKyAgICAgIGFpZGxfZGF0YS53cml0ZShfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpPzsKKyAgICAgIE9rKGFpZGxfZGF0YSkKKyAgICB9CisgICAgZm4gcmVhZF9yZXNwb25zZV9tZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PiB7CisgICAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJTXlJbnRlcmZhY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgICByZXR1cm4gX2FpZGxfZGVmYXVsdF9pbXBsLm1ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfbGlzdF9pbiwgX2FyZ19pZmFjZV9saXN0X291dCwgX2FyZ19pZmFjZV9saXN0X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgICAgbGV0IF9haWRsX3JldHVybjogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgICBfYWlkbF9yZXBseS5yZWFkX29udG8oX2FyZ19pZmFjZV9saXN0X291dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgX2FpZGxfcmVwbHkucmVhZF9vbnRvKF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQpPzsKKyAgICAgIF9haWRsX3JlcGx5LnJlYWRfb250byhfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpPzsKKyAgICAgIE9rKF9haWRsX3JldHVybikKKyAgICB9CisgIH0KKyAgaW1wbCBJTXlJbnRlcmZhY2UgZm9yIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzKCZzZWxmLCBfYXJnX2lmYWNlOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiwgX2FyZ19udWxsYWJsZV9pZmFjZTogT3B0aW9uPCZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19pZmFjZV9saXN0X2luOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT5dLCBfYXJnX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW46IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pl0+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3Rfb3V0OiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+KSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+PiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX21ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfbGlzdF9pbiwgX2FyZ19pZmFjZV9saXN0X291dCwgX2FyZ19pZmFjZV9saXN0X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCBfYWlkbF9yZXBseSkKKyAgICB9CisgIH0KKyAgaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSU15SW50ZXJmYWNlQXN5bmM8UD4gZm9yIEJwTXlJbnRlcmZhY2UgeworICAgIGZuIG1ldGhvZFdpdGhJbnRlcmZhY2VzPCdhPigmJ2Egc2VsZiwgX2FyZ19pZmFjZTogJidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJidhIFtiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJidhIG11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmJ2EgbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JidhIFtPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJidhIG11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICYnYSBtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4+PiB7CisgICAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX21ldGhvZFdpdGhJbnRlcmZhY2VzKF9hcmdfaWZhY2UsIF9hcmdfbnVsbGFibGVfaWZhY2UsIF9hcmdfaWZhY2VfbGlzdF9pbiwgX2FyZ19pZmFjZV9saXN0X291dCwgX2FyZ19pZmFjZV9saXN0X2lub3V0LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW4sIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbm91dCkgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCksCisgICAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfbWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0LCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElNeUludGVyZmFjZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuTXlJbnRlcmZhY2U+IHsKKyAgICBmbiBtZXRob2RXaXRoSW50ZXJmYWNlcygmc2VsZiwgX2FyZ19pZmFjZTogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4sIF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjwmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sIF9hcmdfaWZhY2VfbGlzdF9pbjogJltiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+XSwgX2FyZ19pZmFjZV9saXN0X291dDogJm11dCBWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+PiwgX2FyZ19pZmFjZV9saXN0X2lub3V0OiAmbXV0IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj5dPiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+LCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+Pj4geyBzZWxmLjAubWV0aG9kV2l0aEludGVyZmFjZXMoX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZSwgX2FyZ19pZmFjZV9saXN0X2luLCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCBfYXJnX2lmYWNlX2xpc3RfaW5vdXQsIF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9pbiwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0KSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJTXlJbnRlcmZhY2UsIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6bWV0aG9kV2l0aEludGVyZmFjZXMgPT4geworICAgICAgICBsZXQgX2FyZ19pZmFjZTogYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IF9hcmdfbnVsbGFibGVfaWZhY2U6IE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgICAgbGV0IF9hcmdfaWZhY2VfbGlzdF9pbjogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgbXV0IF9hcmdfaWZhY2VfbGlzdF9vdXQ6IFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+ID0gRGVmYXVsdDo6ZGVmYXVsdCgpOworICAgICAgICBsZXQgbXV0IF9hcmdfaWZhY2VfbGlzdF9pbm91dDogVmVjPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgbXV0IF9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQ6IE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+Pj4gPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCBtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2lub3V0OiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5tZXRob2RXaXRoSW50ZXJmYWNlcygmX2FyZ19pZmFjZSwgX2FyZ19udWxsYWJsZV9pZmFjZS5hc19yZWYoKSwgJl9hcmdfaWZhY2VfbGlzdF9pbiwgJm11dCBfYXJnX2lmYWNlX2xpc3Rfb3V0LCAmbXV0IF9hcmdfaWZhY2VfbGlzdF9pbm91dCwgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X2luLmFzX2RlcmVmKCksICZtdXQgX2FyZ19udWxsYWJsZV9pZmFjZV9saXN0X291dCwgJm11dCBfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmX2FyZ19pZmFjZV9saXN0X291dCk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfaWZhY2VfbGlzdF9pbm91dCk/OworICAgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJl9hcmdfbnVsbGFibGVfaWZhY2VfbGlzdF9vdXQpPzsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZfYXJnX251bGxhYmxlX2lmYWNlX2xpc3RfaW5vdXQpPzsKKyAgICAgICAgICB9CisgICAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICAgIH0KKyAgICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgICB9CisgIH0KK30KK3B1YiBtb2QgTXlQYXJjZWxhYmxlIHsKKyAgI1tkZXJpdmUoRGVidWcpXQorICBwdWIgc3RydWN0IE15UGFyY2VsYWJsZSB7CisgICAgcHViIGlmYWNlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sCisgICAgcHViIG51bGxhYmxlX2lmYWNlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4sCisgICAgcHViIGlmYWNlX2xpc3Q6IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiwKKyAgICBwdWIgbnVsbGFibGVfaWZhY2VfbGlzdDogT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiwKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIE15UGFyY2VsYWJsZSB7CisgICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgICAgU2VsZiB7CisgICAgICAgIGlmYWNlOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIG51bGxhYmxlX2lmYWNlOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICAgIGlmYWNlX2xpc3Q6IERlZmF1bHQ6OmRlZmF1bHQoKSwKKyAgICAgICAgbnVsbGFibGVfaWZhY2VfbGlzdDogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlQYXJjZWxhYmxlIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgICBsZXQgX19maWVsZF9yZWYgPSBzZWxmLmlmYWNlLmFzX3JlZigpLm9rX29yKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKT87CisgICAgICAgIHN1YnBhcmNlbC53cml0ZShfX2ZpZWxkX3JlZik/OworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubnVsbGFibGVfaWZhY2UpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmlmYWNlX2xpc3QpPzsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxhYmxlX2lmYWNlX2xpc3QpPzsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgICBzZWxmLmlmYWNlID0gU29tZShzdWJwYXJjZWwucmVhZCgpPyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgICAgc2VsZi5udWxsYWJsZV9pZmFjZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuaWZhY2VfbGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYubnVsbGFibGVfaWZhY2VfbGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlQYXJjZWxhYmxlKTsKKyAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeVBhcmNlbGFibGUpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgTXlQYXJjZWxhYmxlIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVBhcmNlbGFibGUiIH0KKyAgfQorfQorcHViIG1vZCBNeVVuaW9uIHsKKyAgI1tkZXJpdmUoRGVidWcpXQorICBwdWIgZW51bSBNeVVuaW9uIHsKKyAgICBJZmFjZShPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4pLAorICAgIE51bGxhYmxlX2lmYWNlKE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiksCisgICAgSWZhY2VfbGlzdChWZWM8YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4pLAorICAgIE51bGxhYmxlX2lmYWNlX2xpc3QoT3B0aW9uPFZlYzxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4+PiksCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBNeVVuaW9uIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmOjpJZmFjZShEZWZhdWx0OjpkZWZhdWx0KCkpCisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBNeVVuaW9uIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBtYXRjaCBzZWxmIHsKKyAgICAgICAgU2VsZjo6SWZhY2UodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OworICAgICAgICAgIGxldCBfX2ZpZWxkX3JlZiA9IHYuYXNfcmVmKCkub2tfb3IoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpPzsKKyAgICAgICAgICBwYXJjZWwud3JpdGUoX19maWVsZF9yZWYpCisgICAgICAgIH0KKyAgICAgICAgU2VsZjo6TnVsbGFibGVfaWZhY2UodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6OklmYWNlX2xpc3QodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmMmkzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICAgIFNlbGY6Ok51bGxhYmxlX2lmYWNlX2xpc3QodikgPT4geworICAgICAgICAgIHBhcmNlbC53cml0ZSgmM2kzMik/OworICAgICAgICAgIHBhcmNlbC53cml0ZSh2KQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBsZXQgdGFnOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgIG1hdGNoIHRhZyB7CisgICAgICAgIDAgPT4geworICAgICAgICAgIGxldCB2YWx1ZTogT3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzE1X0lFbXB0eUludGVyZmFjZT4+ID0gU29tZShwYXJjZWwucmVhZCgpPyk7CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpJZmFjZSh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMSA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTVfSUVtcHR5SW50ZXJmYWNlPj4gPSBwYXJjZWwucmVhZCgpPzsKKyAgICAgICAgICAqc2VsZiA9IFNlbGY6Ok51bGxhYmxlX2lmYWNlKHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICAyID0+IHsKKyAgICAgICAgICBsZXQgdmFsdWU6IFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+PiA9IHBhcmNlbC5yZWFkKCk/OworICAgICAgICAgICpzZWxmID0gU2VsZjo6SWZhY2VfbGlzdCh2YWx1ZSk7CisgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICAgICAgMyA9PiB7CisgICAgICAgICAgbGV0IHZhbHVlOiBPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U+Pj4+ID0gcGFyY2VsLnJlYWQoKT87CisgICAgICAgICAgKnNlbGYgPSBTZWxmOjpOdWxsYWJsZV9pZmFjZV9saXN0KHZhbHVlKTsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgICAgICBfID0+IHsKKyAgICAgICAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlVbmlvbik7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlVbmlvbik7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBNeVVuaW9uIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuTGlzdE9mSW50ZXJmYWNlcy5NeVVuaW9uIiB9CisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6Okxpc3RPZkludGVyZmFjZXMgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzOworIHB1YiB1c2Ugc3VwZXI6OklFbXB0eUludGVyZmFjZTo6SUVtcHR5SW50ZXJmYWNlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTZfTGlzdE9mSW50ZXJmYWNlc18xNV9JRW1wdHlJbnRlcmZhY2U7CisgcHViIHVzZSBzdXBlcjo6SU15SW50ZXJmYWNlOjpJTXlJbnRlcmZhY2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzEyX0lNeUludGVyZmFjZTsKKyBwdWIgdXNlIHN1cGVyOjpNeVBhcmNlbGFibGU6Ok15UGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzE2X0xpc3RPZkludGVyZmFjZXNfMTJfTXlQYXJjZWxhYmxlOworIHB1YiB1c2Ugc3VwZXI6Ok15VW5pb246Ok15VW5pb24gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18xNl9MaXN0T2ZJbnRlcmZhY2VzXzdfTXlVbmlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xpc3RPZkludGVyZmFjZXMucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY1YzlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9MaXN0T2ZJbnRlcmZhY2VzLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvTGlzdE9mSW50ZXJmYWNlcy5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLnJzCmluZGV4IDU0OGI3MTEuLmFlOTM4MjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL0xvbmdFbnVtLnJzCkBAIC0xLDggKzEsMTQgQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQogIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCiB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOwotZGVjbGFyZV9iaW5kZXJfZW51bSEgeyBMb25nRW51bSA6IGk2NCB7Ci0gIEZPTyA9IDEwMDAwMDAwMDAwMCwKLSAgQkFSID0gMjAwMDAwMDAwMDAwLAotICBCQVogPSAyMDAwMDAwMDAwMDEsCi19IH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpMb25nRW51bSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW07IH0KK2RlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgTG9uZ0VudW0gOiBbaTY0OyAzXSB7CisgICAgRk9PID0gMTAwMDAwMDAwMDAwLAorICAgIEJBUiA9IDIwMDAwMDAwMDAwMCwKKyAgICBCQVogPSAyMDAwMDAwMDAwMDEsCisgIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkxvbmdFbnVtIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKaW5kZXggZDU3Nzc1Zi4uMGZhY2I0YiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKQEAgLTEsOCArMSw5IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnKV0KIHB1YiBzdHJ1Y3QgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgewogICBwdWIgZmllbGQ6IFN0cmluZywKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzI2X090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOyB9CiBpbXBsIERlZmF1bHQgZm9yIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGYgewpAQCAtMTAsNTIgKzExLDI3IEBACiAgICAgfQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uIGZvciBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyB7Ci0gIGZuIHNlcmlhbGl6ZV9vcHRpb24odGhpczogT3B0aW9uPCZTZWxmPiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMgewotICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87Ci0gICAgICB0aGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpOwotICAgIH07CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5maWVsZCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZpZWxkKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmllbGQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KICAgICAgIE9rKCgpKQogICAgIH0pCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplIGZvciBPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmciIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplQXJyYXkgZm9yIE90aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KLSAgICBsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7Ci0gICAgbGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgcGFyY2VsYWJsZV9zaXplIDwgMCB7IHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOyB9Ci0gICAgaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHsKLSAgICAgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOwotICAgIH0KLSAgICBsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmZpZWxkID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgdW5zYWZlIHsKLSAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbihzdGFydF9wb3MgKyBwYXJjZWxhYmxlX3NpemUpPzsKLSAgICB9Ci0gICAgT2soU29tZShyZXN1bHQpKQotICB9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpPdGhlclBhcmNlbGFibGVGb3JUb1N0cmluZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzI2X090aGVyUGFyY2VsYWJsZUZvclRvU3RyaW5nOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzCmluZGV4IDU4YjdkMjguLjc1M2JhMzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9QYXJjZWxhYmxlRm9yVG9TdHJpbmcucnMKQEAgLTEsMyArMSw1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnKV0KIHB1YiBzdHJ1Y3QgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKICAgcHViIGludFZhbHVlOiBpMzIsCkBAIC0yNCw3ICsyNiw2IEBACiAgIHB1YiBwYXJjZWxhYmxlR2VuZXJpYzogaTMyLAogICBwdWIgdW5pb25WYWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9VbmlvbiwKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpQYXJjZWxhYmxlRm9yVG9TdHJpbmcgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c18yMV9QYXJjZWxhYmxlRm9yVG9TdHJpbmc7IH0KIGltcGwgRGVmYXVsdCBmb3IgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGYgewpAQCAtNTQsMTYyICs1NSwxMTUgQEAKICAgICB9CiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgUGFyY2VsYWJsZUZvclRvU3RyaW5nIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5pbnRWYWx1ZSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludEFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMubG9uZ1ZhbHVlKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMubG9uZ0FycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuZG91YmxlVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5kb3VibGVBcnJheSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmZsb2F0VmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5mbG9hdEFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYnl0ZVZhbHVlKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYnl0ZUFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYm9vbGVhblZhbHVlKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYm9vbGVhbkFycmF5KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc3RyaW5nVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zdHJpbmdBcnJheSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnN0cmluZ0xpc3QpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5wYXJjZWxhYmxlVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5wYXJjZWxhYmxlQXJyYXkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5lbnVtVmFsdWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5lbnVtQXJyYXkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5udWxsQXJyYXkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5udWxsTGlzdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnBhcmNlbGFibGVHZW5lcmljKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMudW5pb25WYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludFZhbHVlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaW50QXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nVmFsdWUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kb3VibGVWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZUFycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXRWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZsb2F0QXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlVmFsdWUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ib29sZWFuVmFsdWUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ib29sZWFuQXJyYXkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zdHJpbmdWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnN0cmluZ0FycmF5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nTGlzdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVWYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnBhcmNlbGFibGVBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmVudW1WYWx1ZSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmVudW1BcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxBcnJheSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLm51bGxMaXN0KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYucGFyY2VsYWJsZUdlbmVyaWMpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi51bmlvblZhbHVlKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50VmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludEFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5sb25nVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZG91YmxlVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmRvdWJsZUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdFZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdEFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ieXRlVmFsdWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmJ5dGVBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYm9vbGVhblZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ib29sZWFuQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnN0cmluZ1ZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zdHJpbmdBcnJheSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RyaW5nTGlzdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYucGFyY2VsYWJsZVZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wYXJjZWxhYmxlQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmVudW1WYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZW51bUFycmF5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5udWxsQXJyYXkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLm51bGxMaXN0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5wYXJjZWxhYmxlR2VuZXJpYyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYudW5pb25WYWx1ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQogICAgICAgT2soKCkpCiAgICAgfSkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFBhcmNlbGFibGVGb3JUb1N0cmluZyB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoUGFyY2VsYWJsZUZvclRvU3RyaW5nKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoUGFyY2VsYWJsZUZvclRvU3RyaW5nKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuUGFyY2VsYWJsZUZvclRvU3RyaW5nIiB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uIGZvciBQYXJjZWxhYmxlRm9yVG9TdHJpbmcgewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KLSAgICBsZXQgc3RhcnRfcG9zID0gcGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCk7Ci0gICAgbGV0IHBhcmNlbGFibGVfc2l6ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgcGFyY2VsYWJsZV9zaXplIDwgMCB7IHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOyB9Ci0gICAgaWYgc3RhcnRfcG9zLmNoZWNrZWRfYWRkKHBhcmNlbGFibGVfc2l6ZSkuaXNfbm9uZSgpIHsKLSAgICAgIHJldHVybiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpOwotICAgIH0KLSAgICBsZXQgbXV0IHJlc3VsdCA9IFNlbGY6OmRlZmF1bHQoKTsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmludFZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5pbnRBcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQubG9uZ1ZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5sb25nQXJyYXkgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmRvdWJsZVZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5kb3VibGVBcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZmxvYXRWYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZmxvYXRBcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYnl0ZVZhbHVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5ieXRlQXJyYXkgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmJvb2xlYW5WYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYm9vbGVhbkFycmF5ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zdHJpbmdWYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc3RyaW5nQXJyYXkgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnN0cmluZ0xpc3QgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnBhcmNlbGFibGVWYWx1ZSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQucGFyY2VsYWJsZUFycmF5ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5lbnVtVmFsdWUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmVudW1BcnJheSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQubnVsbEFycmF5ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5udWxsTGlzdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQucGFyY2VsYWJsZUdlbmVyaWMgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnVuaW9uVmFsdWUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICB1bnNhZmUgewotICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKHN0YXJ0X3BvcyArIHBhcmNlbGFibGVfc2l6ZSk/OwotICAgIH0KLSAgICBPayhTb21lKHJlc3VsdCkpCi0gIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OlBhcmNlbGFibGVGb3JUb1N0cmluZyBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzIxX1BhcmNlbGFibGVGb3JUb1N0cmluZzsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1BhcmNlbGFibGVGb3JUb1N0cmluZy5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzLmQKaW5kZXggZGU0NjE3OS4uNTQ3MWJkMCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUGFyY2VsYWJsZUZvclRvU3RyaW5nLnJzLmQKQEAgLTQsNCArNCw3IEBACiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9JbnRFbnVtLmFpZGwgXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvT3RoZXJQYXJjZWxhYmxlRm9yVG9TdHJpbmcuYWlkbCBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvQnl0ZUVudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0NvbnN0YW50RXhwcmVzc2lvbkVudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzZjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMKQEAgLTAsMCArMSw0MyBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFJlY3Vyc2l2ZUxpc3QgeworICBwdWIgdmFsdWU6IGkzMiwKKyAgcHViIG5leHQ6IE9wdGlvbjxCb3g8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdD4+LAorfQoraW1wbCBEZWZhdWx0IGZvciBSZWN1cnNpdmVMaXN0IHsKKyAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgIFNlbGYgeworICAgICAgdmFsdWU6IDAsCisgICAgICBuZXh0OiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgUmVjdXJzaXZlTGlzdCB7CisgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnZhbHVlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubmV4dCk/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnZhbHVlID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5uZXh0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShSZWN1cnNpdmVMaXN0KTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoUmVjdXJzaXZlTGlzdCk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgUmVjdXJzaXZlTGlzdCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5SZWN1cnNpdmVMaXN0IiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpSZWN1cnNpdmVMaXN0IGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMTNfUmVjdXJzaXZlTGlzdDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1JlY3Vyc2l2ZUxpc3QucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRkNmNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9SZWN1cnNpdmVMaXN0LnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvUmVjdXJzaXZlTGlzdC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCmluZGV4IDcyYmM5OTguLmRmNjY2YjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1N0cnVjdHVyZWRQYXJjZWxhYmxlLnJzCkBAIC0xLDMgKzEsNSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCiBwdWIgc3RydWN0IFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKICAgcHViIHNob3VsZENvbnRhaW5UaHJlZUZzOiBWZWM8aTMyPiwKQEAgLTMzLDYgKzM1LDggQEAKICAgcHViIGludDY0X21heDogaTY0LAogICBwdWIgaGV4SW50MzJfbmVnXzE6IGkzMiwKICAgcHViIGliaW5kZXI6IE9wdGlvbjxiaW5kZXI6OlNwSUJpbmRlcj4sCisgIHB1YiBlbXB0eTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGVfNV9FbXB0eSwKKyAgcHViIGludDhfMTogVmVjPHU4PiwKICAgcHViIGludDMyXzE6IFZlYzxpMzI+LAogICBwdWIgaW50NjRfMTogVmVjPGk2ND4sCiAgIHB1YiBoZXhJbnQzMl9wb3NfMTogaTMyLApAQCAtNTcsNyArNjEsNiBAQAogcHViIGNvbnN0IEJJVDA6IGkzMiA9IDE7CiBwdWIgY29uc3QgQklUMTogaTMyID0gMjsKIHB1YiBjb25zdCBCSVQyOiBpMzIgPSA0OwotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OlN0cnVjdHVyZWRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGU7IH0KIGltcGwgRGVmYXVsdCBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUgewogICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CiAgICAgU2VsZiB7CkBAIC03OCw4ICs4MSw4IEBACiAgICAgICBjaGFyRGVmYXVsdHNUb0M6ICdDJyBhcyB1MTYsCiAgICAgICBmbG9hdERlZmF1bHRzVG9QaTogMy4xNDAwMDBmMzIsCiAgICAgICBkb3VibGVXaXRoRGVmYXVsdDogLTMxNDAwMDAwMDAwMDAwMDAwMC4wMDAwMDBmNjQsCi0gICAgICBhcnJheURlZmF1bHRzVG8xMjM6IHZlYyF7MSwgMiwgM30sCi0gICAgICBhcnJheURlZmF1bHRzVG9FbXB0eTogdmVjIXt9LAorICAgICAgYXJyYXlEZWZhdWx0c1RvMTIzOiB2ZWMhWzEsIDIsIDNdLAorICAgICAgYXJyYXlEZWZhdWx0c1RvRW1wdHk6IHZlYyFbXSwKICAgICAgIGJvb2xEZWZhdWx0OiBmYWxzZSwKICAgICAgIGJ5dGVEZWZhdWx0OiAwLAogICAgICAgaW50RGVmYXVsdDogMCwKQEAgLTg3LDE1ICs5MCwxNyBAQAogICAgICAgZmxvYXREZWZhdWx0OiAwLjAwMDAwMGYzMiwKICAgICAgIGRvdWJsZURlZmF1bHQ6IDAuMDAwMDAwZjY0LAogICAgICAgY2hlY2tEb3VibGVGcm9tRmxvYXQ6IDMuMTQwMDAwZjY0LAotICAgICAgY2hlY2tTdHJpbmdBcnJheTE6IHZlYyF7ImEiLmludG8oKSwgImIiLmludG8oKX0sCi0gICAgICBjaGVja1N0cmluZ0FycmF5MjogdmVjIXsiYSIuaW50bygpLCAiYiIuaW50bygpfSwKKyAgICAgIGNoZWNrU3RyaW5nQXJyYXkxOiB2ZWMhWyJhIi5pbnRvKCksICJiIi5pbnRvKCldLAorICAgICAgY2hlY2tTdHJpbmdBcnJheTI6IHZlYyFbImEiLmludG8oKSwgImIiLmludG8oKV0sCiAgICAgICBpbnQzMl9taW46IC0yMTQ3NDgzNjQ4LAogICAgICAgaW50MzJfbWF4OiAyMTQ3NDgzNjQ3LAogICAgICAgaW50NjRfbWF4OiA5MjIzMzcyMDM2ODU0Nzc1ODA3LAogICAgICAgaGV4SW50MzJfbmVnXzE6IC0xLAogICAgICAgaWJpbmRlcjogRGVmYXVsdDo6ZGVmYXVsdCgpLAotICAgICAgaW50MzJfMTogdmVjIXsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKLSAgICAgIGludDY0XzE6IHZlYyF7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgICBlbXB0eTogRGVmYXVsdDo6ZGVmYXVsdCgpLAorICAgICAgaW50OF8xOiB2ZWMhWzEsIDEsIDEsIDEsIDFdLAorICAgICAgaW50MzJfMTogdmVjIVsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXSwKKyAgICAgIGludDY0XzE6IHZlYyFbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV0sCiAgICAgICBoZXhJbnQzMl9wb3NfMTogMSwKICAgICAgIGhleEludDY0X3Bvc18xOiAxLAogICAgICAgY29uc3RfZXhwcnNfMTogRGVmYXVsdDo6ZGVmYXVsdCgpLApAQCAtMTE3LDMxMiArMTIyLDI3MiBAQAogICAgIH0KICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplIGZvciBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7Ci0gIGZuIHNlcmlhbGl6ZSgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgPFNlbGYgYXMgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbj46OnNlcmlhbGl6ZV9vcHRpb24oU29tZShzZWxmKSwgcGFyY2VsKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemVBcnJheSBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUgewotICBmbiBzZXJpYWxpemVfb3B0aW9uKHRoaXM6IE9wdGlvbjwmU2VsZj4sIHBhcmNlbDogJm11dCBiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewotICAgIGxldCB0aGlzID0gaWYgbGV0IFNvbWUodGhpcykgPSB0aGlzIHsKLSAgICAgIHBhcmNlbC53cml0ZSgmMWkzMik/OwotICAgICAgdGhpcwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcGFyY2VsLndyaXRlKCYwaTMyKTsKLSAgICB9OworaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQ29udGFpblRocmVlRnMpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5mKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQmVKZXJyeSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnNob3VsZEJlQnl0ZUJhcik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnNob3VsZEJlSW50QmFyKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQmVMb25nQmFyKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQ29udGFpblR3b0J5dGVGb29zKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuc2hvdWxkQ29udGFpblR3b0ludEZvb3MpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zdHJpbmdEZWZhdWx0c1RvRm9vKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYnl0ZURlZmF1bHRzVG9Gb3VyKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaW50RGVmYXVsdHNUb0ZpdmUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5sb25nRGVmYXVsdHNUb05lZ2F0aXZlU2V2ZW4pPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5ib29sZWFuRGVmYXVsdHNUb1RydWUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jaGFyRGVmYXVsdHNUb0MpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5mbG9hdERlZmF1bHRzVG9QaSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmRvdWJsZVdpdGhEZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYXJyYXlEZWZhdWx0c1RvMTIzKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYXJyYXlEZWZhdWx0c1RvRW1wdHkpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5ib29sRGVmYXVsdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmJ5dGVEZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaW50RGVmYXVsdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmxvbmdEZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuZmxvYXREZWZhdWx0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuZG91YmxlRGVmYXVsdCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNoZWNrRG91YmxlRnJvbUZsb2F0KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY2hlY2tTdHJpbmdBcnJheTEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jaGVja1N0cmluZ0FycmF5Mik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDMyX21pbik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDMyX21heCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDY0X21heCk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmhleEludDMyX25lZ18xKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaWJpbmRlcik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmludDMyXzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5pbnQ2NF8xKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuaGV4SW50MzJfcG9zXzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5oZXhJbnQ2NF9wb3NfMSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jb25zdF9leHByc18yKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY29uc3RfZXhwcnNfMyk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzQpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jb25zdF9leHByc181KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY29uc3RfZXhwcnNfNik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzcpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5jb25zdF9leHByc184KT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuY29uc3RfZXhwcnNfOSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmNvbnN0X2V4cHJzXzEwKT87Ci0gICAgICBzdWJwYXJjZWwud3JpdGUoJnRoaXMuYWRkU3RyaW5nMSk/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLmFkZFN0cmluZzIpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zaG91bGRTZXRCaXQwQW5kQml0Mik/OwotICAgICAgc3VicGFyY2VsLndyaXRlKCZ0aGlzLnUpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5zaG91bGRCZUNvbnN0UzEpPzsKLSAgICAgIHN1YnBhcmNlbC53cml0ZSgmdGhpcy5kZWZhdWx0V2l0aEZvbyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZENvbnRhaW5UaHJlZUZzKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZEJlSmVycnkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRCZUJ5dGVCYXIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRCZUludEJhcik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZEJlTG9uZ0Jhcik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnNob3VsZENvbnRhaW5Ud29JbnRGb29zKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RyaW5nRGVmYXVsdHNUb0Zvbyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmJ5dGVEZWZhdWx0c1RvRm91cik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludERlZmF1bHRzVG9GaXZlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYm9vbGVhbkRlZmF1bHRzVG9UcnVlKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hhckRlZmF1bHRzVG9DKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZmxvYXREZWZhdWx0c1RvUGkpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kb3VibGVXaXRoRGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmFycmF5RGVmYXVsdHNUbzEyMyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmFycmF5RGVmYXVsdHNUb0VtcHR5KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYm9vbERlZmF1bHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5ieXRlRGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludERlZmF1bHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5sb25nRGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmZsb2F0RGVmYXVsdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmRvdWJsZURlZmF1bHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jaGVja0RvdWJsZUZyb21GbG9hdCk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNoZWNrU3RyaW5nQXJyYXkxKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY2hlY2tTdHJpbmdBcnJheTIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQzMl9taW4pPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQzMl9tYXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQ2NF9tYXgpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5oZXhJbnQzMl9uZWdfMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmliaW5kZXIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5lbXB0eSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludDhfMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmludDMyXzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5pbnQ2NF8xKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuaGV4SW50MzJfcG9zXzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5oZXhJbnQ2NF9wb3NfMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jb25zdF9leHByc18yKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY29uc3RfZXhwcnNfMyk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jb25zdF9leHByc181KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY29uc3RfZXhwcnNfNik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzcpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jb25zdF9leHByc184KT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuY29uc3RfZXhwcnNfOSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmNvbnN0X2V4cHJzXzEwKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYWRkU3RyaW5nMSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmFkZFN0cmluZzIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRTZXRCaXQwQW5kQml0Mik/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnUpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5zaG91bGRCZUNvbnN0UzEpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5kZWZhdWx0V2l0aEZvbyk/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZENvbnRhaW5UaHJlZUZzID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRCZUplcnJ5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRCZUJ5dGVCYXIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZEJlSW50QmFyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRCZUxvbmdCYXIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc2hvdWxkQ29udGFpblR3b0ludEZvb3MgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLnNob3VsZENvbnRhaW5Ud29Mb25nRm9vcyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RyaW5nRGVmYXVsdHNUb0ZvbyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZURlZmF1bHRzVG9Gb3VyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnREZWZhdWx0c1RvRml2ZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ib29sZWFuRGVmYXVsdHNUb1RydWUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoYXJEZWZhdWx0c1RvQyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZmxvYXREZWZhdWx0c1RvUGkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmRvdWJsZVdpdGhEZWZhdWx0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hcnJheURlZmF1bHRzVG8xMjMgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmFycmF5RGVmYXVsdHNUb0VtcHR5ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5ib29sRGVmYXVsdCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYnl0ZURlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludERlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmxvbmdEZWZhdWx0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5mbG9hdERlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmRvdWJsZURlZmF1bHQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNoZWNrRG91YmxlRnJvbUZsb2F0ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5jaGVja1N0cmluZ0FycmF5MSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuY2hlY2tTdHJpbmdBcnJheTIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmludDMyX21pbiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50MzJfbWF4ID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnQ2NF9tYXggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmhleEludDMyX25lZ18xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pYmluZGVyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5lbXB0eSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaW50OF8xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnQzMl8xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5pbnQ2NF8xID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5oZXhJbnQzMl9wb3NfMSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuaGV4SW50NjRfcG9zXzEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzMgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzQgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzUgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzYgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzcgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzggPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzkgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmNvbnN0X2V4cHJzXzEwID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hZGRTdHJpbmcxID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hZGRTdHJpbmcyID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5zaG91bGRTZXRCaXQwQW5kQml0MiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYudSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc2hvdWxkQmVDb25zdFMxID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5kZWZhdWx0V2l0aEZvbyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQogICAgICAgT2soKCkpCiAgICAgfSkKICAgfQogfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gZGVzZXJpYWxpemUocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8U2VsZj4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpCi0gICAgICAgLnRyYW5zcG9zZSgpCi0gICAgICAgLnVud3JhcF9vcihFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpKQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoU3RydWN0dXJlZFBhcmNlbGFibGUpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShTdHJ1Y3R1cmVkUGFyY2VsYWJsZSk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgU3RydWN0dXJlZFBhcmNlbGFibGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuU3RydWN0dXJlZFBhcmNlbGFibGUiIH0KK30KK3B1YiBtb2QgRW1wdHkgeworICAjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIFBhcnRpYWxFcSldCisgIHB1YiBzdHJ1Y3QgRW1wdHkgeworICB9CisgIGltcGwgRGVmYXVsdCBmb3IgRW1wdHkgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRW1wdHkgeworICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgICAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFbXB0eSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRW1wdHkpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRW1wdHkgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSIgfQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24gZm9yIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9Ci0gICAgbGV0IHN0YXJ0X3BvcyA9IHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpOwotICAgIGxldCBwYXJjZWxhYmxlX3NpemU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHBhcmNlbGFibGVfc2l6ZSA8IDAgeyByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsgfQotICAgIGlmIHN0YXJ0X3Bvcy5jaGVja2VkX2FkZChwYXJjZWxhYmxlX3NpemUpLmlzX25vbmUoKSB7Ci0gICAgICByZXR1cm4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKTsKLSAgICB9Ci0gICAgbGV0IG11dCByZXN1bHQgPSBTZWxmOjpkZWZhdWx0KCk7Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRDb250YWluVGhyZWVGcyA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkQmVKZXJyeSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkQmVCeXRlQmFyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRCZUludEJhciA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkQmVMb25nQmFyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnNob3VsZENvbnRhaW5Ud29JbnRGb29zID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnN0cmluZ0RlZmF1bHRzVG9Gb28gPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmJ5dGVEZWZhdWx0c1RvRm91ciA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50RGVmYXVsdHNUb0ZpdmUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmxvbmdEZWZhdWx0c1RvTmVnYXRpdmVTZXZlbiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYm9vbGVhbkRlZmF1bHRzVG9UcnVlID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jaGFyRGVmYXVsdHNUb0MgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmZsb2F0RGVmYXVsdHNUb1BpID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5kb3VibGVXaXRoRGVmYXVsdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYXJyYXlEZWZhdWx0c1RvMTIzID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5hcnJheURlZmF1bHRzVG9FbXB0eSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYm9vbERlZmF1bHQgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmJ5dGVEZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5pbnREZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5sb25nRGVmYXVsdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZmxvYXREZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5kb3VibGVEZWZhdWx0ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jaGVja0RvdWJsZUZyb21GbG9hdCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuY2hlY2tTdHJpbmdBcnJheTEgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmNoZWNrU3RyaW5nQXJyYXkyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5pbnQzMl9taW4gPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmludDMyX21heCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50NjRfbWF4ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5oZXhJbnQzMl9uZWdfMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaWJpbmRlciA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50MzJfMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaW50NjRfMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuaGV4SW50MzJfcG9zXzEgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LmhleEludDY0X3Bvc18xID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18xID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18yID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18zID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc180ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc181ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc182ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc183ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc184ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc185ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgKHBhcmNlbC5nZXRfZGF0YV9wb3NpdGlvbigpIC0gc3RhcnRfcG9zKSA9PSBwYXJjZWxhYmxlX3NpemUgewotICAgICAgcmV0dXJuIE9rKFNvbWUocmVzdWx0KSk7Ci0gICAgfQotICAgIHJlc3VsdC5jb25zdF9leHByc18xMCA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYWRkU3RyaW5nMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuYWRkU3RyaW5nMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuc2hvdWxkU2V0Qml0MEFuZEJpdDIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnUgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiAocGFyY2VsLmdldF9kYXRhX3Bvc2l0aW9uKCkgLSBzdGFydF9wb3MpID09IHBhcmNlbGFibGVfc2l6ZSB7Ci0gICAgICByZXR1cm4gT2soU29tZShyZXN1bHQpKTsKLSAgICB9Ci0gICAgcmVzdWx0LnNob3VsZEJlQ29uc3RTMSA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIChwYXJjZWwuZ2V0X2RhdGFfcG9zaXRpb24oKSAtIHN0YXJ0X3BvcykgPT0gcGFyY2VsYWJsZV9zaXplIHsKLSAgICAgIHJldHVybiBPayhTb21lKHJlc3VsdCkpOwotICAgIH0KLSAgICByZXN1bHQuZGVmYXVsdFdpdGhGb28gPSBwYXJjZWwucmVhZCgpPzsKLSAgICB1bnNhZmUgewotICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKHN0YXJ0X3BvcyArIHBhcmNlbGFibGVfc2l6ZSk/OwotICAgIH0KLSAgICBPayhTb21lKHJlc3VsdCkpCi0gIH0KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OlN0cnVjdHVyZWRQYXJjZWxhYmxlIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGU7CisgcHViIHVzZSBzdXBlcjo6RW1wdHk6OkVtcHR5IGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfMjBfU3RydWN0dXJlZFBhcmNlbGFibGVfNV9FbXB0eTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL1VuaW9uLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24ucnMKaW5kZXggZmJiOGEzNS4uNDRmMWY3OCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24ucnMKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb24ucnMKQEAgLTEsMyArMSw1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KIHB1YiBlbnVtIFVuaW9uIHsKICAgTnMoVmVjPGkzMj4pLApAQCAtOSwyNyArMTEsMTQgQEAKICAgQmUoY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9CeXRlRW51bSksCiB9CiBwdWIgY29uc3QgUzE6ICZzdHIgPSAiYSBzdHJpbmcgY29uc3RhbnQgaW4gdW5pb24iOwotcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7IHB1YiB1c2Ugc3VwZXI6OlVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNV9VbmlvbjsgfQogaW1wbCBEZWZhdWx0IGZvciBVbmlvbiB7CiAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICBTZWxmOjpOcyh2ZWMhe30pCisgICAgU2VsZjo6TnModmVjIVtdKQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yIFVuaW9uIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbiB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uIGZvciBVbmlvbiB7Ci0gIGZuIHNlcmlhbGl6ZV9vcHRpb24odGhpczogT3B0aW9uPCZTZWxmPiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMgewotICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87Ci0gICAgICB0aGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpOwotICAgIH07Ci0gICAgbWF0Y2ggdGhpcyB7CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgVW5pb24geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpOcyh2KSA9PiB7CiAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OwogICAgICAgICBwYXJjZWwud3JpdGUodikKQEAgLTYwLDQ4ICs0OSw0MyBAQAogICAgICAgfQogICAgIH0KICAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemUocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8U2VsZj4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpCi0gICAgICAgLnRyYW5zcG9zZSgpCi0gICAgICAgLnVud3JhcF9vcihFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbiB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24gZm9yIFVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgbGV0IHRhZzogaTMyID0gcGFyY2VsLnJlYWQoKT87CiAgICAgbWF0Y2ggdGFnIHsKICAgICAgIDAgPT4gewogICAgICAgICBsZXQgdmFsdWU6IFZlYzxpMzI+ID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6TnModmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpOcyh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgMSA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6Tih2YWx1ZSkpKQorICAgICAgICAqc2VsZiA9IFNlbGY6Ok4odmFsdWUpOworICAgICAgICBPaygoKSkKICAgICAgIH0KICAgICAgIDIgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6Ok0odmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpNKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICAzID0+IHsKICAgICAgICAgbGV0IHZhbHVlOiBTdHJpbmcgPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpTKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6Uyh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgNCA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogT3B0aW9uPGJpbmRlcjo6U3BJQmluZGVyPiA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6OkliaW5kZXIodmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpJYmluZGVyKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICA1ID0+IHsKICAgICAgICAgbGV0IHZhbHVlOiBWZWM8U3RyaW5nPiA9IHBhcmNlbC5yZWFkKCk/OwotICAgICAgICBPayhTb21lKFNlbGY6OlNzKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6U3ModmFsdWUpOworICAgICAgICBPaygoKSkKICAgICAgIH0KICAgICAgIDYgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfQnl0ZUVudW0gPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpCZSh2YWx1ZSkpKQorICAgICAgICAqc2VsZiA9IFNlbGY6OkJlKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICBfID0+IHsKICAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKQpAQCAtMTA5LDMgKzkzLDExIEBACiAgICAgfQogICB9CiB9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShVbmlvbik7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBVbmlvbiB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5VbmlvbiIgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6VW5pb24gYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c181X1VuaW9uOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvVW5pb25XaXRoRmQucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5ycwppbmRleCA1MDFlMDBjLi4yOWFmNWEzIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9VbmlvbldpdGhGZC5ycwpAQCAtMSwyOSArMSwxOCBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCiAjW2Rlcml2ZShEZWJ1ZyldCiBwdWIgZW51bSBVbmlvbldpdGhGZCB7CiAgIE51bShpMzIpLAotICBQZmQoT3B0aW9uPGJpbmRlcjo6cGFyY2VsOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4pLAorICBQZmQoT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KSwKIH0KLXB1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeyBwdWIgdXNlIHN1cGVyOjpVbmlvbldpdGhGZCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX1VuaW9uV2l0aEZkOyB9CiBpbXBsIERlZmF1bHQgZm9yIFVuaW9uV2l0aEZkIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGY6Ok51bSgwKQogICB9CiB9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpTZXJpYWxpemUgZm9yIFVuaW9uV2l0aEZkIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbldpdGhGZCB7fQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uIGZvciBVbmlvbldpdGhGZCB7Ci0gIGZuIHNlcmlhbGl6ZV9vcHRpb24odGhpczogT3B0aW9uPCZTZWxmPiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7Ci0gICAgbGV0IHRoaXMgPSBpZiBsZXQgU29tZSh0aGlzKSA9IHRoaXMgewotICAgICAgcGFyY2VsLndyaXRlKCYxaTMyKT87Ci0gICAgICB0aGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJjZWwud3JpdGUoJjBpMzIpOwotICAgIH07Ci0gICAgbWF0Y2ggdGhpcyB7CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgVW5pb25XaXRoRmQgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpOdW0odikgPT4gewogICAgICAgICBwYXJjZWwud3JpdGUoJjBpMzIpPzsKICAgICAgICAgcGFyY2VsLndyaXRlKHYpCkBAIC0zNSwyOCArMjQsMTggQEAKICAgICAgIH0KICAgICB9CiAgIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplIGZvciBVbmlvbldpdGhGZCB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVBcnJheSBmb3IgVW5pb25XaXRoRmQge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uIGZvciBVbmlvbldpdGhGZCB7Ci0gIGZuIGRlc2VyaWFsaXplX29wdGlvbihwYXJjZWw6ICZiaW5kZXI6OnBhcmNlbDo6UGFyY2VsKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U2VsZj4+IHsKLSAgICBsZXQgc3RhdHVzOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICBpZiBzdGF0dXMgPT0gMCB7IHJldHVybiBPayhOb25lKTsgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4gewogICAgIGxldCB0YWc6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwogICAgIG1hdGNoIHRhZyB7CiAgICAgICAwID0+IHsKICAgICAgICAgbGV0IHZhbHVlOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpOdW0odmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpOdW0odmFsdWUpOworICAgICAgICBPaygoKSkKICAgICAgIH0KICAgICAgIDEgPT4gewotICAgICAgICBsZXQgdmFsdWU6IE9wdGlvbjxiaW5kZXI6OnBhcmNlbDo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gU29tZShwYXJjZWwucmVhZCgpPyk7Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6UGZkKHZhbHVlKSkpCisgICAgICAgIGxldCB2YWx1ZTogT3B0aW9uPGJpbmRlcjo6UGFyY2VsRmlsZURlc2NyaXB0b3I+ID0gU29tZShwYXJjZWwucmVhZCgpPyk7CisgICAgICAgICpzZWxmID0gU2VsZjo6UGZkKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICBfID0+IHsKICAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKQpAQCAtNjQsMyArNDMsMTEgQEAKICAgICB9CiAgIH0KIH0KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uV2l0aEZkKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoVW5pb25XaXRoRmQpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIFVuaW9uV2l0aEZkIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLlVuaW9uV2l0aEZkIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpVbmlvbldpdGhGZCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzExX1VuaW9uV2l0aEZkOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWVhMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUucnMKQEAgLTAsMCArMSw2MSBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IEV4dGVuZGFibGVQYXJjZWxhYmxlIHsKKyAgcHViIGE6IGkzMiwKKyAgcHViIGI6IFN0cmluZywKKyAgcHViIGV4dDogYmluZGVyOjpQYXJjZWxhYmxlSG9sZGVyLAorICBwdWIgYzogaTY0LAorICBwdWIgZXh0MjogYmluZGVyOjpQYXJjZWxhYmxlSG9sZGVyLAorfQoraW1wbCBEZWZhdWx0IGZvciBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBleHQ6IGJpbmRlcjo6UGFyY2VsYWJsZUhvbGRlcjo6bmV3KGJpbmRlcjo6YmluZGVyX2ltcGw6OlN0YWJpbGl0eTo6TG9jYWwpLAorICAgICAgYzogMCwKKyAgICAgIGV4dDI6IGJpbmRlcjo6UGFyY2VsYWJsZUhvbGRlcjo6bmV3KGJpbmRlcjo6YmluZGVyX2ltcGw6OlN0YWJpbGl0eTo6TG9jYWwpLAorICAgIH0KKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIEV4dGVuZGFibGVQYXJjZWxhYmxlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5leHQpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZXh0Mik/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmV4dCA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuZXh0MiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoRXh0ZW5kYWJsZVBhcmNlbGFibGUpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShFeHRlbmRhYmxlUGFyY2VsYWJsZSk7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRXh0ZW5kYWJsZVBhcmNlbGFibGUgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzIwX0V4dGVuZGFibGVQYXJjZWxhYmxlOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vRXh0ZW5kYWJsZVBhcmNlbGFibGUucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzg5MWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL0V4dGVuZGFibGVQYXJjZWxhYmxlLnJzLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9FeHRlbmRhYmxlUGFyY2VsYWJsZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQucnMgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5Yzk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5ycwpAQCAtMCwwICsxLDQzIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgTXlFeHQgeworICBwdWIgYTogaTMyLAorICBwdWIgYjogU3RyaW5nLAorfQoraW1wbCBEZWZhdWx0IGZvciBNeUV4dCB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlFeHQgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5hKT87CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYik/OworICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmEgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICBzZWxmLmIgPSBzdWJwYXJjZWwucmVhZCgpPzsKKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KK30KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKE15RXh0KTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlFeHQpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15RXh0IHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLmV4dGVuc2lvbi5NeUV4dCIgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6TXlFeHQgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl81X015RXh0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjgzMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0LnJzLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dC5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzAxN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5ycwpAQCAtMCwwICsxLDQ5IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgTXlFeHQyIHsKKyAgcHViIGE6IGkzMiwKKyAgcHViIGI6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzlfZXh0ZW5zaW9uXzVfTXlFeHQsCisgIHB1YiBjOiBTdHJpbmcsCit9CitpbXBsIERlZmF1bHQgZm9yIE15RXh0MiB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgICBjOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlFeHQyIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmIpPzsKKyAgICAgIHN1YnBhcmNlbC53cml0ZSgmc2VsZi5jKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYiA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuYyA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfSkKKyAgfQorfQorYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlFeHQyKTsKK2JpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoTXlFeHQyKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBNeUV4dDIgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLk15RXh0MiIgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6TXlFeHQyIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOV9leHRlbnNpb25fNl9NeUV4dDI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLnJzLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQyLnJzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1OGY2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIucnMuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0Mi5ycyA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dDIuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5OGFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMKQEAgLTAsMCArMSw0MyBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IE15RXh0TGlrZSB7CisgIHB1YiBhOiBpMzIsCisgIHB1YiBiOiBTdHJpbmcsCit9CitpbXBsIERlZmF1bHQgZm9yIE15RXh0TGlrZSB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIGE6IDAsCisgICAgICBiOiBEZWZhdWx0OjpkZWZhdWx0KCksCisgICAgfQorICB9Cit9CitpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgTXlFeHRMaWtlIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuYSk/OworICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLmIpPzsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5hID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBpZiBzdWJwYXJjZWwuaGFzX21vcmVfZGF0YSgpIHsKKyAgICAgICAgc2VsZi5iID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeUV4dExpa2UpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShNeUV4dExpa2UpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIE15RXh0TGlrZSB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uTXlFeHRMaWtlIiB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpNeUV4dExpa2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c185X2V4dGVuc2lvbl85X015RXh0TGlrZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL2V4dGVuc2lvbi9NeUV4dExpa2UucnMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkwNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9leHRlbnNpb24vTXlFeHRMaWtlLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvZXh0ZW5zaW9uL015RXh0TGlrZS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdhYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycwpAQCAtMCwwICsxLDE2MyBAQAorIyFbZm9yYmlkKHVuc2FmZV9jb2RlKV0KKyMhW3J1c3RmbXQ6OnNraXBdCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IERlZXBseU5lc3RlZCB7Cit9CitpbXBsIERlZmF1bHQgZm9yIERlZXBseU5lc3RlZCB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICB9CisgIH0KK30KK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBEZWVwbHlOZXN0ZWQgeworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgIE9rKCgpKQorICAgIH0pCisgIH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEZWVwbHlOZXN0ZWQpOworYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEZWVwbHlOZXN0ZWQpOworaW1wbCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWxhYmxlTWV0YWRhdGEgZm9yIERlZXBseU5lc3RlZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuRGVlcGx5TmVzdGVkIiB9Cit9CitwdWIgbW9kIEEgeworICAjW2Rlcml2ZShEZWJ1ZyldCisgIHB1YiBzdHJ1Y3QgQSB7CisgICAgcHViIGU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzEyX0RlZXBseU5lc3RlZF8xX0JfMV9DXzFfRF8xX0UsCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBBIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICBTZWxmIHsKKyAgICAgICAgZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTJfRGVlcGx5TmVzdGVkXzFfQl8xX0NfMV9EXzFfRTo6T0ssCisgICAgICB9CisgICAgfQorICB9CisgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBBIHsKKyAgICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuZSk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuZSA9IHN1YnBhcmNlbC5yZWFkKCk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfSkKKyAgICB9CisgIH0KKyAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQSk7CisgIGJpbmRlcjo6aW1wbF9kZXNlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQSk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBBIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5BIiB9CisgIH0KK30KK3B1YiBtb2QgQiB7CisgICNbZGVyaXZlKERlYnVnKV0KKyAgcHViIHN0cnVjdCBCIHsKKyAgfQorICBpbXBsIERlZmF1bHQgZm9yIEIgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgfQorICAgIH0KKyAgfQorICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgQiB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICB9CisgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEIpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEIpOworICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgQiB7CisgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQiIgfQorICB9CisgIHB1YiBtb2QgQyB7CisgICAgI1tkZXJpdmUoRGVidWcpXQorICAgIHB1YiBzdHJ1Y3QgQyB7CisgICAgfQorICAgIGltcGwgRGVmYXVsdCBmb3IgQyB7CisgICAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICAgIFNlbGYgeworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBDIHsKKyAgICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfSkKKyAgICAgIH0KKyAgICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgICBPaygoKSkKKyAgICAgICAgfSkKKyAgICAgIH0KKyAgICB9CisgICAgYmluZGVyOjppbXBsX3NlcmlhbGl6ZV9mb3JfcGFyY2VsYWJsZSEoQyk7CisgICAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShDKTsKKyAgICBpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgQyB7CisgICAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLkRlZXBseU5lc3RlZC5CLkMiIH0KKyAgICB9CisgICAgcHViIG1vZCBEIHsKKyAgICAgICNbZGVyaXZlKERlYnVnKV0KKyAgICAgIHB1YiBzdHJ1Y3QgRCB7CisgICAgICB9CisgICAgICBpbXBsIERlZmF1bHQgZm9yIEQgeworICAgICAgICBmbiBkZWZhdWx0KCkgLT4gU2VsZiB7CisgICAgICAgICAgU2VsZiB7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpbXBsIGJpbmRlcjo6UGFyY2VsYWJsZSBmb3IgRCB7CisgICAgICAgIGZuIHdyaXRlX3RvX3BhcmNlbCgmc2VsZiwgcGFyY2VsOiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICAgICAgICBwYXJjZWwuc2l6ZWRfd3JpdGUofHN1YnBhcmNlbHwgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgfSkKKyAgICAgICAgfQorICAgICAgICBmbiByZWFkX2Zyb21fcGFyY2VsKCZtdXQgc2VsZiwgcGFyY2VsOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgICAgIHBhcmNlbC5zaXplZF9yZWFkKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgIH0pCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEQpOworICAgICAgYmluZGVyOjppbXBsX2Rlc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShEKTsKKyAgICAgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBEIHsKKyAgICAgICAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5EZWVwbHlOZXN0ZWQuQi5DLkQiIH0KKyAgICAgIH0KKyAgICAgIHB1YiBtb2QgRSB7CisgICAgICAgICMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorICAgICAgICB1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9lbnVtOworICAgICAgICBkZWNsYXJlX2JpbmRlcl9lbnVtISB7CisgICAgICAgICAgRSA6IFtpODsgMV0geworICAgICAgICAgICAgT0sgPSAwLAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6RGVlcGx5TmVzdGVkIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTJfRGVlcGx5TmVzdGVkOworIHB1YiB1c2Ugc3VwZXI6OkE6OkEgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9BOworIHB1YiB1c2Ugc3VwZXI6OkI6OkIgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9COworIHB1YiB1c2Ugc3VwZXI6OkI6OkM6OkMgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9CXzFfQzsKKyBwdWIgdXNlIHN1cGVyOjpCOjpDOjpEOjpEIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTJfRGVlcGx5TmVzdGVkXzFfQl8xX0NfMV9EOworIHB1YiB1c2Ugc3VwZXI6OkI6OkM6OkQ6OkU6OkUgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xMl9EZWVwbHlOZXN0ZWRfMV9CXzFfQ18xX0RfMV9FOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0RlZXBseU5lc3RlZC5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWU2YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLnJzLmQKQEAgLTAsMCArMSwyIEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9EZWVwbHlOZXN0ZWQucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvRGVlcGx5TmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI3NmIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLnJzCkBAIC0wLDAgKzEsMzY1IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQorI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7Cit1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CitkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKKyAgSU5lc3RlZFNlcnZpY2VbImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UiXSB7CisgICAgbmF0aXZlOiBCbk5lc3RlZFNlcnZpY2Uob25fdHJhbnNhY3QpLAorICAgIHByb3h5OiBCcE5lc3RlZFNlcnZpY2UgeworICAgIH0sCisgICAgYXN5bmM6IElOZXN0ZWRTZXJ2aWNlQXN5bmMsCisgIH0KK30KK3B1YiB0cmFpdCBJTmVzdGVkU2VydmljZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZSIgfQorICBmbiBmbGlwU3RhdHVzKCZzZWxmLCBfYXJnX3A6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+OworICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsIF9hcmdfY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIGdldERlZmF1bHRJbXBsKCkgLT4gSU5lc3RlZFNlcnZpY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICBERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLmNsb25lKCkKKyAgfQorICBmbiBzZXREZWZhdWx0SW1wbChkOiBJTmVzdGVkU2VydmljZURlZmF1bHRSZWYpIC0+IElOZXN0ZWRTZXJ2aWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgc3RkOjptZW06OnJlcGxhY2UoJm11dCAqREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKSwgZCkKKyAgfQorfQorcHViIHRyYWl0IElOZXN0ZWRTZXJ2aWNlQXN5bmM8UD46IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UiIH0KKyAgZm4gZmxpcFN0YXR1czwnYT4oJidhIHNlbGYsIF9hcmdfcDogJidhIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+PjsKKyAgZm4gZmxpcFN0YXR1c1dpdGhDYWxsYmFjazwnYT4oJidhIHNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJidhIGJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworfQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJTmVzdGVkU2VydmljZUFzeW5jU2VydmVyOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlIiB9CisgIGFzeW5jIGZuIGZsaXBTdGF0dXMoJnNlbGYsIF9hcmdfcDogJmNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkKSAtPiBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV82X1Jlc3VsdD47CisgIGFzeW5jIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKK30KK2ltcGwgQm5OZXN0ZWRTZXJ2aWNlIHsKKyAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElOZXN0ZWRTZXJ2aWNlPgorICB3aGVyZQorICAgIFQ6IElOZXN0ZWRTZXJ2aWNlQXN5bmNTZXJ2ZXIgKyBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgIHsKKyAgICBzdHJ1Y3QgV3JhcHBlcjxULCBSPiB7CisgICAgICBfaW5uZXI6IFQsCisgICAgICBfcnQ6IFIsCisgICAgfQorICAgIGltcGw8VCwgUj4gYmluZGVyOjpJbnRlcmZhY2UgZm9yIFdyYXBwZXI8VCwgUj4gd2hlcmUgVDogYmluZGVyOjpJbnRlcmZhY2UsIFI6IFNlbmQgKyBTeW5jIHsKKyAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICBmbiBkdW1wKCZzZWxmLCBfZmlsZTogJnN0ZDo6ZnM6OkZpbGUsIF9hcmdzOiAmWyZzdGQ6OmZmaTo6Q1N0cl0pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geyBzZWxmLl9pbm5lci5kdW1wKF9maWxlLCBfYXJncykgfQorICAgIH0KKyAgICBpbXBsPFQsIFI+IElOZXN0ZWRTZXJ2aWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgd2hlcmUKKyAgICAgIFQ6IElOZXN0ZWRTZXJ2aWNlQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgZm4gZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzZfUmVzdWx0PiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLmZsaXBTdGF0dXMoX2FyZ19wKSkKKyAgICAgIH0KKyAgICAgIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soX2FyZ19zdGF0dXMsIF9hcmdfY2IpKQorICAgICAgfQorICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQorcHViIHRyYWl0IElOZXN0ZWRTZXJ2aWNlRGVmYXVsdDogU2VuZCArIFN5bmMgeworICBmbiBmbGlwU3RhdHVzKCZzZWxmLCBfYXJnX3A6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsIF9hcmdfY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9Cit9CitwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgIHB1YiBjb25zdCBmbGlwU3RhdHVzOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2s6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworfQorcHViIHR5cGUgSU5lc3RlZFNlcnZpY2VEZWZhdWx0UmVmID0gT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGR5biBJTmVzdGVkU2VydmljZURlZmF1bHQ+PjsKK3VzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CitsYXp5X3N0YXRpYyEgeworICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJTmVzdGVkU2VydmljZURlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOworfQoraW1wbCBCcE5lc3RlZFNlcnZpY2UgeworICBmbiBidWlsZF9wYXJjZWxfZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19wKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQsIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU5lc3RlZFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5mbGlwU3RhdHVzKF9hcmdfcCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgbGV0IF9haWRsX3JldHVybjogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIE9rKF9haWRsX3JldHVybikKKyAgfQorICBmbiBidWlsZF9wYXJjZWxfZmxpcFN0YXR1c1dpdGhDYWxsYmFjaygmc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzLCBfYXJnX2NiOiAmYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzlfSUNhbGxiYWNrPikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsPiB7CisgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgIGFpZGxfZGF0YS53cml0ZSgmX2FyZ19zdGF0dXMpPzsKKyAgICBhaWRsX2RhdGEud3JpdGUoX2FyZ19jYik/OworICAgIE9rKGFpZGxfZGF0YSkKKyAgfQorICBmbiByZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4sIF9haWRsX3JlcGx5OiBzdGQ6OnJlc3VsdDo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbCwgYmluZGVyOjpTdGF0dXNDb2RlPikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBsZXQgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikgPSBfYWlkbF9yZXBseSB7CisgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSU5lc3RlZFNlcnZpY2U+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKF9hcmdfc3RhdHVzLCBfYXJnX2NiKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgIGxldCBfYWlkbF9zdGF0dXM6IGJpbmRlcjo6U3RhdHVzID0gX2FpZGxfcmVwbHkucmVhZCgpPzsKKyAgICBpZiAhX2FpZGxfc3RhdHVzLmlzX29rKCkgeyByZXR1cm4gRXJyKF9haWRsX3N0YXR1cyk7IH0KKyAgICBPaygoKSkKKyAgfQorfQoraW1wbCBJTmVzdGVkU2VydmljZSBmb3IgQnBOZXN0ZWRTZXJ2aWNlIHsKKyAgZm4gZmxpcFN0YXR1cygmc2VsZiwgX2FyZ19wOiAmY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6UmVzdWx0PGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzZfUmVzdWx0PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9mbGlwU3RhdHVzKF9hcmdfcCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmZsaXBTdGF0dXMsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXMoX2FyZ19wLCBfYWlkbF9yZXBseSkKKyAgfQorICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsIF9hcmdfY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhfYXJnX3N0YXR1cywgX2FyZ19jYik/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6OmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2ssIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soX2FyZ19zdGF0dXMsIF9hcmdfY2IsIF9haWRsX3JlcGx5KQorICB9Cit9CitpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJTmVzdGVkU2VydmljZUFzeW5jPFA+IGZvciBCcE5lc3RlZFNlcnZpY2UgeworICBmbiBmbGlwU3RhdHVzPCdhPigmJ2Egc2VsZiwgX2FyZ19wOiAmJ2EgY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWQpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDxjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV82X1Jlc3VsdD4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX2ZsaXBTdGF0dXMoX2FyZ19wKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpmbGlwU3RhdHVzLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfZmxpcFN0YXR1cyhfYXJnX3AsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrPCdhPigmJ2Egc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzLCBfYXJnX2NiOiAmJ2EgYmluZGVyOjpTdHJvbmc8ZHluIGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzlfSUNhbGxiYWNrPikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj4geworICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhfYXJnX3N0YXR1cywgX2FyZ19jYikgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6ZmxpcFN0YXR1c1dpdGhDYWxsYmFjaywgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX2ZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soX2FyZ19zdGF0dXMsIF9hcmdfY2IsIF9haWRsX3JlcGx5KQorICAgICAgfQorICAgICkKKyAgfQorfQoraW1wbCBJTmVzdGVkU2VydmljZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuTmVzdGVkU2VydmljZT4geworICBmbiBmbGlwU3RhdHVzKCZzZWxmLCBfYXJnX3A6ICZjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCkgLT4gYmluZGVyOjpSZXN1bHQ8Y3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfNl9SZXN1bHQ+IHsgc2VsZi4wLmZsaXBTdGF0dXMoX2FyZ19wKSB9CisgIGZuIGZsaXBTdGF0dXNXaXRoQ2FsbGJhY2soJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FyZ19jYjogJmJpbmRlcjo6U3Ryb25nPGR5biBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZV85X0lDYWxsYmFjaz4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5mbGlwU3RhdHVzV2l0aENhbGxiYWNrKF9hcmdfc3RhdHVzLCBfYXJnX2NiKSB9Cit9CitmbiBvbl90cmFuc2FjdChfYWlkbF9zZXJ2aWNlOiAmZHluIElOZXN0ZWRTZXJ2aWNlLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgIG1hdGNoIF9haWRsX2NvZGUgeworICAgIHRyYW5zYWN0aW9uczo6ZmxpcFN0YXR1cyA9PiB7CisgICAgICBsZXQgX2FyZ19wOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZCA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLmZsaXBTdGF0dXMoJl9hcmdfcCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfcmV0dXJuKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6OmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2sgPT4geworICAgICAgbGV0IF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cyA9IF9haWRsX2RhdGEucmVhZCgpPzsKKyAgICAgIGxldCBfYXJnX2NiOiBiaW5kZXI6OlN0cm9uZzxkeW4gY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s+ID0gX2FpZGxfZGF0YS5yZWFkKCk/OworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhfYXJnX3N0YXR1cywgJl9hcmdfY2IpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICB9Cit9CitwdWIgbW9kIFJlc3VsdCB7CisgICNbZGVyaXZlKERlYnVnLCBQYXJ0aWFsRXEpXQorICBwdWIgc3RydWN0IFJlc3VsdCB7CisgICAgcHViIHN0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMsCisgIH0KKyAgaW1wbCBEZWZhdWx0IGZvciBSZXN1bHQgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgIFNlbGYgeworICAgICAgICBzdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzOjpPSywKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFJlc3VsdCB7CisgICAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgICAgcGFyY2VsLnNpemVkX3dyaXRlKHxzdWJwYXJjZWx8IHsKKyAgICAgICAgc3VicGFyY2VsLndyaXRlKCZzZWxmLnN0YXR1cyk/OworICAgICAgICBPaygoKSkKKyAgICAgIH0pCisgICAgfQorICAgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgICBwYXJjZWwuc2l6ZWRfcmVhZCh8c3VicGFyY2VsfCB7CisgICAgICAgIGlmIHN1YnBhcmNlbC5oYXNfbW9yZV9kYXRhKCkgeworICAgICAgICAgIHNlbGYuc3RhdHVzID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgICB9KQorICAgIH0KKyAgfQorICBiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShSZXN1bHQpOworICBiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFJlc3VsdCk7CisgIGltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBSZXN1bHQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuUmVzdWx0IiB9CisgIH0KK30KK3B1YiBtb2QgSUNhbGxiYWNrIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0KKyAgI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7CisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKKyAgZGVjbGFyZV9iaW5kZXJfaW50ZXJmYWNlISB7CisgICAgSUNhbGxiYWNrWyJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayJdIHsKKyAgICAgIG5hdGl2ZTogQm5DYWxsYmFjayhvbl90cmFuc2FjdCksCisgICAgICBwcm94eTogQnBDYWxsYmFjayB7CisgICAgICB9LAorICAgICAgYXN5bmM6IElDYWxsYmFja0FzeW5jLAorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUNhbGxiYWNrOiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICAgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2UuSUNhbGxiYWNrIiB9CisgICAgZm4gZG9uZSgmc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgICAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJQ2FsbGJhY2tEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIERFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCkuY2xvbmUoKQorICAgIH0KKyAgICBmbiBzZXREZWZhdWx0SW1wbChkOiBJQ2FsbGJhY2tEZWZhdWx0UmVmKSAtPiBJQ2FsbGJhY2tEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICAgIHN0ZDo6bWVtOjpyZXBsYWNlKCZtdXQgKkRFRkFVTFRfSU1QTC5sb2NrKCkudW53cmFwKCksIGQpCisgICAgfQorICB9CisgIHB1YiB0cmFpdCBJQ2FsbGJhY2tBc3luYzxQPjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayIgfQorICAgIGZuIGRvbmU8J2E+KCYnYSBzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICB9CisgICNbOjphc3luY190cmFpdDo6YXN5bmNfdHJhaXRdCisgIHB1YiB0cmFpdCBJQ2FsbGJhY2tBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLklOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjayIgfQorICAgIGFzeW5jIGZuIGRvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICB9CisgIGltcGwgQm5DYWxsYmFjayB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgICBwdWIgZm4gbmV3X2FzeW5jX2JpbmRlcjxULCBSPihpbm5lcjogVCwgcnQ6IFIsIGZlYXR1cmVzOiBiaW5kZXI6OkJpbmRlckZlYXR1cmVzKSAtPiBiaW5kZXI6OlN0cm9uZzxkeW4gSUNhbGxiYWNrPgorICAgIHdoZXJlCisgICAgICBUOiBJQ2FsbGJhY2tBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIHsKKyAgICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgICAgX2lubmVyOiBULAorICAgICAgICBfcnQ6IFIsCisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICAgIGZuIGFzX2JpbmRlcigmc2VsZikgLT4gYmluZGVyOjpTcElCaW5kZXIgeyBzZWxmLl9pbm5lci5hc19iaW5kZXIoKSB9CisgICAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgICB9CisgICAgICBpbXBsPFQsIFI+IElDYWxsYmFjayBmb3IgV3JhcHBlcjxULCBSPgorICAgICAgd2hlcmUKKyAgICAgICAgVDogSUNhbGxiYWNrQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIHsKKyAgICAgICAgZm4gZG9uZSgmc2VsZiwgX2FyZ19zdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICAgIHNlbGYuX3J0LmJsb2NrX29uKHNlbGYuX2lubmVyLmRvbmUoX2FyZ19zdGF0dXMpKQorICAgICAgICB9CisgICAgICB9CisgICAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICAgIH0KKyAgfQorICBwdWIgdHJhaXQgSUNhbGxiYWNrRGVmYXVsdDogU2VuZCArIFN5bmMgeworICAgIGZuIGRvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKyAgfQorICBwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgICAgcHViIGNvbnN0IGRvbmU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwOworICB9CisgIHB1YiB0eXBlIElDYWxsYmFja0RlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElDYWxsYmFja0RlZmF1bHQ+PjsKKyAgdXNlIGxhenlfc3RhdGljOjpsYXp5X3N0YXRpYzsKKyAgbGF6eV9zdGF0aWMhIHsKKyAgICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJQ2FsbGJhY2tEZWZhdWx0UmVmPiA9IHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhOb25lKTsKKyAgfQorICBpbXBsIEJwQ2FsbGJhY2sgeworICAgIGZuIGJ1aWxkX3BhcmNlbF9kb25lKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgICAgbGV0IG11dCBhaWRsX2RhdGEgPSBzZWxmLmJpbmRlci5wcmVwYXJlX3RyYW5zYWN0KCk/OworICAgICAgYWlkbF9kYXRhLndyaXRlKCZfYXJnX3N0YXR1cyk/OworICAgICAgT2soYWlkbF9kYXRhKQorICAgIH0KKyAgICBmbiByZWFkX3Jlc3BvbnNlX2RvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cywgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgICBpZiBsZXQgU29tZShfYWlkbF9kZWZhdWx0X2ltcGwpID0gPFNlbGYgYXMgSUNhbGxiYWNrPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5kb25lKF9hcmdfc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGV0IF9haWRsX3JlcGx5ID0gX2FpZGxfcmVwbHk/OworICAgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgICBPaygoKSkKKyAgICB9CisgIH0KKyAgaW1wbCBJQ2FsbGJhY2sgZm9yIEJwQ2FsbGJhY2sgeworICAgIGZuIGRvbmUoJnNlbGYsIF9hcmdfc3RhdHVzOiBjcmF0ZTo6bWFuZ2xlZDo6XzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8yMF9QYXJjZWxhYmxlV2l0aE5lc3RlZF82X1N0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfZG9uZShfYXJnX3N0YXR1cyk/OworICAgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6ZG9uZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9kb25lKF9hcmdfc3RhdHVzLCBfYWlkbF9yZXBseSkKKyAgICB9CisgIH0KKyAgaW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSUNhbGxiYWNrQXN5bmM8UD4gZm9yIEJwQ2FsbGJhY2sgeworICAgIGZuIGRvbmU8J2E+KCYnYSBzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICAgIGxldCBfYWlkbF9kYXRhID0gbWF0Y2ggc2VsZi5idWlsZF9wYXJjZWxfZG9uZShfYXJnX3N0YXR1cykgeworICAgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgICBFcnIoZXJyKSA9PiByZXR1cm4gQm94OjpwaW4oc3RkOjpmdXR1cmU6OnJlYWR5KEVycihlcnIpKSksCisgICAgICB9OworICAgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgICBQOjpzcGF3bigKKyAgICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6ZG9uZSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICAgIHNlbGYucmVhZF9yZXNwb25zZV9kb25lKF9hcmdfc3RhdHVzLCBfYWlkbF9yZXBseSkKKyAgICAgICAgfQorICAgICAgKQorICAgIH0KKyAgfQorICBpbXBsIElDYWxsYmFjayBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuQ2FsbGJhY2s+IHsKKyAgICBmbiBkb25lKCZzZWxmLCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5kb25lKF9hcmdfc3RhdHVzKSB9CisgIH0KKyAgZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJQ2FsbGJhY2ssIF9haWRsX2NvZGU6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSwgX2FpZGxfZGF0YTogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPiwgX2FpZGxfcmVwbHk6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+KSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKKyAgICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICAgIHRyYW5zYWN0aW9uczo6ZG9uZSA9PiB7CisgICAgICAgIGxldCBfYXJnX3N0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXMgPSBfYWlkbF9kYXRhLnJlYWQoKT87CisgICAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLmRvbmUoX2FyZ19zdGF0dXMpOworICAgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICAgIH0KKyAgICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgICAgfQorICAgICAgXyA9PiBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKQorICAgIH0KKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SU5lc3RlZFNlcnZpY2UgYXMgXzdfYW5kcm9pZF80X2FpZGxfNV90ZXN0c182X25lc3RlZF8xNF9JTmVzdGVkU2VydmljZTsKKyBwdWIgdXNlIHN1cGVyOjpSZXN1bHQ6OlJlc3VsdCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzE0X0lOZXN0ZWRTZXJ2aWNlXzZfUmVzdWx0OworIHB1YiB1c2Ugc3VwZXI6OklDYWxsYmFjazo6SUNhbGxiYWNrIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMTRfSU5lc3RlZFNlcnZpY2VfOV9JQ2FsbGJhY2s7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9JTmVzdGVkU2VydmljZS5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvSU5lc3RlZFNlcnZpY2UucnMuZApAQCAtMCwwICsxLDMgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL0lOZXN0ZWRTZXJ2aWNlLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYwZDhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLnJzCkBAIC0wLDAgKzEsNDggQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgIHB1YiBzdGF0dXM6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkXzZfU3RhdHVzLAorfQoraW1wbCBEZWZhdWx0IGZvciBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICBTZWxmIHsKKyAgICAgIHN0YXR1czogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXM6Ok9LLAorICAgIH0KKyAgfQorfQoraW1wbCBiaW5kZXI6OlBhcmNlbGFibGUgZm9yIFBhcmNlbGFibGVXaXRoTmVzdGVkIHsKKyAgZm4gd3JpdGVfdG9fcGFyY2VsKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWwpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICAgIHBhcmNlbC5zaXplZF93cml0ZSh8c3VicGFyY2VsfCB7CisgICAgICBzdWJwYXJjZWwud3JpdGUoJnNlbGYuc3RhdHVzKT87CisgICAgICBPaygoKSkKKyAgICB9KQorICB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgcGFyY2VsLnNpemVkX3JlYWQofHN1YnBhcmNlbHwgeworICAgICAgaWYgc3VicGFyY2VsLmhhc19tb3JlX2RhdGEoKSB7CisgICAgICAgIHNlbGYuc3RhdHVzID0gc3VicGFyY2VsLnJlYWQoKT87CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9KQorICB9Cit9CitiaW5kZXI6OmltcGxfc2VyaWFsaXplX2Zvcl9wYXJjZWxhYmxlIShQYXJjZWxhYmxlV2l0aE5lc3RlZCk7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFBhcmNlbGFibGVXaXRoTmVzdGVkKTsKK2ltcGwgYmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsYWJsZU1ldGFkYXRhIGZvciBQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuUGFyY2VsYWJsZVdpdGhOZXN0ZWQiIH0KK30KK3B1YiBtb2QgU3RhdHVzIHsKKyAgIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisgIHVzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2VudW07CisgIGRlY2xhcmVfYmluZGVyX2VudW0hIHsKKyAgICBTdGF0dXMgOiBbaTg7IDJdIHsKKyAgICAgIE9LID0gMCwKKyAgICAgIE5PVF9PSyA9IDEsCisgICAgfQorICB9Cit9CitwdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsKKyBwdWIgdXNlIHN1cGVyOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfbmVzdGVkXzIwX1BhcmNlbGFibGVXaXRoTmVzdGVkOworIHB1YiB1c2Ugc3VwZXI6OlN0YXR1czo6U3RhdHVzIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl9uZXN0ZWRfMjBfUGFyY2VsYWJsZVdpdGhOZXN0ZWRfNl9TdGF0dXM7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL25lc3RlZC9QYXJjZWxhYmxlV2l0aE5lc3RlZC5ycy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTQxNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9uZXN0ZWQvUGFyY2VsYWJsZVdpdGhOZXN0ZWQucnMuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLnJzIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvbmVzdGVkL1BhcmNlbGFibGVXaXRoTmVzdGVkLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLnJzCkBAIC0wLDAgKzEsMjQyIEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KKyMhW2FsbG93KG5vbl91cHBlcl9jYXNlX2dsb2JhbHMpXQorIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXQorI1thbGxvdyh1bnVzZWRfaW1wb3J0cyldIHVzZSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpJQmluZGVySW50ZXJuYWw7Cit1c2UgYmluZGVyOjpkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2U7CitkZWNsYXJlX2JpbmRlcl9pbnRlcmZhY2UhIHsKKyAgSVByb3RlY3RlZFsiYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZCJdIHsKKyAgICBuYXRpdmU6IEJuUHJvdGVjdGVkKG9uX3RyYW5zYWN0KSwKKyAgICBwcm94eTogQnBQcm90ZWN0ZWQgeworICAgIH0sCisgICAgYXN5bmM6IElQcm90ZWN0ZWRBc3luYywKKyAgfQorfQorcHViIHRyYWl0IElQcm90ZWN0ZWQ6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWQiIH0KKyAgZm4gUGVybWlzc2lvblByb3RlY3RlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBmbiBNdWx0aXBsZVBlcm1pc3Npb25zQWxsKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIE11bHRpcGxlUGVybWlzc2lvbnNBbnkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJUHJvdGVjdGVkRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgIH0KKyAgZm4gc2V0RGVmYXVsdEltcGwoZDogSVByb3RlY3RlZERlZmF1bHRSZWYpIC0+IElQcm90ZWN0ZWREZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQorICB9Cit9CitwdWIgdHJhaXQgSVByb3RlY3RlZEFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkIiB9CisgIGZuIFBlcm1pc3Npb25Qcm90ZWN0ZWQ8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FsbDwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworICBmbiBNdWx0aXBsZVBlcm1pc3Npb25zQW55PCdhPigmJ2Egc2VsZikgLT4gYmluZGVyOjpCb3hGdXR1cmU8J2EsIGJpbmRlcjo6UmVzdWx0PCgpPj47Cit9CisjWzo6YXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0XQorcHViIHRyYWl0IElQcm90ZWN0ZWRBc3luY1NlcnZlcjogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZCIgfQorICBhc3luYyBmbiBQZXJtaXNzaW9uUHJvdGVjdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGFzeW5jIGZuIE11bHRpcGxlUGVybWlzc2lvbnNBbGwoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgYXN5bmMgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworfQoraW1wbCBCblByb3RlY3RlZCB7CisgIC8vLyBDcmVhdGUgYSBuZXcgYXN5bmMgYmluZGVyIHNlcnZpY2UuCisgIHB1YiBmbiBuZXdfYXN5bmNfYmluZGVyPFQsIFI+KGlubmVyOiBULCBydDogUiwgZmVhdHVyZXM6IGJpbmRlcjo6QmluZGVyRmVhdHVyZXMpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJUHJvdGVjdGVkPgorICB3aGVyZQorICAgIFQ6IElQcm90ZWN0ZWRBc3luY1NlcnZlciArIGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgeworICAgIHN0cnVjdCBXcmFwcGVyPFQsIFI+IHsKKyAgICAgIF9pbm5lcjogVCwKKyAgICAgIF9ydDogUiwKKyAgICB9CisgICAgaW1wbDxULCBSPiBiaW5kZXI6OkludGVyZmFjZSBmb3IgV3JhcHBlcjxULCBSPiB3aGVyZSBUOiBiaW5kZXI6OkludGVyZmFjZSwgUjogU2VuZCArIFN5bmMgeworICAgICAgZm4gYXNfYmluZGVyKCZzZWxmKSAtPiBiaW5kZXI6OlNwSUJpbmRlciB7IHNlbGYuX2lubmVyLmFzX2JpbmRlcigpIH0KKyAgICAgIGZuIGR1bXAoJnNlbGYsIF9maWxlOiAmc3RkOjpmczo6RmlsZSwgX2FyZ3M6ICZbJnN0ZDo6ZmZpOjpDU3RyXSkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7IHNlbGYuX2lubmVyLmR1bXAoX2ZpbGUsIF9hcmdzKSB9CisgICAgfQorICAgIGltcGw8VCwgUj4gSVByb3RlY3RlZCBmb3IgV3JhcHBlcjxULCBSPgorICAgIHdoZXJlCisgICAgICBUOiBJUHJvdGVjdGVkQXN5bmNTZXJ2ZXIgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgICBSOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCaW5kZXJBc3luY1J1bnRpbWUgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgeworICAgICAgZm4gUGVybWlzc2lvblByb3RlY3RlZCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuUGVybWlzc2lvblByb3RlY3RlZCgpKQorICAgICAgfQorICAgICAgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpKQorICAgICAgfQorICAgICAgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5fcnQuYmxvY2tfb24oc2VsZi5faW5uZXIuTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgpKQorICAgICAgfQorICAgIH0KKyAgICBsZXQgd3JhcHBlZCA9IFdyYXBwZXIgeyBfaW5uZXI6IGlubmVyLCBfcnQ6IHJ0IH07CisgICAgU2VsZjo6bmV3X2JpbmRlcih3cmFwcGVkLCBmZWF0dXJlcykKKyAgfQorfQorcHViIHRyYWl0IElQcm90ZWN0ZWREZWZhdWx0OiBTZW5kICsgU3luYyB7CisgIGZuIFBlcm1pc3Npb25Qcm90ZWN0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTi5pbnRvKCkpCisgIH0KKyAgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBNdWx0aXBsZVBlcm1pc3Npb25zQW55KCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9Cit9CitwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgIHB1YiBjb25zdCBQZXJtaXNzaW9uUHJvdGVjdGVkOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IE11bHRpcGxlUGVybWlzc2lvbnNBbGw6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworICBwdWIgY29uc3QgTXVsdGlwbGVQZXJtaXNzaW9uc0FueTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlID0gYmluZGVyOjpiaW5kZXJfaW1wbDo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Cit9CitwdWIgdHlwZSBJUHJvdGVjdGVkRGVmYXVsdFJlZiA9IE9wdGlvbjxzdGQ6OnN5bmM6OkFyYzxkeW4gSVByb3RlY3RlZERlZmF1bHQ+PjsKK3VzZSBsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWM7CitsYXp5X3N0YXRpYyEgeworICBzdGF0aWMgcmVmIERFRkFVTFRfSU1QTDogc3RkOjpzeW5jOjpNdXRleDxJUHJvdGVjdGVkRGVmYXVsdFJlZj4gPSBzdGQ6OnN5bmM6Ok11dGV4OjpuZXcoTm9uZSk7Cit9CitpbXBsIEJwUHJvdGVjdGVkIHsKKyAgZm4gYnVpbGRfcGFyY2VsX1Blcm1pc3Npb25Qcm90ZWN0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9QZXJtaXNzaW9uUHJvdGVjdGVkKCZzZWxmLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElQcm90ZWN0ZWQ+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5QZXJtaXNzaW9uUHJvdGVjdGVkKCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgT2soKCkpCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX011bHRpcGxlUGVybWlzc2lvbnNBbGwoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9NdWx0aXBsZVBlcm1pc3Npb25zQWxsKCZzZWxmLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElQcm90ZWN0ZWQ+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5NdWx0aXBsZVBlcm1pc3Npb25zQWxsKCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgT2soKCkpCisgIH0KKyAgZm4gYnVpbGRfcGFyY2VsX011bHRpcGxlUGVybWlzc2lvbnNBbnkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbD4geworICAgIGxldCBtdXQgYWlkbF9kYXRhID0gc2VsZi5iaW5kZXIucHJlcGFyZV90cmFuc2FjdCgpPzsKKyAgICBPayhhaWRsX2RhdGEpCisgIH0KKyAgZm4gcmVhZF9yZXNwb25zZV9NdWx0aXBsZVBlcm1pc3Npb25zQW55KCZzZWxmLCBfYWlkbF9yZXBseTogc3RkOjpyZXN1bHQ6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWwsIGJpbmRlcjo6U3RhdHVzQ29kZT4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04pID0gX2FpZGxfcmVwbHkgeworICAgICAgaWYgbGV0IFNvbWUoX2FpZGxfZGVmYXVsdF9pbXBsKSA9IDxTZWxmIGFzIElQcm90ZWN0ZWQ+OjpnZXREZWZhdWx0SW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIF9haWRsX2RlZmF1bHRfaW1wbC5NdWx0aXBsZVBlcm1pc3Npb25zQW55KCk7CisgICAgICB9CisgICAgfQorICAgIGxldCBfYWlkbF9yZXBseSA9IF9haWRsX3JlcGx5PzsKKyAgICBsZXQgX2FpZGxfc3RhdHVzOiBiaW5kZXI6OlN0YXR1cyA9IF9haWRsX3JlcGx5LnJlYWQoKT87CisgICAgaWYgIV9haWRsX3N0YXR1cy5pc19vaygpIHsgcmV0dXJuIEVycihfYWlkbF9zdGF0dXMpOyB9CisgICAgT2soKCkpCisgIH0KK30KK2ltcGwgSVByb3RlY3RlZCBmb3IgQnBQcm90ZWN0ZWQgeworICBmbiBQZXJtaXNzaW9uUHJvdGVjdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfUGVybWlzc2lvblByb3RlY3RlZCgpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpQZXJtaXNzaW9uUHJvdGVjdGVkLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9QZXJtaXNzaW9uUHJvdGVjdGVkKF9haWRsX3JlcGx5KQorICB9CisgIGZuIE11bHRpcGxlUGVybWlzc2lvbnNBbGwoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBzZWxmLmJ1aWxkX3BhcmNlbF9NdWx0aXBsZVBlcm1pc3Npb25zQWxsKCk/OworICAgIGxldCBfYWlkbF9yZXBseSA9IHNlbGYuYmluZGVyLnN1Ym1pdF90cmFuc2FjdCh0cmFuc2FjdGlvbnM6Ok11bHRpcGxlUGVybWlzc2lvbnNBbGwsIF9haWRsX2RhdGEsIGJpbmRlcjo6YmluZGVyX2ltcGw6OkZMQUdfUFJJVkFURV9MT0NBTCk7CisgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX011bHRpcGxlUGVybWlzc2lvbnNBbGwoX2FpZGxfcmVwbHkpCisgIH0KKyAgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FueSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX011bHRpcGxlUGVybWlzc2lvbnNBbnkoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6TXVsdGlwbGVQZXJtaXNzaW9uc0FueSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfTXVsdGlwbGVQZXJtaXNzaW9uc0FueShfYWlkbF9yZXBseSkKKyAgfQorfQoraW1wbDxQOiBiaW5kZXI6OkJpbmRlckFzeW5jUG9vbD4gSVByb3RlY3RlZEFzeW5jPFA+IGZvciBCcFByb3RlY3RlZCB7CisgIGZuIFBlcm1pc3Npb25Qcm90ZWN0ZWQ8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9QZXJtaXNzaW9uUHJvdGVjdGVkKCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6UGVybWlzc2lvblByb3RlY3RlZCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX1Blcm1pc3Npb25Qcm90ZWN0ZWQoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIE11bHRpcGxlUGVybWlzc2lvbnNBbGw8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9NdWx0aXBsZVBlcm1pc3Npb25zQWxsKCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6TXVsdGlwbGVQZXJtaXNzaW9uc0FsbCwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX011bHRpcGxlUGVybWlzc2lvbnNBbGwoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9CisgIGZuIE11bHRpcGxlUGVybWlzc2lvbnNBbnk8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PiB7CisgICAgbGV0IF9haWRsX2RhdGEgPSBtYXRjaCBzZWxmLmJ1aWxkX3BhcmNlbF9NdWx0aXBsZVBlcm1pc3Npb25zQW55KCkgeworICAgICAgT2soX2FpZGxfZGF0YSkgPT4gX2FpZGxfZGF0YSwKKyAgICAgIEVycihlcnIpID0+IHJldHVybiBCb3g6OnBpbihzdGQ6OmZ1dHVyZTo6cmVhZHkoRXJyKGVycikpKSwKKyAgICB9OworICAgIGxldCBiaW5kZXIgPSBzZWxmLmJpbmRlci5jbG9uZSgpOworICAgIFA6OnNwYXduKAorICAgICAgbW92ZSB8fCBiaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6TXVsdGlwbGVQZXJtaXNzaW9uc0FueSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKSwKKyAgICAgIG1vdmUgfF9haWRsX3JlcGx5fCBhc3luYyBtb3ZlIHsKKyAgICAgICAgc2VsZi5yZWFkX3Jlc3BvbnNlX011bHRpcGxlUGVybWlzc2lvbnNBbnkoX2FpZGxfcmVwbHkpCisgICAgICB9CisgICAgKQorICB9Cit9CitpbXBsIElQcm90ZWN0ZWQgZm9yIGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlcjxCblByb3RlY3RlZD4geworICBmbiBQZXJtaXNzaW9uUHJvdGVjdGVkKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuUGVybWlzc2lvblByb3RlY3RlZCgpIH0KKyAgZm4gTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsgc2VsZi4wLk11bHRpcGxlUGVybWlzc2lvbnNBbGwoKSB9CisgIGZuIE11bHRpcGxlUGVybWlzc2lvbnNBbnkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5NdWx0aXBsZVBlcm1pc3Npb25zQW55KCkgfQorfQorZm4gb25fdHJhbnNhY3QoX2FpZGxfc2VydmljZTogJmR5biBJUHJvdGVjdGVkLCBfYWlkbF9jb2RlOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUsIF9haWRsX2RhdGE6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4sIF9haWRsX3JlcGx5OiAmbXV0IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsPCdfPikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgIG1hdGNoIF9haWRsX2NvZGUgeworICAgIHRyYW5zYWN0aW9uczo6UGVybWlzc2lvblByb3RlY3RlZCA9PiB7CisgICAgICBsZXQgX2FpZGxfcmV0dXJuID0gX2FpZGxfc2VydmljZS5QZXJtaXNzaW9uUHJvdGVjdGVkKCk7CisgICAgICBtYXRjaCAmX2FpZGxfcmV0dXJuIHsKKyAgICAgICAgT2soX2FpZGxfcmV0dXJuKSA9PiB7CisgICAgICAgICAgX2FpZGxfcmVwbHkud3JpdGUoJmJpbmRlcjo6U3RhdHVzOjpmcm9tKGJpbmRlcjo6U3RhdHVzQ29kZTo6T0spKT87CisgICAgICAgIH0KKyAgICAgICAgRXJyKF9haWRsX3N0YXR1cykgPT4gX2FpZGxfcmVwbHkud3JpdGUoX2FpZGxfc3RhdHVzKT8KKyAgICAgIH0KKyAgICAgIE9rKCgpKQorICAgIH0KKyAgICB0cmFuc2FjdGlvbnM6Ok11bHRpcGxlUGVybWlzc2lvbnNBbGwgPT4geworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuTXVsdGlwbGVQZXJtaXNzaW9uc0FsbCgpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpNdWx0aXBsZVBlcm1pc3Npb25zQW55ID0+IHsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLk11bHRpcGxlUGVybWlzc2lvbnNBbnkoKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SVByb3RlY3RlZCBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEwX3Blcm1pc3Npb25fMTBfSVByb3RlY3RlZDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkLnJzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0NzZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZC5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWQuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLnJzIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYmYzYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UucnMKQEAgLTAsMCArMSwxODggQEAKKyMhW2ZvcmJpZCh1bnNhZmVfY29kZSldCisjIVtydXN0Zm10Ojpza2lwXQorIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCisjIVthbGxvdyhub25fc25ha2VfY2FzZSldCisjW2FsbG93KHVudXNlZF9pbXBvcnRzKV0gdXNlIGJpbmRlcjo6YmluZGVyX2ltcGw6OklCaW5kZXJJbnRlcm5hbDsKK3VzZSBiaW5kZXI6OmRlY2xhcmVfYmluZGVyX2ludGVyZmFjZTsKK2RlY2xhcmVfYmluZGVyX2ludGVyZmFjZSEgeworICBJUHJvdGVjdGVkSW50ZXJmYWNlWyJhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlIl0geworICAgIG5hdGl2ZTogQm5Qcm90ZWN0ZWRJbnRlcmZhY2Uob25fdHJhbnNhY3QpLAorICAgIHByb3h5OiBCcFByb3RlY3RlZEludGVyZmFjZSB7CisgICAgfSwKKyAgICBhc3luYzogSVByb3RlY3RlZEludGVyZmFjZUFzeW5jLAorICB9Cit9CitwdWIgdHJhaXQgSVByb3RlY3RlZEludGVyZmFjZTogYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgd2hlcmUgU2VsZjogU2l6ZWQgeyAiYW5kcm9pZC5haWRsLnRlc3RzLnBlcm1pc3Npb24uSVByb3RlY3RlZEludGVyZmFjZSIgfQorICBmbiBNZXRob2QxKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47CisgIGZuIE1ldGhvZDIoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPjsKKyAgZm4gZ2V0RGVmYXVsdEltcGwoKSAtPiBJUHJvdGVjdGVkSW50ZXJmYWNlRGVmYXVsdFJlZiB3aGVyZSBTZWxmOiBTaXplZCB7CisgICAgREVGQVVMVF9JTVBMLmxvY2soKS51bndyYXAoKS5jbG9uZSgpCisgIH0KKyAgZm4gc2V0RGVmYXVsdEltcGwoZDogSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHRSZWYpIC0+IElQcm90ZWN0ZWRJbnRlcmZhY2VEZWZhdWx0UmVmIHdoZXJlIFNlbGY6IFNpemVkIHsKKyAgICBzdGQ6Om1lbTo6cmVwbGFjZSgmbXV0ICpERUZBVUxUX0lNUEwubG9jaygpLnVud3JhcCgpLCBkKQorICB9Cit9CitwdWIgdHJhaXQgSVByb3RlY3RlZEludGVyZmFjZUFzeW5jPFA+OiBiaW5kZXI6OkludGVyZmFjZSArIFNlbmQgeworICBmbiBnZXRfZGVzY3JpcHRvcigpIC0+ICYnc3RhdGljIHN0ciB3aGVyZSBTZWxmOiBTaXplZCB7ICJhbmRyb2lkLmFpZGwudGVzdHMucGVybWlzc2lvbi5JUHJvdGVjdGVkSW50ZXJmYWNlIiB9CisgIGZuIE1ldGhvZDE8J2E+KCYnYSBzZWxmKSAtPiBiaW5kZXI6OkJveEZ1dHVyZTwnYSwgYmluZGVyOjpSZXN1bHQ8KCk+PjsKKyAgZm4gTWV0aG9kMjwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+OworfQorI1s6OmFzeW5jX3RyYWl0Ojphc3luY190cmFpdF0KK3B1YiB0cmFpdCBJUHJvdGVjdGVkSW50ZXJmYWNlQXN5bmNTZXJ2ZXI6IGJpbmRlcjo6SW50ZXJmYWNlICsgU2VuZCB7CisgIGZuIGdldF9kZXNjcmlwdG9yKCkgLT4gJidzdGF0aWMgc3RyIHdoZXJlIFNlbGY6IFNpemVkIHsgImFuZHJvaWQuYWlkbC50ZXN0cy5wZXJtaXNzaW9uLklQcm90ZWN0ZWRJbnRlcmZhY2UiIH0KKyAgYXN5bmMgZm4gTWV0aG9kMSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+OworICBhc3luYyBmbiBNZXRob2QyKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT47Cit9CitpbXBsIEJuUHJvdGVjdGVkSW50ZXJmYWNlIHsKKyAgLy8vIENyZWF0ZSBhIG5ldyBhc3luYyBiaW5kZXIgc2VydmljZS4KKyAgcHViIGZuIG5ld19hc3luY19iaW5kZXI8VCwgUj4oaW5uZXI6IFQsIHJ0OiBSLCBmZWF0dXJlczogYmluZGVyOjpCaW5kZXJGZWF0dXJlcykgLT4gYmluZGVyOjpTdHJvbmc8ZHluIElQcm90ZWN0ZWRJbnRlcmZhY2U+CisgIHdoZXJlCisgICAgVDogSVByb3RlY3RlZEludGVyZmFjZUFzeW5jU2VydmVyICsgYmluZGVyOjpJbnRlcmZhY2UgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUjogYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyQXN5bmNSdW50aW1lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICB7CisgICAgc3RydWN0IFdyYXBwZXI8VCwgUj4geworICAgICAgX2lubmVyOiBULAorICAgICAgX3J0OiBSLAorICAgIH0KKyAgICBpbXBsPFQsIFI+IGJpbmRlcjo6SW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+IHdoZXJlIFQ6IGJpbmRlcjo6SW50ZXJmYWNlLCBSOiBTZW5kICsgU3luYyB7CisgICAgICBmbiBhc19iaW5kZXIoJnNlbGYpIC0+IGJpbmRlcjo6U3BJQmluZGVyIHsgc2VsZi5faW5uZXIuYXNfYmluZGVyKCkgfQorICAgICAgZm4gZHVtcCgmc2VsZiwgX2ZpbGU6ICZzdGQ6OmZzOjpGaWxlLCBfYXJnczogJlsmc3RkOjpmZmk6OkNTdHJdKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsgc2VsZi5faW5uZXIuZHVtcChfZmlsZSwgX2FyZ3MpIH0KKyAgICB9CisgICAgaW1wbDxULCBSPiBJUHJvdGVjdGVkSW50ZXJmYWNlIGZvciBXcmFwcGVyPFQsIFI+CisgICAgd2hlcmUKKyAgICAgIFQ6IElQcm90ZWN0ZWRJbnRlcmZhY2VBc3luY1NlcnZlciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICAgIFI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OkJpbmRlckFzeW5jUnVudGltZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICB7CisgICAgICBmbiBNZXRob2QxKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5NZXRob2QxKCkpCisgICAgICB9CisgICAgICBmbiBNZXRob2QyKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLl9ydC5ibG9ja19vbihzZWxmLl9pbm5lci5NZXRob2QyKCkpCisgICAgICB9CisgICAgfQorICAgIGxldCB3cmFwcGVkID0gV3JhcHBlciB7IF9pbm5lcjogaW5uZXIsIF9ydDogcnQgfTsKKyAgICBTZWxmOjpuZXdfYmluZGVyKHdyYXBwZWQsIGZlYXR1cmVzKQorICB9Cit9CitwdWIgdHJhaXQgSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHQ6IFNlbmQgKyBTeW5jIHsKKyAgZm4gTWV0aG9kMSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OLmludG8oKSkKKyAgfQorICBmbiBNZXRob2QyKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICB9Cit9CitwdWIgbW9kIHRyYW5zYWN0aW9ucyB7CisgIHB1YiBjb25zdCBNZXRob2QxOiBiaW5kZXI6OmJpbmRlcl9pbXBsOjpUcmFuc2FjdGlvbkNvZGUgPSBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgcHViIGNvbnN0IE1ldGhvZDI6IGJpbmRlcjo6YmluZGVyX2ltcGw6OlRyYW5zYWN0aW9uQ29kZSA9IGJpbmRlcjo6YmluZGVyX2ltcGw6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOworfQorcHViIHR5cGUgSVByb3RlY3RlZEludGVyZmFjZURlZmF1bHRSZWYgPSBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZHluIElQcm90ZWN0ZWRJbnRlcmZhY2VEZWZhdWx0Pj47Cit1c2UgbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljOworbGF6eV9zdGF0aWMhIHsKKyAgc3RhdGljIHJlZiBERUZBVUxUX0lNUEw6IHN0ZDo6c3luYzo6TXV0ZXg8SVByb3RlY3RlZEludGVyZmFjZURlZmF1bHRSZWY+ID0gc3RkOjpzeW5jOjpNdXRleDo6bmV3KE5vbmUpOworfQoraW1wbCBCcFByb3RlY3RlZEludGVyZmFjZSB7CisgIGZuIGJ1aWxkX3BhcmNlbF9NZXRob2QxKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfTWV0aG9kMSgmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJUHJvdGVjdGVkSW50ZXJmYWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuTWV0aG9kMSgpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIE9rKCgpKQorICB9CisgIGZuIGJ1aWxkX3BhcmNlbF9NZXRob2QyKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OmJpbmRlcl9pbXBsOjpQYXJjZWw+IHsKKyAgICBsZXQgbXV0IGFpZGxfZGF0YSA9IHNlbGYuYmluZGVyLnByZXBhcmVfdHJhbnNhY3QoKT87CisgICAgT2soYWlkbF9kYXRhKQorICB9CisgIGZuIHJlYWRfcmVzcG9uc2VfTWV0aG9kMigmc2VsZiwgX2FpZGxfcmVwbHk6IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8YmluZGVyOjpiaW5kZXJfaW1wbDo6UGFyY2VsLCBiaW5kZXI6OlN0YXR1c0NvZGU+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTktOT1dOX1RSQU5TQUNUSU9OKSA9IF9haWRsX3JlcGx5IHsKKyAgICAgIGlmIGxldCBTb21lKF9haWRsX2RlZmF1bHRfaW1wbCkgPSA8U2VsZiBhcyBJUHJvdGVjdGVkSW50ZXJmYWNlPjo6Z2V0RGVmYXVsdEltcGwoKSB7CisgICAgICAgIHJldHVybiBfYWlkbF9kZWZhdWx0X2ltcGwuTWV0aG9kMigpOworICAgICAgfQorICAgIH0KKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBfYWlkbF9yZXBseT87CisgICAgbGV0IF9haWRsX3N0YXR1czogYmluZGVyOjpTdGF0dXMgPSBfYWlkbF9yZXBseS5yZWFkKCk/OworICAgIGlmICFfYWlkbF9zdGF0dXMuaXNfb2soKSB7IHJldHVybiBFcnIoX2FpZGxfc3RhdHVzKTsgfQorICAgIE9rKCgpKQorICB9Cit9CitpbXBsIElQcm90ZWN0ZWRJbnRlcmZhY2UgZm9yIEJwUHJvdGVjdGVkSW50ZXJmYWNlIHsKKyAgZm4gTWV0aG9kMSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IHNlbGYuYnVpbGRfcGFyY2VsX01ldGhvZDEoKT87CisgICAgbGV0IF9haWRsX3JlcGx5ID0gc2VsZi5iaW5kZXIuc3VibWl0X3RyYW5zYWN0KHRyYW5zYWN0aW9uczo6TWV0aG9kMSwgX2FpZGxfZGF0YSwgYmluZGVyOjpiaW5kZXJfaW1wbDo6RkxBR19QUklWQVRFX0xPQ0FMKTsKKyAgICBzZWxmLnJlYWRfcmVzcG9uc2VfTWV0aG9kMShfYWlkbF9yZXBseSkKKyAgfQorICBmbiBNZXRob2QyKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgIGxldCBfYWlkbF9kYXRhID0gc2VsZi5idWlsZF9wYXJjZWxfTWV0aG9kMigpPzsKKyAgICBsZXQgX2FpZGxfcmVwbHkgPSBzZWxmLmJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpNZXRob2QyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpOworICAgIHNlbGYucmVhZF9yZXNwb25zZV9NZXRob2QyKF9haWRsX3JlcGx5KQorICB9Cit9CitpbXBsPFA6IGJpbmRlcjo6QmluZGVyQXN5bmNQb29sPiBJUHJvdGVjdGVkSW50ZXJmYWNlQXN5bmM8UD4gZm9yIEJwUHJvdGVjdGVkSW50ZXJmYWNlIHsKKyAgZm4gTWV0aG9kMTwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX01ldGhvZDEoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpNZXRob2QxLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfTWV0aG9kMShfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KKyAgZm4gTWV0aG9kMjwnYT4oJidhIHNlbGYpIC0+IGJpbmRlcjo6Qm94RnV0dXJlPCdhLCBiaW5kZXI6OlJlc3VsdDwoKT4+IHsKKyAgICBsZXQgX2FpZGxfZGF0YSA9IG1hdGNoIHNlbGYuYnVpbGRfcGFyY2VsX01ldGhvZDIoKSB7CisgICAgICBPayhfYWlkbF9kYXRhKSA9PiBfYWlkbF9kYXRhLAorICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEJveDo6cGluKHN0ZDo6ZnV0dXJlOjpyZWFkeShFcnIoZXJyKSkpLAorICAgIH07CisgICAgbGV0IGJpbmRlciA9IHNlbGYuYmluZGVyLmNsb25lKCk7CisgICAgUDo6c3Bhd24oCisgICAgICBtb3ZlIHx8IGJpbmRlci5zdWJtaXRfdHJhbnNhY3QodHJhbnNhY3Rpb25zOjpNZXRob2QyLCBfYWlkbF9kYXRhLCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpGTEFHX1BSSVZBVEVfTE9DQUwpLAorICAgICAgbW92ZSB8X2FpZGxfcmVwbHl8IGFzeW5jIG1vdmUgeworICAgICAgICBzZWxmLnJlYWRfcmVzcG9uc2VfTWV0aG9kMihfYWlkbF9yZXBseSkKKyAgICAgIH0KKyAgICApCisgIH0KK30KK2ltcGwgSVByb3RlY3RlZEludGVyZmFjZSBmb3IgYmluZGVyOjpiaW5kZXJfaW1wbDo6QmluZGVyPEJuUHJvdGVjdGVkSW50ZXJmYWNlPiB7CisgIGZuIE1ldGhvZDEoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7IHNlbGYuMC5NZXRob2QxKCkgfQorICBmbiBNZXRob2QyKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geyBzZWxmLjAuTWV0aG9kMigpIH0KK30KK2ZuIG9uX3RyYW5zYWN0KF9haWRsX3NlcnZpY2U6ICZkeW4gSVByb3RlY3RlZEludGVyZmFjZSwgX2FpZGxfY29kZTogYmluZGVyOjpiaW5kZXJfaW1wbDo6VHJhbnNhY3Rpb25Db2RlLCBfYWlkbF9kYXRhOiAmYmluZGVyOjpiaW5kZXJfaW1wbDo6Qm9ycm93ZWRQYXJjZWw8J18+LCBfYWlkbF9yZXBseTogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbDwnXz4pIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8KCksIGJpbmRlcjo6U3RhdHVzQ29kZT4geworICBtYXRjaCBfYWlkbF9jb2RlIHsKKyAgICB0cmFuc2FjdGlvbnM6Ok1ldGhvZDEgPT4geworICAgICAgbGV0IF9haWRsX3JldHVybiA9IF9haWRsX3NlcnZpY2UuTWV0aG9kMSgpOworICAgICAgbWF0Y2ggJl9haWRsX3JldHVybiB7CisgICAgICAgIE9rKF9haWRsX3JldHVybikgPT4geworICAgICAgICAgIF9haWRsX3JlcGx5LndyaXRlKCZiaW5kZXI6OlN0YXR1czo6ZnJvbShiaW5kZXI6OlN0YXR1c0NvZGU6Ok9LKSk/OworICAgICAgICB9CisgICAgICAgIEVycihfYWlkbF9zdGF0dXMpID0+IF9haWRsX3JlcGx5LndyaXRlKF9haWRsX3N0YXR1cyk/CisgICAgICB9CisgICAgICBPaygoKSkKKyAgICB9CisgICAgdHJhbnNhY3Rpb25zOjpNZXRob2QyID0+IHsKKyAgICAgIGxldCBfYWlkbF9yZXR1cm4gPSBfYWlkbF9zZXJ2aWNlLk1ldGhvZDIoKTsKKyAgICAgIG1hdGNoICZfYWlkbF9yZXR1cm4geworICAgICAgICBPayhfYWlkbF9yZXR1cm4pID0+IHsKKyAgICAgICAgICBfYWlkbF9yZXBseS53cml0ZSgmYmluZGVyOjpTdGF0dXM6OmZyb20oYmluZGVyOjpTdGF0dXNDb2RlOjpPSykpPzsKKyAgICAgICAgfQorICAgICAgICBFcnIoX2FpZGxfc3RhdHVzKSA9PiBfYWlkbF9yZXBseS53cml0ZShfYWlkbF9zdGF0dXMpPworICAgICAgfQorICAgICAgT2soKCkpCisgICAgfQorICAgIF8gPT4gRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5LTk9XTl9UUkFOU0FDVElPTikKKyAgfQorfQorcHViKGNyYXRlKSBtb2QgbWFuZ2xlZCB7CisgcHViIHVzZSBzdXBlcjo6SVByb3RlY3RlZEludGVyZmFjZSBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzEwX3Blcm1pc3Npb25fMTlfSVByb3RlY3RlZEludGVyZmFjZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5ycy5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvcGVybWlzc2lvbi9JUHJvdGVjdGVkSW50ZXJmYWNlLnJzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4MzU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3Blcm1pc3Npb24vSVByb3RlY3RlZEludGVyZmFjZS5ycy5kCkBAIC0wLDAgKzEsMiBAQAorb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UucnMgOiBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9wZXJtaXNzaW9uL0lQcm90ZWN0ZWRJbnRlcmZhY2UuYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24ucnMKaW5kZXggNDI2YjlkMi4uYmYxNDJmNyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvRW51bVVuaW9uLnJzCkBAIC0xLDI5ICsxLDE4IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KIHB1YiBlbnVtIEVudW1VbmlvbiB7CiAgIEludEVudW0oY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtKSwKICAgTG9uZ0VudW0oY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfOF9Mb25nRW51bSksCiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6RW51bVVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl91bmlvbnNfOV9FbnVtVW5pb247IH0KIGltcGwgRGVmYXVsdCBmb3IgRW51bVVuaW9uIHsKICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewogICAgIFNlbGY6OkludEVudW0oY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtOjpGT08pCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgRW51bVVuaW9uIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBFbnVtVW5pb24ge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgRW51bVVuaW9uIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKLSAgICBtYXRjaCB0aGlzIHsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBFbnVtVW5pb24geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpJbnRFbnVtKHYpID0+IHsKICAgICAgICAgcGFyY2VsLndyaXRlKCYwaTMyKT87CiAgICAgICAgIHBhcmNlbC53cml0ZSh2KQpAQCAtMzQsMjggKzIzLDE4IEBACiAgICAgICB9CiAgICAgfQogICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZSBmb3IgRW51bVVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemUocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8U2VsZj4gewotICAgIDxTZWxmIGFzIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbj46OmRlc2VyaWFsaXplX29wdGlvbihwYXJjZWwpCi0gICAgICAgLnRyYW5zcG9zZSgpCi0gICAgICAgLnVud3JhcF9vcihFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpVTkVYUEVDVEVEX05VTEwpKQotICB9Ci19Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZUFycmF5IGZvciBFbnVtVW5pb24ge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OkRlc2VyaWFsaXplT3B0aW9uIGZvciBFbnVtVW5pb24gewotICBmbiBkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsOiAmYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFNlbGY+PiB7Ci0gICAgbGV0IHN0YXR1czogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgaWYgc3RhdHVzID09IDAgeyByZXR1cm4gT2soTm9uZSk7IH0KKyAgZm4gcmVhZF9mcm9tX3BhcmNlbCgmbXV0IHNlbGYsIHBhcmNlbDogJmJpbmRlcjo6YmluZGVyX2ltcGw6OkJvcnJvd2VkUGFyY2VsKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PCgpLCBiaW5kZXI6OlN0YXR1c0NvZGU+IHsKICAgICBsZXQgdGFnOiBpMzIgPSBwYXJjZWwucmVhZCgpPzsKICAgICBtYXRjaCB0YWcgewogICAgICAgMCA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogY3JhdGU6Om1hbmdsZWQ6Ol83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfN19JbnRFbnVtID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6SW50RW51bSh2YWx1ZSkpKQorICAgICAgICAqc2VsZiA9IFNlbGY6OkludEVudW0odmFsdWUpOworICAgICAgICBPaygoKSkKICAgICAgIH0KICAgICAgIDEgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzhfTG9uZ0VudW0gPSBwYXJjZWwucmVhZCgpPzsKLSAgICAgICAgT2soU29tZShTZWxmOjpMb25nRW51bSh2YWx1ZSkpKQorICAgICAgICAqc2VsZiA9IFNlbGY6OkxvbmdFbnVtKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICBfID0+IHsKICAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKQpAQCAtNjMsMyArNDIsMTEgQEAKICAgICB9CiAgIH0KIH0KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEVudW1Vbmlvbik7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKEVudW1Vbmlvbik7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgRW51bVVuaW9uIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5FbnVtVW5pb24iIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OkVudW1VbmlvbiBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzlfRW51bVVuaW9uOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24ucnMKaW5kZXggN2FkZWU1Mi4uZmQyZDY4ZCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycworKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLnJzCkBAIC0xLDI5ICsxLDE4IEBACisjIVtmb3JiaWQodW5zYWZlX2NvZGUpXQorIyFbcnVzdGZtdDo6c2tpcF0KICNbZGVyaXZlKERlYnVnLCBDbG9uZSwgUGFydGlhbEVxKV0KIHB1YiBlbnVtIFVuaW9uSW5VbmlvbiB7CiAgIEZpcnN0KGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzlfRW51bVVuaW9uKSwKICAgU2Vjb25kKGkzMiksCiB9Ci1wdWIoY3JhdGUpIG1vZCBtYW5nbGVkIHsgcHViIHVzZSBzdXBlcjo6VW5pb25JblVuaW9uIGFzIF83X2FuZHJvaWRfNF9haWRsXzVfdGVzdHNfNl91bmlvbnNfMTJfVW5pb25JblVuaW9uOyB9CiBpbXBsIERlZmF1bHQgZm9yIFVuaW9uSW5VbmlvbiB7CiAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKICAgICBTZWxmOjpGaXJzdChEZWZhdWx0OjpkZWZhdWx0KCkpCiAgIH0KIH0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZSBmb3IgVW5pb25JblVuaW9uIHsKLSAgZm4gc2VyaWFsaXplKCZzZWxmLCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6U2VyaWFsaXplT3B0aW9uPjo6c2VyaWFsaXplX29wdGlvbihTb21lKHNlbGYpLCBwYXJjZWwpCi0gIH0KLX0KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZUFycmF5IGZvciBVbmlvbkluVW5pb24ge30KLWltcGwgYmluZGVyOjpwYXJjZWw6OlNlcmlhbGl6ZU9wdGlvbiBmb3IgVW5pb25JblVuaW9uIHsKLSAgZm4gc2VyaWFsaXplX29wdGlvbih0aGlzOiBPcHRpb248JlNlbGY+LCBwYXJjZWw6ICZtdXQgYmluZGVyOjpwYXJjZWw6OlBhcmNlbCkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKLSAgICBsZXQgdGhpcyA9IGlmIGxldCBTb21lKHRoaXMpID0gdGhpcyB7Ci0gICAgICBwYXJjZWwud3JpdGUoJjFpMzIpPzsKLSAgICAgIHRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHBhcmNlbC53cml0ZSgmMGkzMik7Ci0gICAgfTsKLSAgICBtYXRjaCB0aGlzIHsKK2ltcGwgYmluZGVyOjpQYXJjZWxhYmxlIGZvciBVbmlvbkluVW5pb24geworICBmbiB3cml0ZV90b19wYXJjZWwoJnNlbGYsIHBhcmNlbDogJm11dCBiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CisgICAgbWF0Y2ggc2VsZiB7CiAgICAgICBTZWxmOjpGaXJzdCh2KSA9PiB7CiAgICAgICAgIHBhcmNlbC53cml0ZSgmMGkzMik/OwogICAgICAgICBwYXJjZWwud3JpdGUodikKQEAgLTM0LDI4ICsyMywxOCBAQAogICAgICAgfQogICAgIH0KICAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemUgZm9yIFVuaW9uSW5VbmlvbiB7Ci0gIGZuIGRlc2VyaWFsaXplKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PFNlbGY+IHsKLSAgICA8U2VsZiBhcyBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVPcHRpb24+OjpkZXNlcmlhbGl6ZV9vcHRpb24ocGFyY2VsKQotICAgICAgIC50cmFuc3Bvc2UoKQotICAgICAgIC51bndyYXBfb3IoRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6VU5FWFBFQ1RFRF9OVUxMKSkKLSAgfQotfQotaW1wbCBiaW5kZXI6OnBhcmNlbDo6RGVzZXJpYWxpemVBcnJheSBmb3IgVW5pb25JblVuaW9uIHt9Ci1pbXBsIGJpbmRlcjo6cGFyY2VsOjpEZXNlcmlhbGl6ZU9wdGlvbiBmb3IgVW5pb25JblVuaW9uIHsKLSAgZm4gZGVzZXJpYWxpemVfb3B0aW9uKHBhcmNlbDogJmJpbmRlcjo6cGFyY2VsOjpQYXJjZWwpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTZWxmPj4gewotICAgIGxldCBzdGF0dXM6IGkzMiA9IHBhcmNlbC5yZWFkKCk/OwotICAgIGlmIHN0YXR1cyA9PSAwIHsgcmV0dXJuIE9rKE5vbmUpOyB9CisgIGZuIHJlYWRfZnJvbV9wYXJjZWwoJm11dCBzZWxmLCBwYXJjZWw6ICZiaW5kZXI6OmJpbmRlcl9pbXBsOjpCb3Jyb3dlZFBhcmNlbCkgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDwoKSwgYmluZGVyOjpTdGF0dXNDb2RlPiB7CiAgICAgbGV0IHRhZzogaTMyID0gcGFyY2VsLnJlYWQoKT87CiAgICAgbWF0Y2ggdGFnIHsKICAgICAgIDAgPT4gewogICAgICAgICBsZXQgdmFsdWU6IGNyYXRlOjptYW5nbGVkOjpfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzlfRW51bVVuaW9uID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6Rmlyc3QodmFsdWUpKSkKKyAgICAgICAgKnNlbGYgPSBTZWxmOjpGaXJzdCh2YWx1ZSk7CisgICAgICAgIE9rKCgpKQogICAgICAgfQogICAgICAgMSA9PiB7CiAgICAgICAgIGxldCB2YWx1ZTogaTMyID0gcGFyY2VsLnJlYWQoKT87Ci0gICAgICAgIE9rKFNvbWUoU2VsZjo6U2Vjb25kKHZhbHVlKSkpCisgICAgICAgICpzZWxmID0gU2VsZjo6U2Vjb25kKHZhbHVlKTsKKyAgICAgICAgT2soKCkpCiAgICAgICB9CiAgICAgICBfID0+IHsKICAgICAgICAgRXJyKGJpbmRlcjo6U3RhdHVzQ29kZTo6QkFEX1ZBTFVFKQpAQCAtNjMsMyArNDIsMTEgQEAKICAgICB9CiAgIH0KIH0KK2JpbmRlcjo6aW1wbF9zZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uSW5Vbmlvbik7CitiaW5kZXI6OmltcGxfZGVzZXJpYWxpemVfZm9yX3BhcmNlbGFibGUhKFVuaW9uSW5Vbmlvbik7CitpbXBsIGJpbmRlcjo6YmluZGVyX2ltcGw6OlBhcmNlbGFibGVNZXRhZGF0YSBmb3IgVW5pb25JblVuaW9uIHsKKyAgZm4gZ2V0X2Rlc2NyaXB0b3IoKSAtPiAmJ3N0YXRpYyBzdHIgeyAiYW5kcm9pZC5haWRsLnRlc3RzLnVuaW9ucy5VbmlvbkluVW5pb24iIH0KK30KK3B1YihjcmF0ZSkgbW9kIG1hbmdsZWQgeworIHB1YiB1c2Ugc3VwZXI6OlVuaW9uSW5VbmlvbiBhcyBfN19hbmRyb2lkXzRfYWlkbF81X3Rlc3RzXzZfdW5pb25zXzEyX1VuaW9uSW5VbmlvbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24ucnMuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1ydXN0LXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9VbmlvbkluVW5pb24ucnMuZAppbmRleCBmNWI1MzY2Li4yMzc2Y2Y1IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLnJzLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtaW50ZXJmYWNlLXJ1c3Qtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5ycy5kCkBAIC0xLDMgKzEsNSBAQAogb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC90ZXN0cy91bmlvbnMvVW5pb25JblVuaW9uLnJzIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL1VuaW9uSW5Vbmlvbi5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL3VuaW9ucy9FbnVtVW5pb24uYWlkbAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvdGVzdHMvdW5pb25zL0VudW1Vbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL3Rlc3RzL0ludEVudW0uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC90ZXN0cy9Mb25nRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NWM0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0czsKK3B1YmxpYyBmaW5hbCBjbGFzcyBCYXpVbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CisgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcworICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBpbnROdW0gPSAwOyAgLy8gaW50IGludE51bTsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbG9uZ051bSA9IDE7ICAvLyBsb25nIGxvbmdOdW07CisKKyAgcHJpdmF0ZSBpbnQgX3RhZzsKKyAgcHJpdmF0ZSBPYmplY3QgX3ZhbHVlOworCisgIHB1YmxpYyBCYXpVbmlvbigpIHsKKyAgICBpbnQgX3ZhbHVlID0gMDsKKyAgICB0aGlzLl90YWcgPSBpbnROdW07CisgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CisgIH0KKworICBwcml2YXRlIEJhelVuaW9uKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3BhcmNlbCkgeworICAgIHJlYWRGcm9tUGFyY2VsKF9haWRsX3BhcmNlbCk7CisgIH0KKworICBwcml2YXRlIEJhelVuaW9uKGludCBfdGFnLCBPYmplY3QgX3ZhbHVlKSB7CisgICAgdGhpcy5fdGFnID0gX3RhZzsKKyAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VGFnKCkgeworICAgIHJldHVybiBfdGFnOworICB9CisKKyAgLy8gaW50IGludE51bTsKKworICBwdWJsaWMgc3RhdGljIEJhelVuaW9uIGludE51bShpbnQgX3ZhbHVlKSB7CisgICAgcmV0dXJuIG5ldyBCYXpVbmlvbihpbnROdW0sIF92YWx1ZSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldEludE51bSgpIHsKKyAgICBfYXNzZXJ0VGFnKGludE51bSk7CisgICAgcmV0dXJuIChpbnQpIF92YWx1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEludE51bShpbnQgX3ZhbHVlKSB7CisgICAgX3NldChpbnROdW0sIF92YWx1ZSk7CisgIH0KKworICAvLyBsb25nIGxvbmdOdW07CisKKyAgcHVibGljIHN0YXRpYyBCYXpVbmlvbiBsb25nTnVtKGxvbmcgX3ZhbHVlKSB7CisgICAgcmV0dXJuIG5ldyBCYXpVbmlvbihsb25nTnVtLCBfdmFsdWUpOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0TG9uZ051bSgpIHsKKyAgICBfYXNzZXJ0VGFnKGxvbmdOdW0pOworICAgIHJldHVybiAobG9uZykgX3ZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TG9uZ051bShsb25nIF92YWx1ZSkgeworICAgIF9zZXQobG9uZ051bSwgX3ZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8QmF6VW5pb24+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8QmF6VW5pb24+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXpVbmlvbiBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIF9haWRsX3NvdXJjZSkgeworICAgICAgcmV0dXJuIG5ldyBCYXpVbmlvbihfYWlkbF9zb3VyY2UpOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmF6VW5pb25bXSBuZXdBcnJheShpbnQgX2FpZGxfc2l6ZSkgeworICAgICAgcmV0dXJuIG5ldyBCYXpVbmlvbltfYWlkbF9zaXplXTsKKyAgICB9CisgIH07CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykgeworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChfdGFnKTsKKyAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICBjYXNlIGludE51bToKKyAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludChnZXRJbnROdW0oKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxvbmdOdW06CisgICAgICBfYWlkbF9wYXJjZWwud3JpdGVMb25nKGdldExvbmdOdW0oKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpIHsKKyAgICBpbnQgX2FpZGxfdGFnOworICAgIF9haWRsX3RhZyA9IF9haWRsX3BhcmNlbC5yZWFkSW50KCk7CisgICAgc3dpdGNoIChfYWlkbF90YWcpIHsKKyAgICBjYXNlIGludE51bTogeworICAgICAgaW50IF9haWRsX3ZhbHVlOworICAgICAgX2FpZGxfdmFsdWUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgICAgX3NldChfYWlkbF90YWcsIF9haWRsX3ZhbHVlKTsKKyAgICAgIHJldHVybjsgfQorICAgIGNhc2UgbG9uZ051bTogeworICAgICAgbG9uZyBfYWlkbF92YWx1ZTsKKyAgICAgIF9haWRsX3ZhbHVlID0gX2FpZGxfcGFyY2VsLnJlYWRMb25nKCk7CisgICAgICBfc2V0KF9haWRsX3RhZywgX2FpZGxfdmFsdWUpOworICAgICAgcmV0dXJuOyB9CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuaW9uOiB1bmtub3duIHRhZzogIiArIF9haWRsX3RhZyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgc3dpdGNoIChnZXRUYWcoKSkgeworICAgIH0KKyAgICByZXR1cm4gX21hc2s7CisgIH0KKworICBwcml2YXRlIHZvaWQgX2Fzc2VydFRhZyhpbnQgdGFnKSB7CisgICAgaWYgKGdldFRhZygpICE9IHRhZykgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYmFkIGFjY2VzczogIiArIF90YWdTdHJpbmcodGFnKSArICIsICIgKyBfdGFnU3RyaW5nKGdldFRhZygpKSArICIgaXMgYXZhaWxhYmxlLiIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIF90YWdTdHJpbmcoaW50IF90YWcpIHsKKyAgICBzd2l0Y2ggKF90YWcpIHsKKyAgICBjYXNlIGludE51bTogcmV0dXJuICJpbnROdW0iOworICAgIGNhc2UgbG9uZ051bTogcmV0dXJuICJsb25nTnVtIjsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBmaWVsZDogIiArIF90YWcpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIF9zZXQoaW50IF90YWcsIE9iamVjdCBfdmFsdWUpIHsKKyAgICB0aGlzLl90YWcgPSBfdGFnOworICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uamF2YS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDdiNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmphdmEuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9CYXpVbmlvbi5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8yL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvQmF6VW5pb24uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4YzJmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0czsKK3B1YmxpYyBjbGFzcyBGb28gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKK3sKKyAgcHVibGljIGludCBpbnREZWZhdWx0NDIgPSA0MjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxGb28+IENSRUFUT1IgPSBuZXcgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8Rm9vPigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRm9vIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfc291cmNlKSB7CisgICAgICBGb28gX2FpZGxfb3V0ID0gbmV3IEZvbygpOworICAgICAgX2FpZGxfb3V0LnJlYWRGcm9tUGFyY2VsKF9haWRsX3NvdXJjZSk7CisgICAgICByZXR1cm4gX2FpZGxfb3V0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRm9vW10gbmV3QXJyYXkoaW50IF9haWRsX3NpemUpIHsKKyAgICAgIHJldHVybiBuZXcgRm9vW19haWRsX3NpemVdOworICAgIH0KKyAgfTsKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgX2FpZGxfcGFyY2VsLCBpbnQgX2FpZGxfZmxhZykKKyAgeworICAgIGludCBfYWlkbF9zdGFydF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CisgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDApOworICAgIF9haWRsX3BhcmNlbC53cml0ZUludChpbnREZWZhdWx0NDIpOworICAgIGludCBfYWlkbF9lbmRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIF9haWRsX3BhcmNlbC5zZXREYXRhUG9zaXRpb24oX2FpZGxfc3RhcnRfcG9zKTsKKyAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQoX2FpZGxfZW5kX3BvcyAtIF9haWRsX3N0YXJ0X3Bvcyk7CisgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9lbmRfcG9zKTsKKyAgfQorICBwdWJsaWMgZmluYWwgdm9pZCByZWFkRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBfYWlkbF9wYXJjZWwpCisgIHsKKyAgICBpbnQgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpOworICAgIGludCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOworICAgIHRyeSB7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiUGFyY2VsYWJsZSB0b28gc21hbGwiKTs7CisgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOworICAgICAgaW50RGVmYXVsdDQyID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IChJbnRlZ2VyLk1BWF9WQUxVRSAtIF9haWRsX3BhcmNlbGFibGVfc2l6ZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbigiT3ZlcmZsb3cgaW4gdGhlIHNpemUgb2YgcGFyY2VsYWJsZSIpOworICAgICAgfQorICAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICAgIH0KKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgIGludCBfbWFzayA9IDA7CisgICAgcmV0dXJuIF9tYXNrOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkYjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmphdmEuZApAQCAtMCwwICsxLDIgQEAKK291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uamF2YSA6IFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjU3NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gIERPIE5PVCBNT0RJRlkuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0czsKK3B1YmxpYyBpbnRlcmZhY2UgSUZvb0ludGVyZmFjZSBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQoreworICAvKioKKyAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBpbnRlcmZhY2UgdGhhdCB0aGUgY2FsbGVyIGlzIGJ1aWx0IGFnYWluc3QuCisgICAqIFRoaXMgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gd2hhdCB7QGxpbmsgI2dldEludGVyZmFjZVZlcnNpb24oKQorICAgKiBnZXRJbnRlcmZhY2VWZXJzaW9ufSByZXR1cm5zIGFzIHRoYXQgaXMgdGhlIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZQorICAgKiB0aGF0IHRoZSByZW1vdGUgb2JqZWN0IGlzIGltcGxlbWVudGluZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT04gPSAyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNIID0gImRhOGM0YmM5NGNhN2ZlZmYwZTBhNjU1NjNhNDY2Nzg3Njk4YjU4OTEiOworICAvKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUZvb0ludGVyZmFjZS4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlCisgIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb3JpZ2luYWxBcGkoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZyhhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkJhelVuaW9uIHUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbkZvbywgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gaW5vdXRGb28sIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIG91dEZvbywgaW50IHZhbHVlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb29bXSBmb29zKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG5ld0FwaSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRJbnRlcmZhY2VWZXJzaW9uKCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlSGFzaCgpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorICAvKiogTG9jYWwtc2lkZSBJUEMgaW1wbGVtZW50YXRpb24gc3R1YiBjbGFzcy4gKi8KKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2UKKyAgeworICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHN0dWIgYXQgYXR0YWNoIGl0IHRvIHRoZSBpbnRlcmZhY2UuICovCisgICAgcHVibGljIFN0dWIoKQorICAgIHsKKyAgICAgIHRoaXMuYXR0YWNoSW50ZXJmYWNlKHRoaXMsIERFU0NSSVBUT1IpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBDYXN0IGFuIElCaW5kZXIgb2JqZWN0IGludG8gYW4gYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlIGludGVyZmFjZSwKKyAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlIGFzSW50ZXJmYWNlKGFuZHJvaWQub3MuSUJpbmRlciBvYmopCisgICAgeworICAgICAgaWYgKChvYmo9PW51bGwpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgYW5kcm9pZC5vcy5JSW50ZXJmYWNlIGlpbiA9IG9iai5xdWVyeUxvY2FsSW50ZXJmYWNlKERFU0NSSVBUT1IpOworICAgICAgaWYgKCgoaWluIT1udWxsKSYmKGlpbiBpbnN0YW5jZW9mIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZSkpKSB7CisgICAgICAgIHJldHVybiAoKGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuSUZvb0ludGVyZmFjZSlpaW4pOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLklGb29JbnRlcmZhY2UuU3R1Yi5Qcm94eShvYmopOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldEludGVyZmFjZVZlcnNpb246CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVJbnQoZ2V0SW50ZXJmYWNlVmVyc2lvbigpKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldEludGVyZmFjZUhhc2g6CisgICAgICAgIHsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoZ2V0SW50ZXJmYWNlSGFzaCgpKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX29yaWdpbmFsQXBpOgorICAgICAgICB7CisgICAgICAgICAgdGhpcy5vcmlnaW5hbEFwaSgpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2FjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nOgorICAgICAgICB7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbiBfYXJnMDsKKyAgICAgICAgICBfYXJnMCA9IGRhdGEucmVhZFR5cGVkT2JqZWN0KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb24uQ1JFQVRPUik7CisgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIF9yZXN1bHQgPSB0aGlzLmFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nKF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmcoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludDoKKyAgICAgICAgeworICAgICAgICAgIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28uQ1JFQVRPUik7CisgICAgICAgICAgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gX2FyZzE7CisgICAgICAgICAgX2FyZzEgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvby5DUkVBVE9SKTsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBfYXJnMjsKKyAgICAgICAgICBfYXJnMiA9IG5ldyBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbygpOworICAgICAgICAgIGludCBfYXJnMzsKKyAgICAgICAgICBfYXJnMyA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgaW50IF9yZXN1bHQgPSB0aGlzLmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KF9hcmcwLCBfYXJnMSwgX2FyZzIsIF9hcmczKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVJbnQoX3Jlc3VsdCk7CisgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZE9iamVjdChfYXJnMSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICByZXBseS53cml0ZVR5cGVkT2JqZWN0KF9hcmcyLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXk6CisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvb1tdIF9hcmcwOworICAgICAgICAgIF9hcmcwID0gZGF0YS5jcmVhdGVUeXBlZEFycmF5KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vLkNSRUFUT1IpOworICAgICAgICAgIGRhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7CisgICAgICAgICAgaW50IF9yZXN1bHQgPSB0aGlzLnJldHVybnNMZW5ndGhPZkZvb0FycmF5KF9hcmcwKTsKKyAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgcmVwbHkud3JpdGVJbnQoX3Jlc3VsdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9uZXdBcGk6CisgICAgICAgIHsKKyAgICAgICAgICB0aGlzLm5ld0FwaSgpOworICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlCisgICAgeworICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgIFByb3h5KGFuZHJvaWQub3MuSUJpbmRlciByZW1vdGUpCisgICAgICB7CisgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICB9CisgICAgICBwcml2YXRlIGludCBtQ2FjaGVkVmVyc2lvbiA9IC0xOworICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNhY2hlZEhhc2ggPSAiLTEiOworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgeworICAgICAgICByZXR1cm4gbVJlbW90ZTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQorICAgICAgeworICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvcmlnaW5hbEFwaSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfcmVwbHkgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9vcmlnaW5hbEFwaSwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24oIk1ldGhvZCBvcmlnaW5hbEFwaSBpcyB1bmltcGxlbWVudGVkLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbiB1KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRPYmplY3QodSwgMCk7CisgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX2FjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbigiTWV0aG9kIGFjY2VwdFVuaW9uQW5kUmV0dXJuU3RyaW5nIGlzIHVuaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgfQorICAgICAgICAgIF9yZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgX3Jlc3VsdCA9IF9yZXBseS5yZWFkU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgX3JlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBpbkZvbywgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gaW5vdXRGb28sIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIG91dEZvbywgaW50IHZhbHVlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGludCBfcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChpbkZvbywgMCk7CisgICAgICAgICAgX2RhdGEud3JpdGVUeXBlZE9iamVjdChpbm91dEZvbywgMCk7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnQodmFsdWUpOworICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCwgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgaWYgKCFfc3RhdHVzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24oIk1ldGhvZCBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCBpcyB1bmltcGxlbWVudGVkLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkucmVhZEludCgpOworICAgICAgICAgIGlmICgoMCE9X3JlcGx5LnJlYWRJbnQoKSkpIHsKKyAgICAgICAgICAgIGlub3V0Rm9vLnJlYWRGcm9tUGFyY2VsKF9yZXBseSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoMCE9X3JlcGx5LnJlYWRJbnQoKSkpIHsKKyAgICAgICAgICAgIG91dEZvby5yZWFkRnJvbVBhcmNlbChfcmVwbHkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gZm9vcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9kYXRhID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICBpbnQgX3Jlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgIF9kYXRhLndyaXRlVHlwZWRBcnJheShmb29zLCAwKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXksIF9kYXRhLCBfcmVwbHksIDApOworICAgICAgICAgIGlmICghX3N0YXR1cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uKCJNZXRob2QgcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkgaXMgdW5pbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX3JlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgICBfcmVzdWx0ID0gX3JlcGx5LnJlYWRJbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICBfcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgIF9kYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBuZXdBcGkoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKyAgICAgIHsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX2RhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgX3JlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX2RhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fbmV3QXBpLCBfZGF0YSwgX3JlcGx5LCAwKTsKKyAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbigiTWV0aG9kIG5ld0FwaSBpcyB1bmltcGxlbWVudGVkLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgX2RhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgZ2V0SW50ZXJmYWNlVmVyc2lvbigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQ2FjaGVkVmVyc2lvbiA9PSAtMSkgeworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIGRhdGEgPSBhbmRyb2lkLm9zLlBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7CisgICAgICAgICAgICBib29sZWFuIF9zdGF0dXMgPSBtUmVtb3RlLnRyYW5zYWN0KFN0dWIuVFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlVmVyc2lvbiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgbUNhY2hlZFZlcnNpb24gPSByZXBseS5yZWFkSW50KCk7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNhY2hlZFZlcnNpb247CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEludGVyZmFjZUhhc2goKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIi0xIi5lcXVhbHMobUNhY2hlZEhhc2gpKSB7CisgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIHJlcGx5ID0gYW5kcm9pZC5vcy5QYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihERVNDUklQVE9SKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9nZXRJbnRlcmZhY2VIYXNoLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBtQ2FjaGVkSGFzaCA9IHJlcGx5LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ2FjaGVkSGFzaDsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vcmlnaW5hbEFwaSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDApOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50ID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMik7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZXR1cm5zTGVuZ3RoT2ZGb29BcnJheSA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDMpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbmV3QXBpID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNCk7CisgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRJbnRlcmZhY2VWZXJzaW9uID0gKGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTY3NzcyMTQpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0SW50ZXJmYWNlSGFzaCA9IChhbmRyb2lkLm9zLklCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE2Nzc3MjEzKTsKKyAgfQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkdmVyc2lvbmVkJHRlc3RzJElGb29JbnRlcmZhY2UiLnJlcGxhY2UoJyQnLCAnLicpOworICBwdWJsaWMgdm9pZCBvcmlnaW5hbEFwaSgpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXB0VW5pb25BbmRSZXR1cm5TdHJpbmcoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5CYXpVbmlvbiB1KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBpbnQgaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb28gaW5Gb28sIGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vIGlub3V0Rm9vLCBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzLkZvbyBvdXRGb28sIGludCB2YWx1ZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgaW50IHJldHVybnNMZW5ndGhPZkZvb0FycmF5KGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuRm9vW10gZm9vcykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworICBwdWJsaWMgdm9pZCBuZXdBcGkoKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBpbnQgZ2V0SW50ZXJmYWNlVmVyc2lvbigpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKKyAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VIYXNoKCkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmphdmEuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkZDU0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhLmQKQEAgLTAsMCArMSw0IEBACitvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UtVjItamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5qYXZhIDogXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8yL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF9hcGkvYWlkbC10ZXN0LXZlcnNpb25lZC1pbnRlcmZhY2UvMi9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0JhelVuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC9haWRsX2FwaS9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS8yL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvRm9vLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbC10ZXN0LWludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi90aW1lc3RhbXAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlL2dlbi90aW1lc3RhbXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGwtdGVzdC1pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCmNvcHkgdG8gdGVzdHMvZ29sZGVuX291dHB1dC9haWRsLXRlc3QtdmVyc2lvbmVkLWludGVyZmFjZS1WMi1qYXZhLXNvdXJjZS9nZW4vdGltZXN0YW1wCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcAppbmRleCBiMzhkYWU0Li41OTEwZWRlIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAKQEAgLTEsMTcgKzEsMTggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLQogOjphbmRyb2lkOjpzdGF0dXNfdCBEYXRhOjpyZWFkRnJvbVBhcmNlbChjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCogX2FpZGxfcGFyY2VsKSB7CiAgIDo6YW5kcm9pZDo6c3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6T0s7Ci0gIFtbbWF5YmVfdW51c2VkXV0gc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9yYXdfc2l6ZSA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCk7Ci0gIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgMCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOwotICBbW21heWJlX3VudXNlZF1dIHNpemVfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9haWRsX3BhcmNlbGFibGVfcmF3X3NpemUpOworICBzaXplX3QgX2FpZGxfc3RhcnRfcG9zID0gX2FpZGxfcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplID0gMDsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3BhcmNlbC0+cmVhZEludDMyKCZfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOworICB9CisgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplIDwgNCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICBzaXplX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfYWlkbF9wYXJjZWxhYmxlX3Jhd19zaXplKTsKICAgaWYgKF9haWRsX3N0YXJ0X3BvcyA+IFNJWkVfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CiAgIGlmIChfYWlkbF9wYXJjZWwtPmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewogICAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CkBAIC00OCw3ICs0OSw2IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogfQotCiA6OmFuZHJvaWQ6OnN0YXR1c190IERhdGE6OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOwogICBhdXRvIF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CkBAIC03NSw5ICs3NSw2IEBACiAgIF9haWRsX3BhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKF9haWRsX2VuZF9wb3MpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KLQogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAKaW5kZXggOTMxZDliMS4uNjc2ZDc4YSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcApAQCAtMSwxOCArMSwxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLQogRE9fTk9UX0RJUkVDVExZX1VTRV9NRV9JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTG9nZ2FibGVJbnRlcmZhY2UsICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlIikKLQogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oPgpAQCAtMjIsOSArMTUsNyBAQAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewogCiBCcExvZ2dhYmxlSW50ZXJmYWNlOjpCcExvZ2dhYmxlSW50ZXJmYWNlKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCkKQEAgLTI0Niw5ICsyMzcsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KQEAgLTI1Nyw5ICsyNDYsNyBAQAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewogCiBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpCbkxvZ2dhYmxlSW50ZXJmYWNlKCkKQEAgLTQwOCw2ICszOTUsMTAgQEAKICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fcGZkQXJyYXkpKTsKICAgICB9CiAgICAgYXV0byBfbG9nX3N0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgaWYgKGF1dG8gc3QgPSBfYWlkbF9kYXRhLmVuZm9yY2VOb0RhdGFBdmFpbCgpOyAhc3QuaXNPaygpKSB7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gc3Qud3JpdGVUb1BhcmNlbChfYWlkbF9yZXBseSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBfYWlkbF9zdGF0dXMoTG9nVGhpcyhpbl9ib29sVmFsdWUsICZpbl9ib29sQXJyYXksIGluX2J5dGVWYWx1ZSwgJmluX2J5dGVBcnJheSwgaW5fY2hhclZhbHVlLCAmaW5fY2hhckFycmF5LCBpbl9pbnRWYWx1ZSwgJmluX2ludEFycmF5LCBpbl9sb25nVmFsdWUsICZpbl9sb25nQXJyYXksIGluX2Zsb2F0VmFsdWUsICZpbl9mbG9hdEFycmF5LCBpbl9kb3VibGVWYWx1ZSwgJmluX2RvdWJsZUFycmF5LCBpbl9zdHJpbmdWYWx1ZSwgJmluX3N0cmluZ0FycmF5LCAmaW5fbGlzdFZhbHVlLCBpbl9kYXRhVmFsdWUsIGluX2JpbmRlclZhbHVlLCAmaW5fcGZkVmFsdWUsICZpbl9wZmRBcnJheSwgJl9haWRsX3JldHVybikpOwogICAgIGlmIChCbkxvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKICAgICAgIGF1dG8gX2xvZ19lbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKQEAgLTQ5OCwxNSArNDg5LDE3MSBAQAogICBicmVhazsKICAgfQogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgewotICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CiAgIH0KICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpUcmFuc2FjdGlvbkxvZyYpPiBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jOworfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKK0RPX05PVF9ESVJFQ1RMWV9VU0VfTUVfSU1QTEVNRU5UX01FVEFfTkVTVEVEX0lOVEVSRkFDRShJTG9nZ2FibGVJbnRlcmZhY2UsIFN1YiwgImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiIpCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2luY2x1ZGUgPGFuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKKworSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6QnBTdWIoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKQorICAgIDogQnBJbnRlcmZhY2U8SVN1Yj4oX2FpZGxfaW1wbCl7Cit9CisKK3N0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpUcmFuc2FjdGlvbkxvZyYpPiBJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpsb2dGdW5jOworCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OkxvZyhpbnQzMl90IHZhbHVlKSB7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgIF9haWRsX2RhdGEubWFya0ZvckJpbmRlcihyZW1vdGVTdHJvbmcoKSk7CisgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1czsKKyAgOjphbmRyb2lkOjpTY29wZWRUcmFjZSBfYWlkbF90cmFjZShBVFJBQ0VfVEFHX0FJREwsICJBSURMOjpjcHA6OklTdWI6OkxvZzo6Y3BwQ2xpZW50Iik7CisgIElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OlRyYW5zYWN0aW9uTG9nIF90cmFuc2FjdGlvbl9sb2c7CisgIGlmIChJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJ2YWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHZhbHVlKSk7CisgIH0KKyAgYXV0byBfbG9nX3N0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEud3JpdGVJbnQzMih2YWx1ZSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIF9haWRsX3JldF9zdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6VFJBTlNBQ1RJT05fTG9nLCBfYWlkbF9kYXRhLCAmX2FpZGxfcmVwbHksIDApOworICBpZiAoVU5MSUtFTFkoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04gJiYgSVN1Yjo6Z2V0RGVmYXVsdEltcGwoKSkpIHsKKyAgICAgcmV0dXJuIElTdWI6OmdldERlZmF1bHRJbXBsKCktPkxvZyh2YWx1ZSk7CisgIH0KKyAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgIGdvdG8gX2FpZGxfZXJyb3I7CisgIH0KKyAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX3N0YXR1cy5yZWFkRnJvbVBhcmNlbChfYWlkbF9yZXBseSk7CisgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICBnb3RvIF9haWRsX2Vycm9yOworICB9CisgIGlmICghX2FpZGxfc3RhdHVzLmlzT2soKSkgeworICAgIHJldHVybiBfYWlkbF9zdGF0dXM7CisgIH0KKyAgX2FpZGxfZXJyb3I6CisgIF9haWRsX3N0YXR1cy5zZXRGcm9tU3RhdHVzVChfYWlkbF9yZXRfc3RhdHVzKTsKKyAgaWYgKElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgeworICAgIGF1dG8gX2xvZ19lbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLmR1cmF0aW9uX21zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4oX2xvZ19lbmQgLSBfbG9nX3N0YXJ0KS5jb3VudCgpOworICAgIF90cmFuc2FjdGlvbl9sb2cuaW50ZXJmYWNlX25hbWUgPSAiYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViIjsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLm1ldGhvZF9uYW1lID0gIkxvZyI7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5zdHViX2FkZHJlc3MgPSBudWxscHRyOworICAgIF90cmFuc2FjdGlvbl9sb2cucHJveHlfYWRkcmVzcyA9IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0aGlzKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9jb2RlID0gX2FpZGxfc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9tZXNzYWdlID0gX2FpZGxfc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnRyYW5zYWN0aW9uX2Vycm9yID0gX2FpZGxfc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZSA9IF9haWRsX3N0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKTsKKyAgICBJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpsb2dGdW5jKF90cmFuc2FjdGlvbl9sb2cpOworICB9CisgIHJldHVybiBfYWlkbF9zdGF0dXM7Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKKworSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6Qm5TdWIoKQoreworICA6OmFuZHJvaWQ6OmludGVybmFsOjpTdGFiaWxpdHk6Om1hcmtDb21waWxhdGlvblVuaXQodGhpcyk7Cit9CisKKzo6YW5kcm9pZDo6c3RhdHVzX3QgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6b25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgeworICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6Ok9LOworICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKKyAgY2FzZSBCblN1Yjo6VFJBTlNBQ1RJT05fTG9nOgorICB7CisgICAgaW50MzJfdCBpbl92YWx1ZTsKKyAgICBpZiAoIShfYWlkbF9kYXRhLmNoZWNrSW50ZXJmYWNlKHRoaXMpKSkgeworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1RZUEU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgOjphbmRyb2lkOjpTY29wZWRUcmFjZSBfYWlkbF90cmFjZShBVFJBQ0VfVEFHX0FJREwsICJBSURMOjpjcHA6OklTdWI6OkxvZzo6Y3BwU2VydmVyIik7CisgICAgX2FpZGxfcmV0X3N0YXR1cyA9IF9haWRsX2RhdGEucmVhZEludDMyKCZpbl92YWx1ZSk7CisgICAgaWYgKCgoX2FpZGxfcmV0X3N0YXR1cykgIT0gKDo6YW5kcm9pZDo6T0spKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OlRyYW5zYWN0aW9uTG9nIF90cmFuc2FjdGlvbl9sb2c7CisgICAgaWYgKElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgeworICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fdmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl92YWx1ZSkpOworICAgIH0KKyAgICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBpZiAoYXV0byBzdCA9IF9haWRsX2RhdGEuZW5mb3JjZU5vRGF0YUF2YWlsKCk7ICFzdC5pc09rKCkpIHsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBzdC53cml0ZVRvUGFyY2VsKF9haWRsX3JlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIF9haWRsX3N0YXR1cyhMb2coaW5fdmFsdWUpKTsKKyAgICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgICBhdXRvIF9sb2dfZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLmR1cmF0aW9uX21zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4oX2xvZ19lbmQgLSBfbG9nX3N0YXJ0KS5jb3VudCgpOworICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnRlcmZhY2VfbmFtZSA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIiOworICAgICAgX3RyYW5zYWN0aW9uX2xvZy5tZXRob2RfbmFtZSA9ICJMb2ciOworICAgICAgX3RyYW5zYWN0aW9uX2xvZy5zdHViX2FkZHJlc3MgPSBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGhpcyk7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLnByb3h5X2FkZHJlc3MgPSBudWxscHRyOworICAgICAgX3RyYW5zYWN0aW9uX2xvZy5leGNlcHRpb25fY29kZSA9IF9haWRsX3N0YXR1cy5leGNlcHRpb25Db2RlKCk7CisgICAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9tZXNzYWdlID0gX2FpZGxfc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKTsKKyAgICAgIF90cmFuc2FjdGlvbl9sb2cudHJhbnNhY3Rpb25fZXJyb3IgPSBfYWlkbF9zdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgX3RyYW5zYWN0aW9uX2xvZy5zZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGUgPSBfYWlkbF9zdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCk7CisgICAgICBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpsb2dGdW5jKF90cmFuc2FjdGlvbl9sb2cpOworICAgIH0KKyAgICBfYWlkbF9yZXRfc3RhdHVzID0gX2FpZGxfc3RhdHVzLndyaXRlVG9QYXJjZWwoX2FpZGxfcmVwbHkpOworICAgIGlmICgoKF9haWRsX3JldF9zdGF0dXMpICE9ICg6OmFuZHJvaWQ6Ok9LKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIV9haWRsX3N0YXR1cy5pc09rKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBicmVhazsKKyAgZGVmYXVsdDoKKyAgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OkJCaW5kZXI6Om9uVHJhbnNhY3QoX2FpZGxfY29kZSwgX2FpZGxfZGF0YSwgX2FpZGxfcmVwbHksIF9haWRsX2ZsYWdzKTsKKyAgfQorICBicmVhazsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyA9PSA6OmFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCkgeworICAgIF9haWRsX3JldF9zdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSg6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpFWF9OVUxMX1BPSU5URVIpLndyaXRlT3ZlclBhcmNlbChfYWlkbF9yZXBseSk7CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpUcmFuc2FjdGlvbkxvZyYpPiBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpsb2dGdW5jOworfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwLmQKaW5kZXggNGY3YTI1Zi4uYWM3OWFlOCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwLmQKQEAgLTEsMyArMSw1IEBACiBvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcCA6IFwKICAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuYWlkbAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwCmluZGV4IDRlYzA2ODMuLjA5MjY5MmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwCkBAIC0xLDExICsxLDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgYWlkbCB7Ci0KIG5hbWVzcGFjZSBsb2dnYWJsZSB7Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgVW5pb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKICAgOjphbmRyb2lkOjpzdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwogICBpbnQzMl90IF9haWRsX3RhZzsKQEAgLTM0LDcgKzMxLDYgQEAKICAgfQogICByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CiB9Ci0KIDo6YW5kcm9pZDo6c3RhdHVzX3QgVW5pb246OndyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICA6OmFuZHJvaWQ6OnN0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBfYWlkbF9wYXJjZWwtPndyaXRlSW50MzIoZ2V0VGFnKCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKQEAgLTQ0LDkgKzQwLDYgQEAKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oCmluZGV4IDRlNmNhOGMuLjQ3NTA2OGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaApAQCAtNiwxMSArNiw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBjbGFzcyBCbkxvZ2dhYmxlSW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6Qm5JbnRlcmZhY2U8SUxvZ2dhYmxlSW50ZXJmYWNlPiB7CiBwdWJsaWM6CiAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fTG9nVGhpcyA9IDo6YW5kcm9pZDo6SUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CkBAIC0zMyw4ICszMCwxNiBAQAogICBzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7CiB9OyAgLy8gY2xhc3MgQm5Mb2dnYWJsZUludGVyZmFjZQogCitjbGFzcyBJTG9nZ2FibGVJbnRlcmZhY2VEZWxlZ2F0b3IgOiBwdWJsaWMgQm5Mb2dnYWJsZUludGVyZmFjZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElMb2dnYWJsZUludGVyZmFjZURlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElMb2dnYWJsZUludGVyZmFjZT4gJmltcGwpIDogX2FpZGxfZGVsZWdhdGUoaW1wbCkge30KKworICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIExvZ1RoaXMoYm9vbCBib29sVmFsdWUsIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qIGJvb2xBcnJheSwgaW50OF90IGJ5dGVWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiogYnl0ZUFycmF5LCBjaGFyMTZfdCBjaGFyVmFsdWUsIDo6c3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiBjaGFyQXJyYXksIGludDMyX3QgaW50VmFsdWUsIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qIGludEFycmF5LCBpbnQ2NF90IGxvbmdWYWx1ZSwgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiogbG9uZ0FycmF5LCBmbG9hdCBmbG9hdFZhbHVlLCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiogZmxvYXRBcnJheSwgZG91YmxlIGRvdWJsZVZhbHVlLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIGRvdWJsZUFycmF5LCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBzdHJpbmdWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2Piogc3RyaW5nQXJyYXksIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIGxpc3RWYWx1ZSwgY29uc3QgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgZGF0YVZhbHVlLCBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SUJpbmRlcj4mIGJpbmRlclZhbHVlLCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiBwZmRWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qIHBmZEFycmF5LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkxvZ1RoaXMoYm9vbFZhbHVlLCBib29sQXJyYXksIGJ5dGVWYWx1ZSwgYnl0ZUFycmF5LCBjaGFyVmFsdWUsIGNoYXJBcnJheSwgaW50VmFsdWUsIGludEFycmF5LCBsb25nVmFsdWUsIGxvbmdBcnJheSwgZmxvYXRWYWx1ZSwgZmxvYXRBcnJheSwgZG91YmxlVmFsdWUsIGRvdWJsZUFycmF5LCBzdHJpbmdWYWx1ZSwgc3RyaW5nQXJyYXksIGxpc3RWYWx1ZSwgZGF0YVZhbHVlLCBiaW5kZXJWYWx1ZSwgcGZkVmFsdWUsIHBmZEFycmF5LCBfYWlkbF9yZXR1cm4pOworICB9Citwcml2YXRlOgorICA6OmFuZHJvaWQ6OnNwPElMb2dnYWJsZUludGVyZmFjZT4gX2FpZGxfZGVsZWdhdGU7Cit9OyAgLy8gY2xhc3MgSUxvZ2dhYmxlSW50ZXJmYWNlRGVsZWdhdG9yCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcExvZ2dhYmxlSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBMb2dnYWJsZUludGVyZmFjZS5oCmluZGV4IDczMjE5YjguLmMzOTFkZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcExvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaApAQCAtOCwxMSArOCw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBjbGFzcyBCcExvZ2dhYmxlSW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6QnBJbnRlcmZhY2U8SUxvZ2dhYmxlSW50ZXJmYWNlPiB7CiBwdWJsaWM6CiAgIGV4cGxpY2l0IEJwTG9nZ2FibGVJbnRlcmZhY2UoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBfYWlkbF9pbXBsKTsKQEAgLTM0LDkgKzMxLDYgQEAKICAgfTsKICAgc3RhdGljIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFuc2FjdGlvbkxvZyYpPiBsb2dGdW5jOwogfTsgIC8vIGNsYXNzIEJwTG9nZ2FibGVJbnRlcmZhY2UKLQogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaAppbmRleCA1MDVhNTY1Li42MWI1OTBlIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmgKQEAgLTExLDEzICsxMSwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIGFpZGwgewotCiBuYW1lc3BhY2UgbG9nZ2FibGUgewotCiBjbGFzcyBEYXRhIDogcHVibGljIDo6YW5kcm9pZDo6UGFyY2VsYWJsZSB7CiBwdWJsaWM6CisgIGludDMyX3QgbnVtID0gMDsKKyAgOjpzdGQ6OnN0cmluZyBzdHI7CisgIDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OlVuaW9uIG5lc3RlZFVuaW9uOworICA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtIG5lc3RlZEVudW0gPSA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtOjpGT087CiAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRGF0YSYgcmhzKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0ZDo6dGllKG51bSwgc3RyLCBuZXN0ZWRVbmlvbiwgbmVzdGVkRW51bSkgIT0gc3RkOjp0aWUocmhzLm51bSwgcmhzLnN0ciwgcmhzLm5lc3RlZFVuaW9uLCByaHMubmVzdGVkRW51bSk7CiAgIH0KQEAgLTM3LDEwICszOCw2IEBACiAgICAgcmV0dXJuIHN0ZDo6dGllKG51bSwgc3RyLCBuZXN0ZWRVbmlvbiwgbmVzdGVkRW51bSkgPj0gc3RkOjp0aWUocmhzLm51bSwgcmhzLnN0ciwgcmhzLm5lc3RlZFVuaW9uLCByaHMubmVzdGVkRW51bSk7CiAgIH0KIAotICBpbnQzMl90IG51bSA9IGludDMyX3QoMCk7Ci0gIDo6c3RkOjpzdHJpbmcgc3RyOwotICA6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpVbmlvbiBuZXN0ZWRVbmlvbjsKLSAgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bSBuZXN0ZWRFbnVtID0gOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bSg6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtOjpGT08pOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTU4LDkgKzU1LDYgQEAKICAgICByZXR1cm4gb3Muc3RyKCk7CiAgIH0KIH07ICAvLyBjbGFzcyBEYXRhCi0KIH0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmgKaW5kZXggN2I1OTgyYi4uYzE2OTY2MSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oCkBAIC02LDE1ICs2LDE3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLQogZW51bSBjbGFzcyBFbnVtIDogaW50OF90IHsKICAgRk9PID0gNDIsCiB9OwotCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKK30gIC8vIG5hbWVzcGFjZSBhaWRsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgRW51bTo6Rk9POgpAQCAtMjMsMTYgKzI1LDExIEBACiAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludDhfdD4odmFsKSk7CiAgIH0KIH0KLQogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCiAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxNy1leHRlbnNpb25zIgogdGVtcGxhdGUgPD4KQEAgLTQwLDcgKzM3LDUgQEAKICAgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RW51bTo6Rk9PLAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKaW5kZXggYzUzMmUzZC4uMmMyY2ZiOSAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWNwcC1zb3VyY2UvZ2VuL2luY2x1ZGUvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaApAQCAtMSwxMSArMSwxMyBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxhbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsRmlsZURlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CiAjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpAQCAtMTMsMTQgKzE1LDc5IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLQogY2xhc3MgSUxvZ2dhYmxlSW50ZXJmYWNlIDogcHVibGljIDo6YW5kcm9pZDo6SUludGVyZmFjZSB7CiBwdWJsaWM6CiAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTG9nZ2FibGVJbnRlcmZhY2UpCisgIGNsYXNzIElTdWIgOiBwdWJsaWMgOjphbmRyb2lkOjpJSW50ZXJmYWNlIHsKKyAgcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU3ViKQorICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMb2coaW50MzJfdCB2YWx1ZSkgPSAwOworICB9OyAgLy8gY2xhc3MgSVN1YgorCisgIGNsYXNzIElTdWJEZWZhdWx0IDogcHVibGljIElTdWIgeworICBwdWJsaWM6CisgICAgOjphbmRyb2lkOjpJQmluZGVyKiBvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTG9nKGludDMyX3QgLyp2YWx1ZSovKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKKyAgICB9CisgIH07ICAvLyBjbGFzcyBJU3ViRGVmYXVsdAorICBjbGFzcyBCcFN1YiA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJwSW50ZXJmYWNlPElTdWI+IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJwU3ViKGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgX2FpZGxfaW1wbCk7CisgICAgdmlydHVhbCB+QnBTdWIoKSA9IGRlZmF1bHQ7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMb2coaW50MzJfdCB2YWx1ZSkgb3ZlcnJpZGU7CisgICAgc3RydWN0IFRyYW5zYWN0aW9uTG9nIHsKKyAgICAgIGRvdWJsZSBkdXJhdGlvbl9tczsKKyAgICAgIHN0ZDo6c3RyaW5nIGludGVyZmFjZV9uYW1lOworICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWU7CisgICAgICBjb25zdCB2b2lkKiBwcm94eV9hZGRyZXNzOworICAgICAgY29uc3Qgdm9pZCogc3R1Yl9hZGRyZXNzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGlucHV0X2FyZ3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gb3V0cHV0X2FyZ3M7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25fbWVzc2FnZTsKKyAgICAgIGludDMyX3QgZXhjZXB0aW9uX2NvZGU7CisgICAgICBpbnQzMl90IHRyYW5zYWN0aW9uX2Vycm9yOworICAgICAgaW50MzJfdCBzZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGU7CisgICAgfTsKKyAgICBzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7CisgIH07ICAvLyBjbGFzcyBCcFN1YgorICBjbGFzcyBCblN1YiA6IHB1YmxpYyA6OmFuZHJvaWQ6OkJuSW50ZXJmYWNlPElTdWI+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBTlNBQ1RJT05fTG9nID0gOjphbmRyb2lkOjpJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKyAgICBleHBsaWNpdCBCblN1YigpOworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBfYWlkbF9jb2RlLCBjb25zdCA6OmFuZHJvaWQ6OlBhcmNlbCYgX2FpZGxfZGF0YSwgOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3JlcGx5LCB1aW50MzJfdCBfYWlkbF9mbGFncykgb3ZlcnJpZGU7CisgICAgc3RydWN0IFRyYW5zYWN0aW9uTG9nIHsKKyAgICAgIGRvdWJsZSBkdXJhdGlvbl9tczsKKyAgICAgIHN0ZDo6c3RyaW5nIGludGVyZmFjZV9uYW1lOworICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWU7CisgICAgICBjb25zdCB2b2lkKiBwcm94eV9hZGRyZXNzOworICAgICAgY29uc3Qgdm9pZCogc3R1Yl9hZGRyZXNzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGlucHV0X2FyZ3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gb3V0cHV0X2FyZ3M7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25fbWVzc2FnZTsKKyAgICAgIGludDMyX3QgZXhjZXB0aW9uX2NvZGU7CisgICAgICBpbnQzMl90IHRyYW5zYWN0aW9uX2Vycm9yOworICAgICAgaW50MzJfdCBzZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGU7CisgICAgfTsKKyAgICBzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7CisgIH07ICAvLyBjbGFzcyBCblN1YgorCisgIGNsYXNzIElTdWJEZWxlZ2F0b3IgOiBwdWJsaWMgQm5TdWIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSVN1YkRlbGVnYXRvcig6OmFuZHJvaWQ6OnNwPElTdWI+ICZpbXBsKSA6IF9haWRsX2RlbGVnYXRlKGltcGwpIHt9CisKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIExvZyhpbnQzMl90IHZhbHVlKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gX2FpZGxfZGVsZWdhdGUtPkxvZyh2YWx1ZSk7CisgICAgfQorICBwcml2YXRlOgorICAgIDo6YW5kcm9pZDo6c3A8SVN1Yj4gX2FpZGxfZGVsZWdhdGU7CisgIH07ICAvLyBjbGFzcyBJU3ViRGVsZWdhdG9yCiAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMb2dUaGlzKGJvb2wgYm9vbFZhbHVlLCA6OnN0ZDo6dmVjdG9yPGJvb2w+KiBib29sQXJyYXksIGludDhfdCBieXRlVmFsdWUsIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4qIGJ5dGVBcnJheSwgY2hhcjE2X3QgY2hhclZhbHVlLCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiogY2hhckFycmF5LCBpbnQzMl90IGludFZhbHVlLCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KiBpbnRBcnJheSwgaW50NjRfdCBsb25nVmFsdWUsIDo6c3RkOjp2ZWN0b3I8aW50NjRfdD4qIGxvbmdBcnJheSwgZmxvYXQgZmxvYXRWYWx1ZSwgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qIGZsb2F0QXJyYXksIGRvdWJsZSBkb3VibGVWYWx1ZSwgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+KiBkb3VibGVBcnJheSwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgc3RyaW5nVmFsdWUsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIHN0cmluZ0FycmF5LCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiBsaXN0VmFsdWUsIGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEmIGRhdGFWYWx1ZSwgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklCaW5kZXI+JiBiaW5kZXJWYWx1ZSwgOjpzdGQ6Om9wdGlvbmFsPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiogcGZkVmFsdWUsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiBwZmRBcnJheSwgOjpzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzE2PiogX2FpZGxfcmV0dXJuKSA9IDA7CiB9OyAgLy8gY2xhc3MgSUxvZ2dhYmxlSW50ZXJmYWNlCiAKQEAgLTI5LDEzICs5NiwxMCBAQAogICA6OmFuZHJvaWQ6OklCaW5kZXIqIG9uQXNCaW5kZXIoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KLSAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMb2dUaGlzKGJvb2wsIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qLCBpbnQ4X3QsIDo6c3RkOjp2ZWN0b3I8dWludDhfdD4qLCBjaGFyMTZfdCwgOjpzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qLCBpbnQzMl90LCA6OnN0ZDo6dmVjdG9yPGludDMyX3Q+KiwgaW50NjRfdCwgOjpzdGQ6OnZlY3RvcjxpbnQ2NF90PiosIGZsb2F0LCA6OnN0ZDo6dmVjdG9yPGZsb2F0PiosIGRvdWJsZSwgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+KiwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYsIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiwgY29uc3QgOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYsIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYsIDo6c3RkOjpvcHRpb25hbDw6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvcj4qLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yPiosIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qKSBvdmVycmlkZSB7CisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgTG9nVGhpcyhib29sIC8qYm9vbFZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8Ym9vbD4qIC8qYm9vbEFycmF5Ki8sIGludDhfdCAvKmJ5dGVWYWx1ZSovLCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiAvKmJ5dGVBcnJheSovLCBjaGFyMTZfdCAvKmNoYXJWYWx1ZSovLCA6OnN0ZDo6dmVjdG9yPGNoYXIxNl90PiogLypjaGFyQXJyYXkqLywgaW50MzJfdCAvKmludFZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8aW50MzJfdD4qIC8qaW50QXJyYXkqLywgaW50NjRfdCAvKmxvbmdWYWx1ZSovLCA6OnN0ZDo6dmVjdG9yPGludDY0X3Q+KiAvKmxvbmdBcnJheSovLCBmbG9hdCAvKmZsb2F0VmFsdWUqLywgOjpzdGQ6OnZlY3RvcjxmbG9hdD4qIC8qZmxvYXRBcnJheSovLCBkb3VibGUgLypkb3VibGVWYWx1ZSovLCA6OnN0ZDo6dmVjdG9yPGRvdWJsZT4qIC8qZG91YmxlQXJyYXkqLywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgLypzdHJpbmdWYWx1ZSovLCA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nMTY+KiAvKnN0cmluZ0FycmF5Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIC8qbGlzdFZhbHVlKi8sIGNvbnN0IDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEmIC8qZGF0YVZhbHVlKi8sIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJQmluZGVyPiYgLypiaW5kZXJWYWx1ZSovLCA6OnN0ZDo6b3B0aW9uYWw8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiAvKnBmZFZhbHVlKi8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpvczo6UGFyY2VsRmlsZURlc2NyaXB0b3I+KiAvKnBmZEFycmF5Ki8sIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpTdHJpbmcxNj4qIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OKTsKICAgfQogfTsgIC8vIGNsYXNzIElMb2dnYWJsZUludGVyZmFjZURlZmF1bHQKLQogfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi0KIH0gIC8vIG5hbWVzcGFjZSBhaWRsCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZS9nZW4vaW5jbHVkZS9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCmluZGV4IDU4OTFiYTMuLjkxOGYxMTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1jcHAtc291cmNlL2dlbi9pbmNsdWRlL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCkBAIC0xNiwzMiArMTYsMTAgQEAKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBhaWRsIHsKLQogbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLQogY2xhc3MgVW5pb24gOiBwdWJsaWMgOjphbmRyb2lkOjpQYXJjZWxhYmxlIHsKIHB1YmxpYzoKLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSAhPSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBVbmlvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIF92YWx1ZSA8PSByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPiByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPj0gcmhzLl92YWx1ZTsKLSAgfQotCiAgIGVudW0gVGFnIDogaW50MzJfdCB7CiAgICAgbnVtID0gMCwgIC8vIGludCBudW07CiAgICAgc3RyLCAgLy8gU3RyaW5nIHN0cjsKQEAgLTUxLDEwICsyOSw2IEBACiAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb24+OwogCiAgIFVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxudW0+LCBpbnQzMl90KDQzKSkgeyB9Ci0gIFVuaW9uKGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbihVbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oVW5pb24mJikgPSBkZWZhdWx0OwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+CiAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKQEAgLTk2LDYgKzcwLDI1IEBACiAgICAgX3ZhbHVlLmVtcGxhY2U8X3RhZz4oc3RkOjpmb3J3YXJkPF9UcD4oX2FyZ3MpLi4uKTsKICAgfQogCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgVW5pb24mIHJocykgY29uc3QgeworICAgIHJldHVybiBfdmFsdWUgPD0gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlID49IHJocy5fdmFsdWU7CisgIH0KKwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IDo6YW5kcm9pZDo6UGFyY2VsKiBfYWlkbF9wYXJjZWwpIGZpbmFsOwogICA6OmFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoOjphbmRyb2lkOjpQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgZmluYWw7CiAgIHN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBnZXRQYXJjZWxhYmxlRGVzY3JpcHRvcigpIHsKQEAgLTExNSw5ICsxMDgsNiBAQAogcHJpdmF0ZToKICAgc3RkOjp2YXJpYW50PGludDMyX3QsIDo6c3RkOjpzdHJpbmc+IF92YWx1ZTsKIH07ICAvLyBjbGFzcyBVbmlvbgotCiB9ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLQogfSAgLy8gbmFtZXNwYWNlIGFpZGwKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuamF2YQppbmRleCA0ZTFlYmZkLi41ZTU0YTk5IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmphdmEKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5qYXZhCkBAIC0yNiwxMyArMjYsNyBAQAogICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVJbnQobnVtKTsKICAgICBfYWlkbF9wYXJjZWwud3JpdGVTdHJpbmcoc3RyKTsKLSAgICBpZiAoKG5lc3RlZFVuaW9uIT1udWxsKSkgewotICAgICAgX2FpZGxfcGFyY2VsLndyaXRlSW50KDEpOwotICAgICAgbmVzdGVkVW5pb24ud3JpdGVUb1BhcmNlbChfYWlkbF9wYXJjZWwsIDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIF9haWRsX3BhcmNlbC53cml0ZUludCgwKTsKLSAgICB9CisgICAgX2FpZGxfcGFyY2VsLndyaXRlVHlwZWRPYmplY3QobmVzdGVkVW5pb24sIDApOwogICAgIF9haWRsX3BhcmNlbC53cml0ZUJ5dGUobmVzdGVkRW51bSk7CiAgICAgaW50IF9haWRsX2VuZF9wb3MgPSBfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCk7CiAgICAgX2FpZGxfcGFyY2VsLnNldERhdGFQb3NpdGlvbihfYWlkbF9zdGFydF9wb3MpOwpAQCAtNDQsMTggKzM4LDEzIEBACiAgICAgaW50IF9haWRsX3N0YXJ0X3BvcyA9IF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKTsKICAgICBpbnQgX2FpZGxfcGFyY2VsYWJsZV9zaXplID0gX2FpZGxfcGFyY2VsLnJlYWRJbnQoKTsKICAgICB0cnkgewotICAgICAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybjsKKyAgICAgIGlmIChfYWlkbF9wYXJjZWxhYmxlX3NpemUgPCA0KSB0aHJvdyBuZXcgYW5kcm9pZC5vcy5CYWRQYXJjZWxhYmxlRXhjZXB0aW9uKCJQYXJjZWxhYmxlIHRvbyBzbWFsbCIpOzsKICAgICAgIGlmIChfYWlkbF9wYXJjZWwuZGF0YVBvc2l0aW9uKCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm47CiAgICAgICBudW0gPSBfYWlkbF9wYXJjZWwucmVhZEludCgpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIHN0ciA9IF9haWRsX3BhcmNlbC5yZWFkU3RyaW5nKCk7CiAgICAgICBpZiAoX2FpZGxfcGFyY2VsLmRhdGFQb3NpdGlvbigpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgcmV0dXJuOwotICAgICAgaWYgKCgwIT1fYWlkbF9wYXJjZWwucmVhZEludCgpKSkgewotICAgICAgICBuZXN0ZWRVbmlvbiA9IGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5Vbmlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoX2FpZGxfcGFyY2VsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBuZXN0ZWRVbmlvbiA9IG51bGw7Ci0gICAgICB9CisgICAgICBuZXN0ZWRVbmlvbiA9IF9haWRsX3BhcmNlbC5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLmxvZ2dhYmxlLlVuaW9uLkNSRUFUT1IpOwogICAgICAgaWYgKF9haWRsX3BhcmNlbC5kYXRhUG9zaXRpb24oKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybjsKICAgICAgIG5lc3RlZEVudW0gPSBfYWlkbF9wYXJjZWwucmVhZEJ5dGUoKTsKICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuamF2YQppbmRleCBiY2I4MDAxLi5lZTAyYTYxIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuamF2YQpAQCAtNDYsNiArNDYsOSBAQAogICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBhbmRyb2lkLm9zLlBhcmNlbCBkYXRhLCBhbmRyb2lkLm9zLlBhcmNlbCByZXBseSwgaW50IGZsYWdzKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KICAgICB7CiAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IgPSBERVNDUklQVE9SOworICAgICAgaWYgKGNvZGUgPj0gYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gJiYgY29kZSA8PSBhbmRyb2lkLm9zLklCaW5kZXIuTEFTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgIH0KICAgICAgIHN3aXRjaCAoY29kZSkKICAgICAgIHsKICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046CkBAIC02MCw5ICs2Myw4IEBACiAgICAgICAgIHsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgYW5kcm9pZC5vcy5UcmFjZS50cmFjZUJlZ2luKGFuZHJvaWQub3MuVHJhY2UuVFJBQ0VfVEFHX0FJREwsICJBSURMOjpqYXZhOjpJTG9nZ2FibGVJbnRlcmZhY2U6OkxvZ1RoaXM6OnNlcnZlciIpOwotICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKGRlc2NyaXB0b3IpOwogICAgICAgICAgICAgYm9vbGVhbiBfYXJnMDsKLSAgICAgICAgICAgIF9hcmcwID0gKDAhPWRhdGEucmVhZEludCgpKTsKKyAgICAgICAgICAgIF9hcmcwID0gZGF0YS5yZWFkQm9vbGVhbigpOwogICAgICAgICAgICAgYm9vbGVhbltdIF9hcmcxOwogICAgICAgICAgICAgX2FyZzEgPSBkYXRhLmNyZWF0ZUJvb2xlYW5BcnJheSgpOwogICAgICAgICAgICAgYnl0ZSBfYXJnMjsKQEAgLTk2LDIzICs5OCwxNCBAQAogICAgICAgICAgICAgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gX2FyZzE2OwogICAgICAgICAgICAgX2FyZzE2ID0gZGF0YS5jcmVhdGVTdHJpbmdBcnJheUxpc3QoKTsKICAgICAgICAgICAgIGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5EYXRhIF9hcmcxNzsKLSAgICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICAgIF9hcmcxNyA9IGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5EYXRhLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBfYXJnMTcgPSBudWxsOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgX2FyZzE3ID0gZGF0YS5yZWFkVHlwZWRPYmplY3QoYW5kcm9pZC5haWRsLmxvZ2dhYmxlLkRhdGEuQ1JFQVRPUik7CiAgICAgICAgICAgICBhbmRyb2lkLm9zLklCaW5kZXIgX2FyZzE4OwogICAgICAgICAgICAgX2FyZzE4ID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CiAgICAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIF9hcmcxOTsKLSAgICAgICAgICAgIGlmICgoMCE9ZGF0YS5yZWFkSW50KCkpKSB7Ci0gICAgICAgICAgICAgIF9hcmcxOSA9IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIF9hcmcxOSA9IG51bGw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBfYXJnMTkgPSBkYXRhLnJlYWRUeXBlZE9iamVjdChhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOwogICAgICAgICAgICAgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIF9hcmcyMDsKICAgICAgICAgICAgIF9hcmcyMCA9IGRhdGEuY3JlYXRlVHlwZWRBcnJheShhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IpOworICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXSBfcmVzdWx0ID0gdGhpcy5Mb2dUaGlzKF9hcmcwLCBfYXJnMSwgX2FyZzIsIF9hcmczLCBfYXJnNCwgX2FyZzUsIF9hcmc2LCBfYXJnNywgX2FyZzgsIF9hcmc5LCBfYXJnMTAsIF9hcmcxMSwgX2FyZzEyLCBfYXJnMTMsIF9hcmcxNCwgX2FyZzE1LCBfYXJnMTYsIF9hcmcxNywgX2FyZzE4LCBfYXJnMTksIF9hcmcyMCk7CiAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KF9yZXN1bHQpOwpAQCAtMTI1LDI1ICsxMTgsMjAgQEAKICAgICAgICAgICAgIHJlcGx5LndyaXRlRG91YmxlQXJyYXkoX2FyZzEzKTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nQXJyYXkoX2FyZzE1KTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nTGlzdChfYXJnMTYpOwotICAgICAgICAgICAgaWYgKChfYXJnMTkhPW51bGwpKSB7Ci0gICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOwotICAgICAgICAgICAgICBfYXJnMTkud3JpdGVUb1BhcmNlbChyZXBseSwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICByZXBseS53cml0ZUludCgwKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LndyaXRlVHlwZWRPYmplY3QoX2FyZzE5LCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVUeXBlZEFycmF5KF9hcmcyMCwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgIH0KICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgIGFuZHJvaWQub3MuVHJhY2UudHJhY2VFbmQoYW5kcm9pZC5vcy5UcmFjZS5UUkFDRV9UQUdfQUlETCk7CiAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlCiAgICAgewpAQCAtMTY4LDcgKzE1Niw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgYW5kcm9pZC5vcy5UcmFjZS50cmFjZUJlZ2luKGFuZHJvaWQub3MuVHJhY2UuVFJBQ0VfVEFHX0FJREwsICJBSURMOjpqYXZhOjpJTG9nZ2FibGVJbnRlcmZhY2U6OkxvZ1RoaXM6OmNsaWVudCIpOwogICAgICAgICAgIF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oREVTQ1JJUFRPUik7Ci0gICAgICAgICAgX2RhdGEud3JpdGVJbnQoKChib29sVmFsdWUpPygxKTooMCkpKTsKKyAgICAgICAgICBfZGF0YS53cml0ZUJvb2xlYW4oYm9vbFZhbHVlKTsKICAgICAgICAgICBfZGF0YS53cml0ZUJvb2xlYW5BcnJheShib29sQXJyYXkpOwogICAgICAgICAgIF9kYXRhLndyaXRlQnl0ZShieXRlVmFsdWUpOwogICAgICAgICAgIF9kYXRhLndyaXRlQnl0ZUFycmF5KGJ5dGVBcnJheSk7CkBAIC0xODUsMjggKzE3MywxMSBAQAogICAgICAgICAgIF9kYXRhLndyaXRlU3RyaW5nKHN0cmluZ1ZhbHVlKTsKICAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0FycmF5KHN0cmluZ0FycmF5KTsKICAgICAgICAgICBfZGF0YS53cml0ZVN0cmluZ0xpc3QobGlzdFZhbHVlKTsKLSAgICAgICAgICBpZiAoKGRhdGFWYWx1ZSE9bnVsbCkpIHsKLSAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KDEpOwotICAgICAgICAgICAgZGF0YVZhbHVlLndyaXRlVG9QYXJjZWwoX2RhdGEsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KDApOwotICAgICAgICAgIH0KKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkT2JqZWN0KGRhdGFWYWx1ZSwgMCk7CiAgICAgICAgICAgX2RhdGEud3JpdGVTdHJvbmdCaW5kZXIoYmluZGVyVmFsdWUpOwotICAgICAgICAgIGlmICgocGZkVmFsdWUhPW51bGwpKSB7Ci0gICAgICAgICAgICBfZGF0YS53cml0ZUludCgxKTsKLSAgICAgICAgICAgIHBmZFZhbHVlLndyaXRlVG9QYXJjZWwoX2RhdGEsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIF9kYXRhLndyaXRlSW50KDApOwotICAgICAgICAgIH0KKyAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkT2JqZWN0KHBmZFZhbHVlLCAwKTsKICAgICAgICAgICBfZGF0YS53cml0ZVR5cGVkQXJyYXkocGZkQXJyYXksIDApOwogICAgICAgICAgIGJvb2xlYW4gX3N0YXR1cyA9IG1SZW1vdGUudHJhbnNhY3QoU3R1Yi5UUkFOU0FDVElPTl9Mb2dUaGlzLCBfZGF0YSwgX3JlcGx5LCAwKTsKLSAgICAgICAgICBpZiAoIV9zdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChnZXREZWZhdWx0SW1wbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJbXBsKCkuTG9nVGhpcyhib29sVmFsdWUsIGJvb2xBcnJheSwgYnl0ZVZhbHVlLCBieXRlQXJyYXksIGNoYXJWYWx1ZSwgY2hhckFycmF5LCBpbnRWYWx1ZSwgaW50QXJyYXksIGxvbmdWYWx1ZSwgbG9uZ0FycmF5LCBmbG9hdFZhbHVlLCBmbG9hdEFycmF5LCBkb3VibGVWYWx1ZSwgZG91YmxlQXJyYXksIHN0cmluZ1ZhbHVlLCBzdHJpbmdBcnJheSwgbGlzdFZhbHVlLCBkYXRhVmFsdWUsIGJpbmRlclZhbHVlLCBwZmRWYWx1ZSwgcGZkQXJyYXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOwogICAgICAgICAgIF9yZXN1bHQgPSBfcmVwbHkuY3JlYXRlU3RyaW5nQXJyYXkoKTsKICAgICAgICAgICBfcmVwbHkucmVhZEJvb2xlYW5BcnJheShib29sQXJyYXkpOwpAQCAtMjMwLDI2ICsyMDEsMTI1IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICAgICB9Ci0gICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2Ugc0RlZmF1bHRJbXBsOwogICAgIH0KICAgICBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0xvZ1RoaXMgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdEltcGwoYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZSBpbXBsKSB7Ci0gICAgICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgotICAgICAgLy8gYXQgYSB0aW1lLiBUaGlzIGlzIGEgaGV1cmlzdGljIHRvIGRldGVjdCBpZiB0d28gZGlmZmVyZW50Ci0gICAgICAvLyB1c2VycyBpbiB0aGUgc2FtZSBwcm9jZXNzIHVzZSB0aGlzIGZ1bmN0aW9uLgotICAgICAgaWYgKFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsICE9IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RGVmYXVsdEltcGwoKSBjYWxsZWQgdHdpY2UiKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbXBsICE9IG51bGwpIHsKLSAgICAgICAgU3R1Yi5Qcm94eS5zRGVmYXVsdEltcGwgPSBpbXBsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlIGdldERlZmF1bHRJbXBsKCkgewotICAgICAgcmV0dXJuIFN0dWIuUHJveHkuc0RlZmF1bHRJbXBsOwotICAgIH0KICAgfQogICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUiA9ICJhbmRyb2lkJGFpZGwkbG9nZ2FibGUkSUxvZ2dhYmxlSW50ZXJmYWNlIi5yZXBsYWNlKCckJywgJy4nKTsKICAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBMb2dUaGlzKGJvb2xlYW4gYm9vbFZhbHVlLCBib29sZWFuW10gYm9vbEFycmF5LCBieXRlIGJ5dGVWYWx1ZSwgYnl0ZVtdIGJ5dGVBcnJheSwgY2hhciBjaGFyVmFsdWUsIGNoYXJbXSBjaGFyQXJyYXksIGludCBpbnRWYWx1ZSwgaW50W10gaW50QXJyYXksIGxvbmcgbG9uZ1ZhbHVlLCBsb25nW10gbG9uZ0FycmF5LCBmbG9hdCBmbG9hdFZhbHVlLCBmbG9hdFtdIGZsb2F0QXJyYXksIGRvdWJsZSBkb3VibGVWYWx1ZSwgZG91YmxlW10gZG91YmxlQXJyYXksIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nVmFsdWUsIGphdmEubGFuZy5TdHJpbmdbXSBzdHJpbmdBcnJheSwgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gbGlzdFZhbHVlLCBhbmRyb2lkLmFpZGwubG9nZ2FibGUuRGF0YSBkYXRhVmFsdWUsIGFuZHJvaWQub3MuSUJpbmRlciBiaW5kZXJWYWx1ZSwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBwZmRWYWx1ZSwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZEFycmF5KSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIHB1YmxpYyBpbnRlcmZhY2UgSVN1YiBleHRlbmRzIGFuZHJvaWQub3MuSUludGVyZmFjZQorICB7CisgICAgLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElTdWIuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViCisgICAgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIExvZyhpbnQgdmFsdWUpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgorICAgICAgeworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoqIExvY2FsLXNpZGUgSVBDIGltcGxlbWVudGF0aW9uIHN0dWIgY2xhc3MuICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIKKyAgICB7CisgICAgICAvKiogQ29uc3RydWN0IHRoZSBzdHViIGF0IGF0dGFjaCBpdCB0byB0aGUgaW50ZXJmYWNlLiAqLworICAgICAgcHVibGljIFN0dWIoKQorICAgICAgeworICAgICAgICB0aGlzLmF0dGFjaEludGVyZmFjZSh0aGlzLCBERVNDUklQVE9SKTsKKyAgICAgIH0KKyAgICAgIC8qKgorICAgICAgICogQ2FzdCBhbiBJQmluZGVyIG9iamVjdCBpbnRvIGFuIGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiBpbnRlcmZhY2UsCisgICAgICAgKiBnZW5lcmF0aW5nIGEgcHJveHkgaWYgbmVlZGVkLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YiBhc0ludGVyZmFjZShhbmRyb2lkLm9zLklCaW5kZXIgb2JqKQorICAgICAgeworICAgICAgICBpZiAoKG9iaj09bnVsbCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkLm9zLklJbnRlcmZhY2UgaWluID0gb2JqLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoREVTQ1JJUFRPUik7CisgICAgICAgIGlmICgoKGlpbiE9bnVsbCkmJihpaW4gaW5zdGFuY2VvZiBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIpKSkgeworICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UuSVN1YilpaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZC5haWRsLmxvZ2dhYmxlLklMb2dnYWJsZUludGVyZmFjZS5JU3ViLlN0dWIuUHJveHkob2JqKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgYW5kcm9pZC5vcy5QYXJjZWwgZGF0YSwgYW5kcm9pZC5vcy5QYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICB7CisgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvciA9IERFU0NSSVBUT1I7CisgICAgICAgIGlmIChjb2RlID49IGFuZHJvaWQub3MuSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICYmIGNvZGUgPD0gYW5kcm9pZC5vcy5JQmluZGVyLkxBU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIElOVEVSRkFDRV9UUkFOU0FDVElPTjoKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX0xvZzoKKyAgICAgICAgICB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBhbmRyb2lkLm9zLlRyYWNlLnRyYWNlQmVnaW4oYW5kcm9pZC5vcy5UcmFjZS5UUkFDRV9UQUdfQUlETCwgIkFJREw6OmphdmE6OklTdWI6OkxvZzo6c2VydmVyIik7CisgICAgICAgICAgICAgIGludCBfYXJnMDsKKyAgICAgICAgICAgICAgX2FyZzAgPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlTm9EYXRhQXZhaWwoKTsKKyAgICAgICAgICAgICAgdGhpcy5Mb2coX2FyZzApOworICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgYW5kcm9pZC5vcy5UcmFjZS50cmFjZUVuZChhbmRyb2lkLm9zLlRyYWNlLlRSQUNFX1RBR19BSURMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgaW1wbGVtZW50cyBhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIKKyAgICAgIHsKKyAgICAgICAgcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZTsKKyAgICAgICAgUHJveHkoYW5kcm9pZC5vcy5JQmluZGVyIHJlbW90ZSkKKyAgICAgICAgeworICAgICAgICAgIG1SZW1vdGUgPSByZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIG1SZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gREVTQ1JJUFRPUjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgTG9nKGludCB2YWx1ZSkgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICBhbmRyb2lkLm9zLlBhcmNlbCBfZGF0YSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIGFuZHJvaWQub3MuUGFyY2VsIF9yZXBseSA9IGFuZHJvaWQub3MuUGFyY2VsLm9idGFpbigpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbmRyb2lkLm9zLlRyYWNlLnRyYWNlQmVnaW4oYW5kcm9pZC5vcy5UcmFjZS5UUkFDRV9UQUdfQUlETCwgIkFJREw6OmphdmE6OklTdWI6OkxvZzo6Y2xpZW50Iik7CisgICAgICAgICAgICBfZGF0YS53cml0ZUludGVyZmFjZVRva2VuKERFU0NSSVBUT1IpOworICAgICAgICAgICAgX2RhdGEud3JpdGVJbnQodmFsdWUpOworICAgICAgICAgICAgYm9vbGVhbiBfc3RhdHVzID0gbVJlbW90ZS50cmFuc2FjdChTdHViLlRSQU5TQUNUSU9OX0xvZywgX2RhdGEsIF9yZXBseSwgMCk7CisgICAgICAgICAgICBfcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIF9yZXBseS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBfZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLlRyYWNlLnRyYWNlRW5kKGFuZHJvaWQub3MuVHJhY2UuVFJBQ0VfVEFHX0FJREwpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9Mb2cgPSAoYW5kcm9pZC5vcy5JQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IgPSAiYW5kcm9pZCRhaWRsJGxvZ2dhYmxlJElMb2dnYWJsZUludGVyZmFjZSRJU3ViIi5yZXBsYWNlKCckJywgJy4nKTsKKyAgICBwdWJsaWMgdm9pZCBMb2coaW50IHZhbHVlKSB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CisgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5qYXZhLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuamF2YS5kCmluZGV4IDM1NjM0MzMuLjY3MGYyYzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5qYXZhLmQKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEuZApAQCAtMSwzICsxLDUgQEAKIG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmphdmEgOiBcCiAgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5haWRsIFwKKyAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uamF2YSBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmphdmEKaW5kZXggMjEyNmM5My4uMTc1MWRiMyAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLWphdmEtc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uamF2YQorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtamF2YS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5qYXZhCkBAIC0yLDcgKzIsNiBAQAogICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAgRE8gTk9UIE1PRElGWS4KICAqLwogcGFja2FnZSBhbmRyb2lkLmFpZGwubG9nZ2FibGU7Ci0KIHB1YmxpYyBmaW5hbCBjbGFzcyBVbmlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgIC8vIHRhZ3MgZm9yIHVuaW9uIGZpZWxkcwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBudW0gPSAwOyAgLy8gaW50IG51bTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwCmluZGV4IDI5YmEzYzMuLjI1OTNmYmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcApAQCAtOCw2NyArOCw2OCBAQAogbmFtZXNwYWNlIGxvZ2dhYmxlIHsKIGNvbnN0IGNoYXIqIERhdGE6OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLmxvZ2dhYmxlLkRhdGEiOwogCi1iaW5kZXJfc3RhdHVzX3QgRGF0YTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgX2FpZGxfcGFyY2VsYWJsZV9zaXplOwotICBpbnQzMl90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKK2JpbmRlcl9zdGF0dXNfdCBEYXRhOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfYWlkbF9wYXJjZWwpIHsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7CisgIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKTsKKyAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemUgPSAwOworICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfcGFyY2VsLCAmX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKworICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgNCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7CiAgIGlmIChfYWlkbF9zdGFydF9wb3MgPiBJTlQzMl9NQVggLSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcGFyY2VsYWJsZV9zaXplIDwgMCkgcmV0dXJuIFNUQVRVU19CQURfVkFMVUU7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDMyKHBhcmNlbCwgJm51bSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZudW0pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKHBhcmNlbCwgJnN0cik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZzdHIpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKKyAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7CisgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwogICAgIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICB9Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkUGFyY2VsYWJsZShwYXJjZWwsICZuZXN0ZWRVbmlvbik7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZuZXN0ZWRVbmlvbik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAKLSAgaWYgKEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCkgLSBfYWlkbF9zdGFydF9wb3MgPj0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSB7Ci0gICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOworICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24oX2FpZGxfcGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKKyAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CiAgICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUocGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDhfdCo+KCZuZXN0ZWRFbnVtKSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9wYXJjZWwsICZuZXN0ZWRFbnVtKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7CisgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9Ci1iaW5kZXJfc3RhdHVzX3QgRGF0YTo6d3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKK2JpbmRlcl9zdGF0dXNfdCBEYXRhOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9haWRsX3BhcmNlbCkgY29uc3QgewogICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKKyAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKF9haWRsX3BhcmNlbCk7CisgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfcGFyY2VsLCAwKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgbnVtKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIG51bSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKHBhcmNlbCwgc3RyKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIHN0cik7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZShwYXJjZWwsIG5lc3RlZFVuaW9uKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIG5lc3RlZFVuaW9uKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUocGFyY2VsLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG5lc3RlZEVudW0pKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9wYXJjZWwsIG5lc3RlZEVudW0pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogCi0gIHNpemVfdCBfYWlkbF9lbmRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCBfYWlkbF9lbmRfcG9zIC0gX2FpZGxfc3RhcnRfcG9zKTsKLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9lbmRfcG9zKTsKKyAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7CisgIEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOworICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihfYWlkbF9wYXJjZWwsIF9haWRsX2VuZF9wb3MpOwogICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwCmluZGV4IDQ4MzVmM2IuLjY2ZDFlNzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmNwcAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAKQEAgLTEsMjMgKzEsMjIgQEAKKyNpbmNsdWRlICJhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaCIKKwogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfdG9fc3RyaW5nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIHsKK3N0cnVjdCBTY29wZWRUcmFjZSB7CisgIGlubGluZSBleHBsaWNpdCBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBuYW1lKSB7IEFUcmFjZV9iZWdpblNlY3Rpb24obmFtZSk7IH0KKyAgaW5saW5lIH5TY29wZWRUcmFjZSgpIHsgQVRyYWNlX2VuZFNlY3Rpb24oKTsgfQorfTsKK30gIC8vIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgbG9nZ2FibGUgewotY2xhc3MgU2NvcGVkVHJhY2UgewotICBwdWJsaWM6Ci0gIGlubGluZSBleHBsaWNpdCBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIEFUcmFjZV9iZWdpblNlY3Rpb24obmFtZSk7Ci0gIH0KLSAgaW5saW5lIH5TY29wZWRUcmFjZSgpIHsKLSAgQVRyYWNlX2VuZFNlY3Rpb24oKTsKLSAgfQotfTsKLXN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgeworc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKICAgKHZvaWQpX2FpZGxfaW47CiAgICh2b2lkKV9haWRsX291dDsKICAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKQEAgLTQ4LDY3ICs0Nyw2NyBAQAogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9haWRsX3JldHVybjsKIAogICAgICAgU2NvcGVkVHJhY2UgX2FpZGxfdHJhY2UoIkFJREw6Om5kazo6SUxvZ2dhYmxlSW50ZXJmYWNlOjpMb2dUaGlzOjpzZXJ2ZXIiKTsKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRCb29sKF9haWRsX2luLCAmaW5fYm9vbFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2Jvb2xWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2Jvb2xBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9ib29sQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUoX2FpZGxfaW4sICZpbl9ieXRlVmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fYnl0ZVZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fYnl0ZUFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2J5dGVBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQ2hhcihfYWlkbF9pbiwgJmluX2NoYXJWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9jaGFyVmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9jaGFyQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fY2hhckFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfYWlkbF9pbiwgJmluX2ludFZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2ludFZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5faW50QXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5faW50QXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEludDY0KF9haWRsX2luLCAmaW5fbG9uZ1ZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2xvbmdWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2xvbmdBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9sb25nQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEZsb2F0KF9haWRsX2luLCAmaW5fZmxvYXRWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9mbG9hdFZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fZmxvYXRBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9mbG9hdEFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWREb3VibGUoX2FpZGxfaW4sICZpbl9kb3VibGVWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9kb3VibGVWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2RvdWJsZUFycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2RvdWJsZUFycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkU3RyaW5nKF9haWRsX2luLCAmaW5fc3RyaW5nVmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fc3RyaW5nVmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9zdHJpbmdBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9zdHJpbmdBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2xpc3RWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl9saXN0VmFsdWUpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKF9haWRsX2luLCAmaW5fZGF0YVZhbHVlKTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9pbiwgJmluX2RhdGFWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKF9haWRsX2luLCAmaW5fYmluZGVyVmFsdWUpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWROdWxsYWJsZURhdGEoX2FpZGxfaW4sICZpbl9iaW5kZXJWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfaW4sICZpbl9wZmRWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlRGF0YShfYWlkbF9pbiwgJmluX3BmZFZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fcGZkQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX2luLCAmaW5fcGZkQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgQm5Mb2dnYWJsZUludGVyZmFjZTo6VHJhbnNhY3Rpb25Mb2cgX3RyYW5zYWN0aW9uX2xvZzsKQEAgLTE2Nyw0MCArMTY2LDQwIEBACiAKICAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBfYWlkbF9yZXR1cm4pOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIF9haWRsX3JldHVybik7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9ib29sQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX2Jvb2xBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9ieXRlQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX2J5dGVBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9jaGFyQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX2NoYXJBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9pbnRBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5faW50QXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fbG9uZ0FycmF5KTsKKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfb3V0LCBpbl9sb25nQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fZmxvYXRBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fZmxvYXRBcnJheSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9kb3VibGVBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fZG91YmxlQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fc3RyaW5nQXJyYXkpOworICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9vdXQsIGluX3N0cmluZ0FycmF5KTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2xpc3RWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fbGlzdFZhbHVlKTsKICAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CiAKLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfb3V0LCBpbl9wZmRWYWx1ZSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVOdWxsYWJsZURhdGEoX2FpZGxfb3V0LCBpbl9wZmRWYWx1ZSk7CiAgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwogCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9wZmRBcnJheSk7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX291dCwgaW5fcGZkQXJyYXkpOwogICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKIAogICAgICAgYnJlYWs7CkBAIC0yMDksNyArMjA4LDcgQEAKICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiB9CiAKLXN0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9jbGF6eiA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6ZGVmaW5lQ2xhc3MoSUxvZ2dhYmxlSW50ZXJmYWNlOjpkZXNjcmlwdG9yLCBfYWlkbF9vblRyYW5zYWN0KTsKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTG9nZ2FibGVJbnRlcmZhY2U6OmRlc2NyaXB0b3IsIF9haWRsX2FuZHJvaWRfYWlkbF9sb2dnYWJsZV9JTG9nZ2FibGVJbnRlcmZhY2Vfb25UcmFuc2FjdCk7CiAKIEJwTG9nZ2FibGVJbnRlcmZhY2U6OkJwTG9nZ2FibGVJbnRlcmZhY2UoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgOiBCcENJbnRlcmZhY2UoYmluZGVyKSB7fQogQnBMb2dnYWJsZUludGVyZmFjZTo6fkJwTG9nZ2FibGVJbnRlcmZhY2UoKSB7fQpAQCAtMjUwLDY3ICsyNDksNjcgQEAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCb29sKF9haWRsX2luLmdldCgpLCBpbl9ib29sVmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9ib29sVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fYm9vbEFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2Jvb2xBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUoX2FpZGxfaW4uZ2V0KCksIGluX2J5dGVWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX2J5dGVWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9ieXRlQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fYnl0ZUFycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQ2hhcihfYWlkbF9pbi5nZXQoKSwgaW5fY2hhclZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fY2hhclZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2NoYXJBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9jaGFyQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVJbnQzMihfYWlkbF9pbi5nZXQoKSwgaW5faW50VmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9pbnRWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9pbnRBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9pbnRBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDY0KF9haWRsX2luLmdldCgpLCBpbl9sb25nVmFsdWUpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCBpbl9sb25nVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fbG9uZ0FycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2xvbmdBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUZsb2F0KF9haWRsX2luLmdldCgpLCBpbl9mbG9hdFZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fZmxvYXRWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9mbG9hdEFycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX2Zsb2F0QXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVEb3VibGUoX2FpZGxfaW4uZ2V0KCksIGluX2RvdWJsZVZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fZG91YmxlVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fZG91YmxlQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fZG91YmxlQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9haWRsX2luLmdldCgpLCBpbl9zdHJpbmdWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksIGluX3N0cmluZ1ZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX3N0cmluZ0FycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgKmluX3N0cmluZ0FycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2xpc3RWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZURhdGEoX2FpZGxfaW4uZ2V0KCksICppbl9saXN0VmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlUGFyY2VsYWJsZShfYWlkbF9pbi5nZXQoKSwgaW5fZGF0YVZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fZGF0YVZhbHVlKTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlU3Ryb25nQmluZGVyKF9haWRsX2luLmdldCgpLCBpbl9iaW5kZXJWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fYmluZGVyVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9pbi5nZXQoKSwgKmluX3BmZFZhbHVlKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fcGZkVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fcGZkQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9haWRsX2luLmdldCgpLCAqaW5fcGZkQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KApAQCAtMzMzLDQwICszMzIsNDAgQEAKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBfYWlkbF9yZXR1cm4pOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9ib29sQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9ib29sQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9ieXRlQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9ieXRlQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9jaGFyQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9jaGFyQXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9pbnRBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2ludEFycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fbG9uZ0FycmF5KTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9haWRsX291dC5nZXQoKSwgaW5fbG9uZ0FycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fZmxvYXRBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2Zsb2F0QXJyYXkpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9kb3VibGVBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2RvdWJsZUFycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fc3RyaW5nQXJyYXkpOworICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfb3V0LmdldCgpLCBpbl9zdHJpbmdBcnJheSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2xpc3RWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX2xpc3RWYWx1ZSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKIAotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9wZmRWYWx1ZSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVEYXRhKF9haWRsX291dC5nZXQoKSwgaW5fcGZkVmFsdWUpOwogICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CiAKLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9wZmRBcnJheSk7CisgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfYWlkbF9vdXQuZ2V0KCksIGluX3BmZEFycmF5KTsKICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwogCiAgIF9haWRsX2Vycm9yOgpAQCAtNDA0LDcgKzQwMyw3IEBACiBCbkxvZ2dhYmxlSW50ZXJmYWNlOjp+Qm5Mb2dnYWJsZUludGVyZmFjZSgpIHt9CiBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQm5Mb2dnYWJsZUludGVyZmFjZTo6VHJhbnNhY3Rpb25Mb2cmKT4gQm5Mb2dnYWJsZUludGVyZmFjZTo6bG9nRnVuYzsKIDo6bmRrOjpTcEFJQmluZGVyIEJuTG9nZ2FibGVJbnRlcmZhY2U6OmNyZWF0ZUJpbmRlcigpIHsKLSAgQUlCaW5kZXIqIGJpbmRlciA9IEFJQmluZGVyX25ldyhfZ19haWRsX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKICAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7CiAgICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC00MTcsNyArNDE2LDcgQEAKIAogCiBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiBJTG9nZ2FibGVJbnRlcmZhY2U6OmZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcikgewotICBpZiAoIUFJQmluZGVyX2Fzc29jaWF0ZUNsYXNzKGJpbmRlci5nZXQoKSwgX2dfYWlkbF9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOwogICBpZiAoaW50ZXJmYWNlKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJTG9nZ2FibGVJbnRlcmZhY2U+KGludGVyZmFjZSk7CkBAIC00NjUsMyArNDY0LDE3OCBAQAogfSAgLy8gbmFtZXNwYWNlIGFpZGwKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiB9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKK3N0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9JU3ViX29uVHJhbnNhY3QoQUlCaW5kZXIqIF9haWRsX2JpbmRlciwgdHJhbnNhY3Rpb25fY29kZV90IF9haWRsX2NvZGUsIGNvbnN0IEFQYXJjZWwqIF9haWRsX2luLCBBUGFyY2VsKiBfYWlkbF9vdXQpIHsKKyAgKHZvaWQpX2FpZGxfaW47CisgICh2b2lkKV9haWRsX291dDsKKyAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfVU5LTk9XTl9UUkFOU0FDVElPTjsKKyAgc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI+IF9haWRsX2ltcGwgPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yj4oOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShfYWlkbF9iaW5kZXIpKTsKKyAgc3dpdGNoIChfYWlkbF9jb2RlKSB7CisgICAgY2FzZSAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypMb2cqLyk6IHsKKyAgICAgIGludDMyX3QgaW5fdmFsdWU7CisKKyAgICAgIFNjb3BlZFRyYWNlIF9haWRsX3RyYWNlKCJBSURMOjpuZGs6OklTdWI6OkxvZzo6c2VydmVyIik7CisgICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZERhdGEoX2FpZGxfaW4sICZpbl92YWx1ZSk7CisgICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOworCisgICAgICBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpUcmFuc2FjdGlvbkxvZyBfdHJhbnNhY3Rpb25fbG9nOworICAgICAgaWYgKElMb2dnYWJsZUludGVyZmFjZTo6Qm5TdWI6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgeworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl92YWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX3ZhbHVlKSk7CisgICAgICB9CisgICAgICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1cyA9IF9haWRsX2ltcGwtPkxvZyhpbl92YWx1ZSk7CisgICAgICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gX2xvZ19lbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5kdXJhdGlvbl9tcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KF9sb2dfZW5kIC0gX2xvZ19zdGFydCkuY291bnQoKTsKKyAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnRlcmZhY2VfbmFtZSA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIiOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm1ldGhvZF9uYW1lID0gIkxvZyI7CisgICAgICAgIF90cmFuc2FjdGlvbl9sb2cuc3R1Yl9hZGRyZXNzID0gX2FpZGxfaW1wbC5nZXQoKTsKKyAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5wcm94eV9hZGRyZXNzID0gbnVsbHB0cjsKKyAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5leGNlcHRpb25fY29kZSA9IEFTdGF0dXNfZ2V0RXhjZXB0aW9uQ29kZShfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9tZXNzYWdlID0gQVN0YXR1c19nZXRNZXNzYWdlKF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgICAgIF90cmFuc2FjdGlvbl9sb2cudHJhbnNhY3Rpb25fZXJyb3IgPSBBU3RhdHVzX2dldFN0YXR1cyhfYWlkbF9zdGF0dXMuZ2V0KCkpOworICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZSA9IEFTdGF0dXNfZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgICAgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6bG9nRnVuYyhfdHJhbnNhY3Rpb25fbG9nKTsKKyAgICAgIH0KKyAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlU3RhdHVzSGVhZGVyKF9haWRsX291dCwgX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7CisKKyAgICAgIGlmICghQVN0YXR1c19pc09rKF9haWRsX3N0YXR1cy5nZXQoKSkpIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Cit9CisKK3N0YXRpYyBBSUJpbmRlcl9DbGFzcyogX2dfYWlkbF9hbmRyb2lkX2FpZGxfbG9nZ2FibGVfSUxvZ2dhYmxlSW50ZXJmYWNlX0lTdWJfY2xhenogPSA6Om5kazo6SUNJbnRlcmZhY2U6OmRlZmluZUNsYXNzKElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yjo6ZGVzY3JpcHRvciwgX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9JU3ViX29uVHJhbnNhY3QpOworCitJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjpCcFN1Yihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSA6IEJwQ0ludGVyZmFjZShiaW5kZXIpIHt9CitJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViOjp+QnBTdWIoKSB7fQorc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OlRyYW5zYWN0aW9uTG9nJik+IElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OmxvZ0Z1bmM7CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OkxvZyhpbnQzMl90IGluX3ZhbHVlKSB7CisgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzID0gU1RBVFVTX09LOworICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXM7CisgIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX2luOworICA6Om5kazo6U2NvcGVkQVBhcmNlbCBfYWlkbF9vdXQ7CisKKyAgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6VHJhbnNhY3Rpb25Mb2cgX3RyYW5zYWN0aW9uX2xvZzsKKyAgaWYgKElMb2dnYWJsZUludGVyZmFjZTo6QnBTdWI6OmxvZ0Z1bmMgIT0gbnVsbHB0cikgeworICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3ZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fdmFsdWUpKTsKKyAgfQorICBhdXRvIF9sb2dfc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgU2NvcGVkVHJhY2UgX2FpZGxfdHJhY2UoIkFJREw6Om5kazo6SVN1Yjo6TG9nOjpjbGllbnQiKTsKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3ByZXBhcmVUcmFuc2FjdGlvbihhc0JpbmRlcigpLmdldCgpLCBfYWlkbF9pbi5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfYWlkbF9pbi5nZXQoKSwgaW5fdmFsdWUpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFJQmluZGVyX3RyYW5zYWN0KAorICAgIGFzQmluZGVyKCkuZ2V0KCksCisgICAgKEZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAwIC8qTG9nKi8pLAorICAgIF9haWRsX2luLmdldFIoKSwKKyAgICBfYWlkbF9vdXQuZ2V0UigpLAorICAgIDAKKyAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKKyAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAorICAgICk7CisgIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElTdWI6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICBfYWlkbF9zdGF0dXMgPSBJU3ViOjpnZXREZWZhdWx0SW1wbCgpLT5Mb2coaW5fdmFsdWUpOworICAgIGdvdG8gX2FpZGxfc3RhdHVzX3JldHVybjsKKyAgfQorICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZFN0YXR1c0hlYWRlcihfYWlkbF9vdXQuZ2V0KCksIF9haWRsX3N0YXR1cy5nZXRSKCkpOworICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOworICBfYWlkbF9lcnJvcjoKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoX2FpZGxfcmV0X3N0YXR1cykpOworICBfYWlkbF9zdGF0dXNfcmV0dXJuOgorICBpZiAoSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6bG9nRnVuYyAhPSBudWxscHRyKSB7CisgICAgYXV0byBfbG9nX2VuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIF90cmFuc2FjdGlvbl9sb2cuZHVyYXRpb25fbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPihfbG9nX2VuZCAtIF9sb2dfc3RhcnQpLmNvdW50KCk7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnRlcmZhY2VfbmFtZSA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIiOworICAgIF90cmFuc2FjdGlvbl9sb2cubWV0aG9kX25hbWUgPSAiTG9nIjsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLnN0dWJfYWRkcmVzcyA9IG51bGxwdHI7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5wcm94eV9hZGRyZXNzID0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRoaXMpOworICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX2NvZGUgPSBBU3RhdHVzX2dldEV4Y2VwdGlvbkNvZGUoX2FpZGxfc3RhdHVzLmdldCgpKTsKKyAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9tZXNzYWdlID0gQVN0YXR1c19nZXRNZXNzYWdlKF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgX3RyYW5zYWN0aW9uX2xvZy50cmFuc2FjdGlvbl9lcnJvciA9IEFTdGF0dXNfZ2V0U3RhdHVzKF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgX3RyYW5zYWN0aW9uX2xvZy5zZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGUgPSBBU3RhdHVzX2dldFNlcnZpY2VTcGVjaWZpY0Vycm9yKF9haWRsX3N0YXR1cy5nZXQoKSk7CisgICAgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCcFN1Yjo6bG9nRnVuYyhfdHJhbnNhY3Rpb25fbG9nKTsKKyAgfQorICByZXR1cm4gX2FpZGxfc3RhdHVzOworfQorLy8gU291cmNlIGZvciBCblN1YgorSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6Qm5TdWIoKSB7fQorSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6fkJuU3ViKCkge30KK3N0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpUcmFuc2FjdGlvbkxvZyYpPiBJTG9nZ2FibGVJbnRlcmZhY2U6OkJuU3ViOjpsb2dGdW5jOworOjpuZGs6OlNwQUlCaW5kZXIgSUxvZ2dhYmxlSW50ZXJmYWNlOjpCblN1Yjo6Y3JlYXRlQmluZGVyKCkgeworICBBSUJpbmRlciogYmluZGVyID0gQUlCaW5kZXJfbmV3KF9nX2FpZGxfYW5kcm9pZF9haWRsX2xvZ2dhYmxlX0lMb2dnYWJsZUludGVyZmFjZV9JU3ViX2NsYXp6LCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykpOworICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCisgIEFJQmluZGVyX21hcmtDb21waWxhdGlvblVuaXRTdGFiaWxpdHkoYmluZGVyKTsKKyAgI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKKyAgcmV0dXJuIDo6bmRrOjpTcEFJQmluZGVyKGJpbmRlcik7Cit9CisvLyBTb3VyY2UgZm9yIElTdWIKK2NvbnN0IGNoYXIqIElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yjo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlLklTdWIiOworSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjpJU3ViKCkge30KK0lMb2dnYWJsZUludGVyZmFjZTo6SVN1Yjo6fklTdWIoKSB7fQorCisKK3N0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI+IElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yjo6ZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKSB7CisgIGlmICghQUlCaW5kZXJfYXNzb2NpYXRlQ2xhc3MoYmluZGVyLmdldCgpLCBfZ19haWRsX2FuZHJvaWRfYWlkbF9sb2dnYWJsZV9JTG9nZ2FibGVJbnRlcmZhY2VfSVN1Yl9jbGF6eikpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpJQ0ludGVyZmFjZT4gaW50ZXJmYWNlID0gOjpuZGs6OklDSW50ZXJmYWNlOjphc0ludGVyZmFjZShiaW5kZXIuZ2V0KCkpOworICBpZiAoaW50ZXJmYWNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxJU3ViPihpbnRlcmZhY2UpOworICB9CisgIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxJTG9nZ2FibGVJbnRlcmZhY2U6OkJwU3ViPihiaW5kZXIpOworfQorCitiaW5kZXJfc3RhdHVzX3QgSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElTdWI+JiBpbnN0YW5jZSkgeworICByZXR1cm4gQVBhcmNlbF93cml0ZVN0cm9uZ0JpbmRlcihwYXJjZWwsIGluc3RhbmNlID8gaW5zdGFuY2UtPmFzQmluZGVyKCkuZ2V0KCkgOiBudWxscHRyKTsKK30KK2JpbmRlcl9zdGF0dXNfdCBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElTdWI+KiBpbnN0YW5jZSkgeworICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBUGFyY2VsX3JlYWRTdHJvbmdCaW5kZXIocGFyY2VsLCBiaW5kZXIuZ2V0UigpKTsKKyAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgICppbnN0YW5jZSA9IElTdWI6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgcmV0dXJuIFNUQVRVU19PSzsKK30KK2Jvb2wgSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVN1Yj4mIGltcGwpIHsKKyAgLy8gT25seSBvbmUgdXNlciBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24KKyAgLy8gYXQgYSB0aW1lLiBUaGlzIGlzIGEgaGV1cmlzdGljIHRvIGRldGVjdCBpZiB0d28gZGlmZmVyZW50CisgIC8vIHVzZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgdXNlIHRoaXMgZnVuY3Rpb24uCisgIGFzc2VydCghSVN1Yjo6ZGVmYXVsdF9pbXBsKTsKKyAgaWYgKGltcGwpIHsKKyAgICBJU3ViOjpkZWZhdWx0X2ltcGwgPSBpbXBsOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI+JiBJTG9nZ2FibGVJbnRlcmZhY2U6OklTdWI6OmdldERlZmF1bHRJbXBsKCkgeworICByZXR1cm4gSVN1Yjo6ZGVmYXVsdF9pbXBsOworfQorc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZTo6SVN1Yj4gSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViOjpkZWZhdWx0X2ltcGwgPSBudWxscHRyOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViRGVmYXVsdDo6TG9nKGludDMyX3QgLyppbl92YWx1ZSovKSB7CisgIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKKyAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKKyAgcmV0dXJuIF9haWRsX3N0YXR1czsKK30KKzo6bmRrOjpTcEFJQmluZGVyIElMb2dnYWJsZUludGVyZmFjZTo6SVN1YkRlZmF1bHQ6OmFzQmluZGVyKCkgeworICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKK30KK2Jvb2wgSUxvZ2dhYmxlSW50ZXJmYWNlOjpJU3ViRGVmYXVsdDo6aXNSZW1vdGUoKSB7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZAppbmRleCBmNWM1NTZkLi4zYmNkY2Q0IDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZApAQCAtMSwzICsxLDUgQEAKIG91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vdG9vbHMvYWlkbC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwIDogXAogICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5haWRsCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwgXAorICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uYWlkbCBcCisgIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKaW5kZXggN2QwMmQ0ZC4uYWVjNWVkNiAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKQEAgLTExLDExICsxMSwxMSBAQAogYmluZGVyX3N0YXR1c190IFVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7CiAgIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwogICBpbnQzMl90IF9haWRsX3RhZzsKLSAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CisgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWREYXRhKF9wYXJjZWwsICZfYWlkbF90YWcpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICBzd2l0Y2ggKF9haWRsX3RhZykgewogICBjYXNlIG51bTogewogICAgIGludDMyX3QgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQzMl90PikgewogICAgICAgc2V0PG51bT4oX2FpZGxfdmFsdWUpOwogICAgIH0gZWxzZSB7CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19PSzsgfQogICBjYXNlIHN0cjogewogICAgIHN0ZDo6c3RyaW5nIF9haWRsX3ZhbHVlOwotICAgIGlmICgoX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcoX3BhcmNlbCwgJl9haWRsX3ZhbHVlKSkgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKKyAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkRGF0YShfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwogICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnN0cmluZz4pIHsKICAgICAgIHNldDxzdHI+KF9haWRsX3ZhbHVlKTsKICAgICB9IGVsc2UgewpAQCAtMzcsMTEgKzM3LDExIEBACiAgIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwogfQogYmluZGVyX3N0YXR1c190IFVuaW9uOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9wYXJjZWwpIGNvbnN0IHsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgZ2V0VGFnKCkpOworICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXRUYWcoKSk7CiAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7CiAgIHN3aXRjaCAoZ2V0VGFnKCkpIHsKLSAgY2FzZSBudW06IHJldHVybiBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgZ2V0PG51bT4oKSk7Ci0gIGNhc2Ugc3RyOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX3BhcmNlbCwgZ2V0PHN0cj4oKSk7CisgIGNhc2UgbnVtOiByZXR1cm4gOjpuZGs6OkFQYXJjZWxfd3JpdGVEYXRhKF9wYXJjZWwsIGdldDxudW0+KCkpOworICBjYXNlIHN0cjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlRGF0YShfcGFyY2VsLCBnZXQ8c3RyPigpKTsKICAgfQogICBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiY2FuJ3QgcmVhY2ggaGVyZSIpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oCmluZGV4IGVjYzc4OGUuLmVkZDM4ZTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmgKQEAgLTEsMTcgKzEsMTkgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KKwogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaD4KKwogbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGFpZGwgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oCmluZGV4IDFmMDIwODAuLjk5NTQyYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaAorKysgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmgKQEAgLTEsMTUgKzEsMTYgQEAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9lbnVtcy5oPgorCiBuYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWlkbCB7CkBAIC0xOCw2ICsxOSwxNCBAQAogICBGT08gPSA0MiwKIH07CiAKK30gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQorfSAgLy8gbmFtZXNwYWNlIGFpZGwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGxvZ2dhYmxlIHsKIFtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhFbnVtIHZhbCkgewogICBzd2l0Y2godmFsKSB7CiAgIGNhc2UgRW51bTo6Rk9POgpAQCAtNDAsNCArNDksNCBAQAogfTsKICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBuZGsKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKaW5kZXggMzNjNzllMS4uOWFiMDI0OCAxMDA2NDQKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvSUxvZ2dhYmxlSW50ZXJmYWNlLmgKQEAgLTEsMTkgKzEsMjAgQEAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQogI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3RyYWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oPgogI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3N0YWJpbGl0eS5oPgogI2VuZGlmICAvLyBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmg+CiAKIG5hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI1LDYgKzI2LDc0IEBACiAgIElMb2dnYWJsZUludGVyZmFjZSgpOwogICB2aXJ0dWFsIH5JTG9nZ2FibGVJbnRlcmZhY2UoKTsKIAorICBjbGFzcyBJU3ViIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKKyAgICBJU3ViKCk7CisgICAgdmlydHVhbCB+SVN1YigpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9Mb2cgPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVN1Yj4gZnJvbUJpbmRlcihjb25zdCA6Om5kazo6U3BBSUJpbmRlciYgYmluZGVyKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVN1Yj4mIGluc3RhbmNlKTsKKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IEFQYXJjZWwqIHBhcmNlbCwgc3RkOjpzaGFyZWRfcHRyPElTdWI+KiBpbnN0YW5jZSk7CisgICAgc3RhdGljIGJvb2wgc2V0RGVmYXVsdEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElTdWI+JiBpbXBsKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElTdWI+JiBnZXREZWZhdWx0SW1wbCgpOworICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTG9nKGludDMyX3QgaW5fdmFsdWUpID0gMDsKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElTdWI+IGRlZmF1bHRfaW1wbDsKKyAgfTsKKyAgY2xhc3MgSVN1YkRlZmF1bHQgOiBwdWJsaWMgSVN1YiB7CisgIHB1YmxpYzoKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBMb2coaW50MzJfdCBpbl92YWx1ZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXNCaW5kZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7CisgIH07CisgIGNsYXNzIEJwU3ViIDogcHVibGljIDo6bmRrOjpCcENJbnRlcmZhY2U8SVN1Yj4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQnBTdWIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CisgICAgdmlydHVhbCB+QnBTdWIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIExvZyhpbnQzMl90IGluX3ZhbHVlKSBvdmVycmlkZTsKKyAgICBzdHJ1Y3QgVHJhbnNhY3Rpb25Mb2cgeworICAgICAgZG91YmxlIGR1cmF0aW9uX21zOworICAgICAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlX25hbWU7CisgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZTsKKyAgICAgIGNvbnN0IHZvaWQqIHByb3h5X2FkZHJlc3M7CisgICAgICBjb25zdCB2b2lkKiBzdHViX2FkZHJlc3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaW5wdXRfYXJnczsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBvdXRwdXRfYXJnczsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgICAgaW50MzJfdCBleGNlcHRpb25fY29kZTsKKyAgICAgIGludDMyX3QgdHJhbnNhY3Rpb25fZXJyb3I7CisgICAgICBpbnQzMl90IHNlcnZpY2Vfc3BlY2lmaWNfZXJyb3JfY29kZTsKKyAgICB9OworICAgIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYzsKKyAgfTsKKyAgY2xhc3MgQm5TdWIgOiBwdWJsaWMgOjpuZGs6OkJuQ0ludGVyZmFjZTxJU3ViPiB7CisgIHB1YmxpYzoKKyAgICBCblN1YigpOworICAgIHZpcnR1YWwgfkJuU3ViKCk7CisgICAgc3RydWN0IFRyYW5zYWN0aW9uTG9nIHsKKyAgICAgIGRvdWJsZSBkdXJhdGlvbl9tczsKKyAgICAgIHN0ZDo6c3RyaW5nIGludGVyZmFjZV9uYW1lOworICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWU7CisgICAgICBjb25zdCB2b2lkKiBwcm94eV9hZGRyZXNzOworICAgICAgY29uc3Qgdm9pZCogc3R1Yl9hZGRyZXNzOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGlucHV0X2FyZ3M7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gb3V0cHV0X2FyZ3M7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25fbWVzc2FnZTsKKyAgICAgIGludDMyX3QgZXhjZXB0aW9uX2NvZGU7CisgICAgICBpbnQzMl90IHRyYW5zYWN0aW9uX2Vycm9yOworICAgICAgaW50MzJfdCBzZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGU7CisgICAgfTsKKyAgICBzdGF0aWMgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFRyYW5zYWN0aW9uTG9nJik+IGxvZ0Z1bmM7CisgIHByb3RlY3RlZDoKKyAgICA6Om5kazo6U3BBSUJpbmRlciBjcmVhdGVCaW5kZXIoKSBvdmVycmlkZTsKKyAgcHJpdmF0ZToKKyAgfTsKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9Mb2dUaGlzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7CiAKICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7CmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaAppbmRleCBmNTM3NTJhLi5jZWI2M2FjIDEwMDY0NAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCisrKyBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGstc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmgKQEAgLTEsMTcgKzEsMTcgQEAKICNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KIAogI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2YXJpYW50PgogI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZhcmlhbnQ+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KICNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCkBAIC0zOCwxMCArMzgsNiBAQAogICBzdGF0aWMgY29uc3RleHByIGJvb2wgX25vdF9zZWxmID0gIXN0ZDo6aXNfc2FtZV92PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPj4sIFVuaW9uPjsKIAogICBVbmlvbigpIDogX3ZhbHVlKHN0ZDo6aW5fcGxhY2VfaW5kZXg8bnVtPiwgaW50MzJfdCg0MykpIHsgfQotICBVbmlvbihjb25zdCBVbmlvbiYpID0gZGVmYXVsdDsKLSAgVW5pb24oVW5pb24mJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbiYgb3BlcmF0b3I9KFVuaW9uJiYpID0gZGVmYXVsdDsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8X25vdF9zZWxmPF9UcD4+PgogICAvLyBOT0xJTlRORVhUTElORShnb29nbGUtZXhwbGljaXQtY29uc3RydWN0b3IpCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliYTNjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY29uc3QgY2hhciogRGF0YTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuRGF0YSI7Ci0KLWJpbmRlcl9zdGF0dXNfdCBEYXRhOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCBfYWlkbF9wYXJjZWxhYmxlX3NpemU7Ci0gIGludDMyX3QgX2FpZGxfc3RhcnRfcG9zID0gQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihwYXJjZWwsICZfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICBpZiAoX2FpZGxfc3RhcnRfcG9zID4gSU5UMzJfTUFYIC0gX2FpZGxfcGFyY2VsYWJsZV9zaXplKSByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKLSAgaWYgKF9haWRsX3BhcmNlbGFibGVfc2l6ZSA8IDApIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIGlmIChBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpIC0gX2FpZGxfc3RhcnRfcG9zID49IF9haWRsX3BhcmNlbGFibGVfc2l6ZSkgewotICAgIEFQYXJjZWxfc2V0RGF0YVBvc2l0aW9uKHBhcmNlbCwgX2FpZGxfc3RhcnRfcG9zICsgX2FpZGxfcGFyY2VsYWJsZV9zaXplKTsKLSAgICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLSAgfQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIocGFyY2VsLCAmbnVtKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRTdHJpbmcocGFyY2VsLCAmc3RyKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKHBhcmNlbCwgJm5lc3RlZFVuaW9uKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBpZiAoQVBhcmNlbF9nZXREYXRhUG9zaXRpb24ocGFyY2VsKSAtIF9haWRsX3N0YXJ0X3BvcyA+PSBfYWlkbF9wYXJjZWxhYmxlX3NpemUpIHsKLSAgICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3BvcyArIF9haWRsX3BhcmNlbGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIH0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfcmVhZEJ5dGUocGFyY2VsLCByZWludGVycHJldF9jYXN0PGludDhfdCo+KCZuZXN0ZWRFbnVtKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocGFyY2VsLCBfYWlkbF9zdGFydF9wb3MgKyBfYWlkbF9wYXJjZWxhYmxlX3NpemUpOwotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLWJpbmRlcl9zdGF0dXNfdCBEYXRhOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1czsKLSAgc2l6ZV90IF9haWRsX3N0YXJ0X3BvcyA9IEFQYXJjZWxfZ2V0RGF0YVBvc2l0aW9uKHBhcmNlbCk7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIocGFyY2VsLCAwKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUludDMyKHBhcmNlbCwgbnVtKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcocGFyY2VsLCBzdHIpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVBhcmNlbGFibGUocGFyY2VsLCBuZXN0ZWRVbmlvbik7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVCeXRlKHBhcmNlbCwgc3RhdGljX2Nhc3Q8aW50OF90PihuZXN0ZWRFbnVtKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0KLSAgc2l6ZV90IF9haWRsX2VuZF9wb3MgPSBBUGFyY2VsX2dldERhdGFQb3NpdGlvbihwYXJjZWwpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX3N0YXJ0X3Bvcyk7Ci0gIEFQYXJjZWxfd3JpdGVJbnQzMihwYXJjZWwsIF9haWRsX2VuZF9wb3MgLSBfYWlkbF9zdGFydF9wb3MpOwotICBBUGFyY2VsX3NldERhdGFQb3NpdGlvbihwYXJjZWwsIF9haWRsX2VuZF9wb3MpOwotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0RhdGEuY3BwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDM3MGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmNwcC5kCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL3Rvb2xzL2FpZGwvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5jcHAgOiBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwgXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5haWRsIFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFkN2NiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vLyBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIGFzIHBsYWNlaG9sZGVyIGZvciBlbnVtIGRlY2xhcmF0aW9uLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmNwcC5kIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9FbnVtLmNwcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTUwNjViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5jcHAuZAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uY3BwIDogXAotICBzeXN0ZW0vdG9vbHMvYWlkbC90ZXN0cy9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5haWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzVmM2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wYXJjZWxfdXRpbHMuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcExvZ2dhYmxlSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Mb2dnYWJsZUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY2xhc3MgU2NvcGVkVHJhY2UgewotICBwdWJsaWM6Ci0gIGlubGluZSBleHBsaWNpdCBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIEFUcmFjZV9iZWdpblNlY3Rpb24obmFtZSk7Ci0gIH0KLSAgaW5saW5lIH5TY29wZWRUcmFjZSgpIHsKLSAgQVRyYWNlX2VuZFNlY3Rpb24oKTsKLSAgfQotfTsKLXN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfb25UcmFuc2FjdChBSUJpbmRlciogX2FpZGxfYmluZGVyLCB0cmFuc2FjdGlvbl9jb2RlX3QgX2FpZGxfY29kZSwgY29uc3QgQVBhcmNlbCogX2FpZGxfaW4sIEFQYXJjZWwqIF9haWRsX291dCkgewotICAodm9pZClfYWlkbF9pbjsKLSAgKHZvaWQpX2FpZGxfb3V0OwotICBiaW5kZXJfc3RhdHVzX3QgX2FpZGxfcmV0X3N0YXR1cyA9IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OOwotICBzdGQ6OnNoYXJlZF9wdHI8Qm5Mb2dnYWJsZUludGVyZmFjZT4gX2FpZGxfaW1wbCA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxCbkxvZ2dhYmxlSW50ZXJmYWNlPig6Om5kazo6SUNJbnRlcmZhY2U6OmFzSW50ZXJmYWNlKF9haWRsX2JpbmRlcikpOwotICBzd2l0Y2ggKF9haWRsX2NvZGUpIHsKLSAgICBjYXNlIChGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMCAvKkxvZ1RoaXMqLyk6IHsKLSAgICAgIGJvb2wgaW5fYm9vbFZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gaW5fYm9vbEFycmF5OwotICAgICAgaW50OF90IGluX2J5dGVWYWx1ZTsKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluX2J5dGVBcnJheTsKLSAgICAgIGNoYXIxNl90IGluX2NoYXJWYWx1ZTsKLSAgICAgIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiBpbl9jaGFyQXJyYXk7Ci0gICAgICBpbnQzMl90IGluX2ludFZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW5faW50QXJyYXk7Ci0gICAgICBpbnQ2NF90IGluX2xvbmdWYWx1ZTsKLSAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGluX2xvbmdBcnJheTsKLSAgICAgIGZsb2F0IGluX2Zsb2F0VmFsdWU7Ci0gICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gaW5fZmxvYXRBcnJheTsKLSAgICAgIGRvdWJsZSBpbl9kb3VibGVWYWx1ZTsKLSAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gaW5fZG91YmxlQXJyYXk7Ci0gICAgICBzdGQ6OnN0cmluZyBpbl9zdHJpbmdWYWx1ZTsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbl9zdHJpbmdBcnJheTsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbl9saXN0VmFsdWU7Ci0gICAgICA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpEYXRhIGluX2RhdGFWYWx1ZTsKLSAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGluX2JpbmRlclZhbHVlOwotICAgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yIGluX3BmZFZhbHVlOwotICAgICAgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiBpbl9wZmRBcnJheTsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBfYWlkbF9yZXR1cm47Ci0KLSAgICAgIFNjb3BlZFRyYWNlIF9haWRsX3RyYWNlKCJBSURMOjpuZGs6OklMb2dnYWJsZUludGVyZmFjZTo6TG9nVGhpczo6c2VydmVyIik7Ci0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQm9vbChfYWlkbF9pbiwgJmluX2Jvb2xWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2Jvb2xBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQnl0ZShfYWlkbF9pbiwgJmluX2J5dGVWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2J5dGVBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkQ2hhcihfYWlkbF9pbiwgJmluX2NoYXJWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2NoYXJBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX2FpZGxfaW4sICZpbl9pbnRWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2ludEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQ2NChfYWlkbF9pbiwgJmluX2xvbmdWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX2xvbmdBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRmxvYXQoX2FpZGxfaW4sICZpbl9mbG9hdFZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fZmxvYXRBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkRG91YmxlKF9haWRsX2luLCAmaW5fZG91YmxlVmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9kb3VibGVBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfYWlkbF9pbiwgJmluX3N0cmluZ1ZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX2luLCAmaW5fc3RyaW5nQXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfaW4sICZpbl9saXN0VmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRQYXJjZWxhYmxlKF9haWRsX2luLCAmaW5fZGF0YVZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoX2FpZGxfaW4sICZpbl9iaW5kZXJWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfaW4sICZpbl9wZmRWYWx1ZSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9pbiwgJmluX3BmZEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIEJuTG9nZ2FibGVJbnRlcmZhY2U6OlRyYW5zYWN0aW9uTG9nIF90cmFuc2FjdGlvbl9sb2c7Ci0gICAgICBpZiAoQm5Mb2dnYWJsZUludGVyZmFjZTo6bG9nRnVuYyAhPSBudWxscHRyKSB7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Jvb2xWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2Jvb2xWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9ib29sQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9ib29sQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYnl0ZVZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYnl0ZVZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2J5dGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2J5dGVBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9jaGFyVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9jaGFyVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fY2hhckFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fY2hhckFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2ludFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5faW50VmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5faW50QXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9pbnRBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9sb25nVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9sb25nVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fbG9uZ0FycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fbG9uZ0FycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Zsb2F0VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9mbG9hdFZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Zsb2F0QXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9mbG9hdEFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2RvdWJsZVZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fZG91YmxlVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZG91YmxlQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9kb3VibGVBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9zdHJpbmdWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX3N0cmluZ1ZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3N0cmluZ0FycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fc3RyaW5nQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fbGlzdFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fbGlzdFZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2RhdGFWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2RhdGFWYWx1ZSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9iaW5kZXJWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2JpbmRlclZhbHVlKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fcGZkVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fcGZkQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9wZmRBcnJheSkpOwotICAgICAgfQotICAgICAgYXV0byBfbG9nX3N0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBfYWlkbF9zdGF0dXMgPSBfYWlkbF9pbXBsLT5Mb2dUaGlzKGluX2Jvb2xWYWx1ZSwgJmluX2Jvb2xBcnJheSwgaW5fYnl0ZVZhbHVlLCAmaW5fYnl0ZUFycmF5LCBpbl9jaGFyVmFsdWUsICZpbl9jaGFyQXJyYXksIGluX2ludFZhbHVlLCAmaW5faW50QXJyYXksIGluX2xvbmdWYWx1ZSwgJmluX2xvbmdBcnJheSwgaW5fZmxvYXRWYWx1ZSwgJmluX2Zsb2F0QXJyYXksIGluX2RvdWJsZVZhbHVlLCAmaW5fZG91YmxlQXJyYXksIGluX3N0cmluZ1ZhbHVlLCAmaW5fc3RyaW5nQXJyYXksICZpbl9saXN0VmFsdWUsIGluX2RhdGFWYWx1ZSwgaW5fYmluZGVyVmFsdWUsICZpbl9wZmRWYWx1ZSwgJmluX3BmZEFycmF5LCAmX2FpZGxfcmV0dXJuKTsKLSAgICAgIGlmIChCbkxvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKLSAgICAgICAgYXV0byBfbG9nX2VuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmR1cmF0aW9uX21zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4oX2xvZ19lbmQgLSBfbG9nX3N0YXJ0KS5jb3VudCgpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLmludGVyZmFjZV9uYW1lID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UiOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm1ldGhvZF9uYW1lID0gIkxvZ1RoaXMiOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLnN0dWJfYWRkcmVzcyA9IF9haWRsX2ltcGwuZ2V0KCk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cucHJveHlfYWRkcmVzcyA9IG51bGxwdHI7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cuZXhjZXB0aW9uX2NvZGUgPSBBU3RhdHVzX2dldEV4Y2VwdGlvbkNvZGUoX2FpZGxfc3RhdHVzLmdldCgpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5leGNlcHRpb25fbWVzc2FnZSA9IEFTdGF0dXNfZ2V0TWVzc2FnZShfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLnRyYW5zYWN0aW9uX2Vycm9yID0gQVN0YXR1c19nZXRTdGF0dXMoX2FpZGxfc3RhdHVzLmdldCgpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5zZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGUgPSBBU3RhdHVzX2dldFNlcnZpY2VTcGVjaWZpY0Vycm9yKF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9ib29sQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9ib29sQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2J5dGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2J5dGVBcnJheSkpOwotICAgICAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fY2hhckFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fY2hhckFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9pbnRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2ludEFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9sb25nQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9sb25nQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Zsb2F0QXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9mbG9hdEFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9kb3VibGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2RvdWJsZUFycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9zdHJpbmdBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX3N0cmluZ0FycmF5KSk7Ci0gICAgICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9saXN0VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9saXN0VmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fcGZkVmFsdWUpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fcGZkQXJyYXkpKTsKLSAgICAgICAgX3RyYW5zYWN0aW9uX2xvZy5yZXN1bHQgPSA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhfYWlkbF9yZXR1cm4pOwotICAgICAgICBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jKF90cmFuc2FjdGlvbl9sb2cpOwotICAgICAgfQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVTdGF0dXNIZWFkZXIoX2FpZGxfb3V0LCBfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgaWYgKCFBU3RhdHVzX2lzT2soX2FpZGxfc3RhdHVzLmdldCgpKSkgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIF9haWRsX3JldHVybik7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9ib29sQXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fYnl0ZUFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX2NoYXJBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9pbnRBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9sb25nQXJyYXkpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX291dCwgaW5fZmxvYXRBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9kb3VibGVBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9zdHJpbmdBcnJheSk7Ci0gICAgICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGJyZWFrOwotCi0gICAgICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfb3V0LCBpbl9saXN0VmFsdWUpOwotICAgICAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBicmVhazsKLQotICAgICAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVQYXJjZWxGaWxlRGVzY3JpcHRvcihfYWlkbF9vdXQsIGluX3BmZFZhbHVlKTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9vdXQsIGluX3BmZEFycmF5KTsKLSAgICAgIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgYnJlYWs7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gX2FpZGxfcmV0X3N0YXR1czsKLX0KLQotc3RhdGljIEFJQmluZGVyX0NsYXNzKiBfZ19haWRsX2NsYXp6ID0gOjpuZGs6OklDSW50ZXJmYWNlOjpkZWZpbmVDbGFzcyhJTG9nZ2FibGVJbnRlcmZhY2U6OmRlc2NyaXB0b3IsIF9haWRsX29uVHJhbnNhY3QpOwotCi1CcExvZ2dhYmxlSW50ZXJmYWNlOjpCcExvZ2dhYmxlSW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIDogQnBDSW50ZXJmYWNlKGJpbmRlcikge30KLUJwTG9nZ2FibGVJbnRlcmZhY2U6On5CcExvZ2dhYmxlSW50ZXJmYWNlKCkge30KLXN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBCcExvZ2dhYmxlSW50ZXJmYWNlOjpUcmFuc2FjdGlvbkxvZyYpPiBCcExvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jOwotCi06Om5kazo6U2NvcGVkQVN0YXR1cyBCcExvZ2dhYmxlSW50ZXJmYWNlOjpMb2dUaGlzKGJvb2wgaW5fYm9vbFZhbHVlLCBzdGQ6OnZlY3Rvcjxib29sPiogaW5fYm9vbEFycmF5LCBpbnQ4X3QgaW5fYnl0ZVZhbHVlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogaW5fYnl0ZUFycmF5LCBjaGFyMTZfdCBpbl9jaGFyVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogaW5fY2hhckFycmF5LCBpbnQzMl90IGluX2ludFZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogaW5faW50QXJyYXksIGludDY0X3QgaW5fbG9uZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogaW5fbG9uZ0FycmF5LCBmbG9hdCBpbl9mbG9hdFZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIGluX2Zsb2F0QXJyYXksIGRvdWJsZSBpbl9kb3VibGVWYWx1ZSwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogaW5fZG91YmxlQXJyYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9zdHJpbmdWYWx1ZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9zdHJpbmdBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9saXN0VmFsdWUsIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEmIGluX2RhdGFWYWx1ZSwgY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2JpbmRlclZhbHVlLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIGluX3BmZFZhbHVlLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBpbl9wZmRBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIHsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBTVEFUVVNfT0s7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKLSAgOjpuZGs6OlNjb3BlZEFQYXJjZWwgX2FpZGxfaW47Ci0gIDo6bmRrOjpTY29wZWRBUGFyY2VsIF9haWRsX291dDsKLQotICBCcExvZ2dhYmxlSW50ZXJmYWNlOjpUcmFuc2FjdGlvbkxvZyBfdHJhbnNhY3Rpb25fbG9nOwotICBpZiAoQnBMb2dnYWJsZUludGVyZmFjZTo6bG9nRnVuYyAhPSBudWxscHRyKSB7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYm9vbFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYm9vbFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fYm9vbEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2Jvb2xBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2J5dGVWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2J5dGVWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2J5dGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9ieXRlQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9jaGFyVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9jaGFyVmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9jaGFyQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fY2hhckFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5faW50VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9pbnRWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2ludEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2ludEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fbG9uZ1ZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fbG9uZ1ZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fbG9uZ0FycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2xvbmdBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Zsb2F0VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9mbG9hdFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZmxvYXRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9mbG9hdEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fZG91YmxlVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9kb3VibGVWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2RvdWJsZUFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2RvdWJsZUFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fc3RyaW5nVmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZyhpbl9zdHJpbmdWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3N0cmluZ0FycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX3N0cmluZ0FycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5pbnB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fbGlzdFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2xpc3RWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2RhdGFWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGluX2RhdGFWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2JpbmRlclZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoaW5fYmluZGVyVmFsdWUpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmlucHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9wZmRWYWx1ZSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9wZmRWYWx1ZSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuaW5wdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX3BmZEFycmF5KSk7Ci0gIH0KLSAgYXV0byBfbG9nX3N0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIFNjb3BlZFRyYWNlIF9haWRsX3RyYWNlKCJBSURMOjpuZGs6OklMb2dnYWJsZUludGVyZmFjZTo6TG9nVGhpczo6Y2xpZW50Iik7Ci0gIF9haWRsX3JldF9zdGF0dXMgPSBBSUJpbmRlcl9wcmVwYXJlVHJhbnNhY3Rpb24oYXNCaW5kZXIoKS5nZXQoKSwgX2FpZGxfaW4uZ2V0UigpKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlQm9vbChfYWlkbF9pbi5nZXQoKSwgaW5fYm9vbFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2Jvb2xBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF93cml0ZUJ5dGUoX2FpZGxfaW4uZ2V0KCksIGluX2J5dGVWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9ieXRlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVDaGFyKF9haWRsX2luLmdldCgpLCBpbl9jaGFyVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlVmVjdG9yKF9haWRsX2luLmdldCgpLCAqaW5fY2hhckFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX2FpZGxfaW4uZ2V0KCksIGluX2ludFZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2ludEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50NjQoX2FpZGxfaW4uZ2V0KCksIGluX2xvbmdWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9sb25nQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IEFQYXJjZWxfd3JpdGVGbG9hdChfYWlkbF9pbi5nZXQoKSwgaW5fZmxvYXRWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9mbG9hdEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlRG91YmxlKF9haWRsX2luLmdldCgpLCBpbl9kb3VibGVWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9kb3VibGVBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVTdHJpbmcoX2FpZGxfaW4uZ2V0KCksIGluX3N0cmluZ1ZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX3N0cmluZ0FycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZVZlY3RvcihfYWlkbF9pbi5nZXQoKSwgKmluX2xpc3RWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVQYXJjZWxhYmxlKF9haWRsX2luLmdldCgpLCBpbl9kYXRhVmFsdWUpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3dyaXRlTnVsbGFibGVTdHJvbmdCaW5kZXIoX2FpZGxfaW4uZ2V0KCksIGluX2JpbmRlclZhbHVlKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF93cml0ZU51bGxhYmxlUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9wZmRWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfd3JpdGVWZWN0b3IoX2FpZGxfaW4uZ2V0KCksICppbl9wZmRBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQUlCaW5kZXJfdHJhbnNhY3QoCi0gICAgYXNCaW5kZXIoKS5nZXQoKSwKLSAgICAoRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDAgLypMb2dUaGlzKi8pLAotICAgIF9haWRsX2luLmdldFIoKSwKLSAgICBfYWlkbF9vdXQuZ2V0UigpLAotICAgIDAKLSAgICAjaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0gICAgfCBGTEFHX1BSSVZBVEVfTE9DQUwKLSAgICAjZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotICAgICk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzID09IFNUQVRVU19VTktOT1dOX1RSQU5TQUNUSU9OICYmIElMb2dnYWJsZUludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKSkgewotICAgIF9haWRsX3N0YXR1cyA9IElMb2dnYWJsZUludGVyZmFjZTo6Z2V0RGVmYXVsdEltcGwoKS0+TG9nVGhpcyhpbl9ib29sVmFsdWUsIGluX2Jvb2xBcnJheSwgaW5fYnl0ZVZhbHVlLCBpbl9ieXRlQXJyYXksIGluX2NoYXJWYWx1ZSwgaW5fY2hhckFycmF5LCBpbl9pbnRWYWx1ZSwgaW5faW50QXJyYXksIGluX2xvbmdWYWx1ZSwgaW5fbG9uZ0FycmF5LCBpbl9mbG9hdFZhbHVlLCBpbl9mbG9hdEFycmF5LCBpbl9kb3VibGVWYWx1ZSwgaW5fZG91YmxlQXJyYXksIGluX3N0cmluZ1ZhbHVlLCBpbl9zdHJpbmdBcnJheSwgaW5fbGlzdFZhbHVlLCBpbl9kYXRhVmFsdWUsIGluX2JpbmRlclZhbHVlLCBpbl9wZmRWYWx1ZSwgaW5fcGZkQXJyYXksIF9haWRsX3JldHVybik7Ci0gICAgZ290byBfYWlkbF9zdGF0dXNfcmV0dXJuOwotICB9Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkU3RhdHVzSGVhZGVyKF9haWRsX291dC5nZXQoKSwgX2FpZGxfc3RhdHVzLmdldFIoKSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBpZiAoIUFTdGF0dXNfaXNPayhfYWlkbF9zdGF0dXMuZ2V0KCkpKSBnb3RvIF9haWRsX3N0YXR1c19yZXR1cm47Ci0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgX2FpZGxfcmV0dXJuKTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fYm9vbEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fYnl0ZUFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fY2hhckFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5faW50QXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9sb25nQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9mbG9hdEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX3JldF9zdGF0dXMgPSA6Om5kazo6QVBhcmNlbF9yZWFkVmVjdG9yKF9haWRsX291dC5nZXQoKSwgaW5fZG91YmxlQXJyYXkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIGdvdG8gX2FpZGxfZXJyb3I7Ci0KLSAgX2FpZGxfcmV0X3N0YXR1cyA9IDo6bmRrOjpBUGFyY2VsX3JlYWRWZWN0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9zdHJpbmdBcnJheSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX2xpc3RWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZE51bGxhYmxlUGFyY2VsRmlsZURlc2NyaXB0b3IoX2FpZGxfb3V0LmdldCgpLCBpbl9wZmRWYWx1ZSk7Ci0gIGlmIChfYWlkbF9yZXRfc3RhdHVzICE9IFNUQVRVU19PSykgZ290byBfYWlkbF9lcnJvcjsKLQotICBfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFZlY3RvcihfYWlkbF9vdXQuZ2V0KCksIGluX3BmZEFycmF5KTsKLSAgaWYgKF9haWRsX3JldF9zdGF0dXMgIT0gU1RBVFVTX09LKSBnb3RvIF9haWRsX2Vycm9yOwotCi0gIF9haWRsX2Vycm9yOgotICBfYWlkbF9zdGF0dXMuc2V0KEFTdGF0dXNfZnJvbVN0YXR1cyhfYWlkbF9yZXRfc3RhdHVzKSk7Ci0gIF9haWRsX3N0YXR1c19yZXR1cm46Ci0gIGlmIChCcExvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jICE9IG51bGxwdHIpIHsKLSAgICBhdXRvIF9sb2dfZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5kdXJhdGlvbl9tcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KF9sb2dfZW5kIC0gX2xvZ19zdGFydCkuY291bnQoKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmludGVyZmFjZV9uYW1lID0gImFuZHJvaWQuYWlkbC5sb2dnYWJsZS5JTG9nZ2FibGVJbnRlcmZhY2UiOwotICAgIF90cmFuc2FjdGlvbl9sb2cubWV0aG9kX25hbWUgPSAiTG9nVGhpcyI7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5zdHViX2FkZHJlc3MgPSBudWxscHRyOwotICAgIF90cmFuc2FjdGlvbl9sb2cucHJveHlfYWRkcmVzcyA9IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0aGlzKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLmV4Y2VwdGlvbl9jb2RlID0gQVN0YXR1c19nZXRFeGNlcHRpb25Db2RlKF9haWRsX3N0YXR1cy5nZXQoKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5leGNlcHRpb25fbWVzc2FnZSA9IEFTdGF0dXNfZ2V0TWVzc2FnZShfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cudHJhbnNhY3Rpb25fZXJyb3IgPSBBU3RhdHVzX2dldFN0YXR1cyhfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cuc2VydmljZV9zcGVjaWZpY19lcnJvcl9jb2RlID0gQVN0YXR1c19nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcihfYWlkbF9zdGF0dXMuZ2V0KCkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9ib29sQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fYm9vbEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2J5dGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9ieXRlQXJyYXkpKTsKLSAgICBfdHJhbnNhY3Rpb25fbG9nLm91dHB1dF9hcmdzLmVtcGxhY2VfYmFjaygiaW5fY2hhckFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX2NoYXJBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9pbnRBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9pbnRBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9sb25nQXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fbG9uZ0FycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX2Zsb2F0QXJyYXkiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fZmxvYXRBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9kb3VibGVBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9kb3VibGVBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9zdHJpbmdBcnJheSIsIDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKCppbl9zdHJpbmdBcnJheSkpOwotICAgIF90cmFuc2FjdGlvbl9sb2cub3V0cHV0X2FyZ3MuZW1wbGFjZV9iYWNrKCJpbl9saXN0VmFsdWUiLCA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqaW5fbGlzdFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZFZhbHVlIiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX3BmZFZhbHVlKSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5vdXRwdXRfYXJncy5lbXBsYWNlX2JhY2soImluX3BmZEFycmF5IiwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoKmluX3BmZEFycmF5KSk7Ci0gICAgX3RyYW5zYWN0aW9uX2xvZy5yZXN1bHQgPSA6OmFuZHJvaWQ6OmludGVybmFsOjpUb1N0cmluZygqX2FpZGxfcmV0dXJuKTsKLSAgICBCcExvZ2dhYmxlSW50ZXJmYWNlOjpsb2dGdW5jKF90cmFuc2FjdGlvbl9sb2cpOwotICB9Ci0gIHJldHVybiBfYWlkbF9zdGF0dXM7Ci19Ci0vLyBTb3VyY2UgZm9yIEJuTG9nZ2FibGVJbnRlcmZhY2UKLUJuTG9nZ2FibGVJbnRlcmZhY2U6OkJuTG9nZ2FibGVJbnRlcmZhY2UoKSB7fQotQm5Mb2dnYWJsZUludGVyZmFjZTo6fkJuTG9nZ2FibGVJbnRlcmZhY2UoKSB7fQotc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJuTG9nZ2FibGVJbnRlcmZhY2U6OlRyYW5zYWN0aW9uTG9nJik+IEJuTG9nZ2FibGVJbnRlcmZhY2U6OmxvZ0Z1bmM7Ci06Om5kazo6U3BBSUJpbmRlciBCbkxvZ2dhYmxlSW50ZXJmYWNlOjpjcmVhdGVCaW5kZXIoKSB7Ci0gIEFJQmluZGVyKiBiaW5kZXIgPSBBSUJpbmRlcl9uZXcoX2dfYWlkbF9jbGF6eiwgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKLSAgI2lmZGVmIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotICBBSUJpbmRlcl9tYXJrQ29tcGlsYXRpb25Vbml0U3RhYmlsaXR5KGJpbmRlcik7Ci0gICNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0gIHJldHVybiA6Om5kazo6U3BBSUJpbmRlcihiaW5kZXIpOwotfQotLy8gU291cmNlIGZvciBJTG9nZ2FibGVJbnRlcmZhY2UKLWNvbnN0IGNoYXIqIElMb2dnYWJsZUludGVyZmFjZTo6ZGVzY3JpcHRvciA9ICJhbmRyb2lkLmFpZGwubG9nZ2FibGUuSUxvZ2dhYmxlSW50ZXJmYWNlIjsKLUlMb2dnYWJsZUludGVyZmFjZTo6SUxvZ2dhYmxlSW50ZXJmYWNlKCkge30KLUlMb2dnYWJsZUludGVyZmFjZTo6fklMb2dnYWJsZUludGVyZmFjZSgpIHt9Ci0KLQotc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZT4gSUxvZ2dhYmxlSW50ZXJmYWNlOjpmcm9tQmluZGVyKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpIHsKLSAgaWYgKCFBSUJpbmRlcl9hc3NvY2lhdGVDbGFzcyhiaW5kZXIuZ2V0KCksIF9nX2FpZGxfY2xhenopKSB7IHJldHVybiBudWxscHRyOyB9Ci0gIHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6SUNJbnRlcmZhY2U+IGludGVyZmFjZSA9IDo6bmRrOjpJQ0ludGVyZmFjZTo6YXNJbnRlcmZhY2UoYmluZGVyLmdldCgpKTsKLSAgaWYgKGludGVyZmFjZSkgewotICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SUxvZ2dhYmxlSW50ZXJmYWNlPihpbnRlcmZhY2UpOwotICB9Ci0gIHJldHVybiA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxCcExvZ2dhYmxlSW50ZXJmYWNlPihiaW5kZXIpOwotfQotCi1iaW5kZXJfc3RhdHVzX3QgSUxvZ2dhYmxlSW50ZXJmYWNlOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIHBhcmNlbCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElMb2dnYWJsZUludGVyZmFjZT4mIGluc3RhbmNlKSB7Ci0gIHJldHVybiBBUGFyY2VsX3dyaXRlU3Ryb25nQmluZGVyKHBhcmNlbCwgaW5zdGFuY2UgPyBpbnN0YW5jZS0+YXNCaW5kZXIoKS5nZXQoKSA6IG51bGxwdHIpOwotfQotYmluZGVyX3N0YXR1c190IElMb2dnYWJsZUludGVyZmFjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiogaW5zdGFuY2UpIHsKLSAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyOwotICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gQVBhcmNlbF9yZWFkU3Ryb25nQmluZGVyKHBhcmNlbCwgYmluZGVyLmdldFIoKSk7Ci0gIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOwotICAqaW5zdGFuY2UgPSBJTG9nZ2FibGVJbnRlcmZhY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKLSAgcmV0dXJuIFNUQVRVU19PSzsKLX0KLWJvb2wgSUxvZ2dhYmxlSW50ZXJmYWNlOjpzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiYgaW1wbCkgewotICAvLyBPbmx5IG9uZSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhpcyBmdW5jdGlvbgotICAvLyBhdCBhIHRpbWUuIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZGV0ZWN0IGlmIHR3byBkaWZmZXJlbnQKLSAgLy8gdXNlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB1c2UgdGhpcyBmdW5jdGlvbi4KLSAgYXNzZXJ0KCFJTG9nZ2FibGVJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCk7Ci0gIGlmIChpbXBsKSB7Ci0gICAgSUxvZ2dhYmxlSW50ZXJmYWNlOjpkZWZhdWx0X2ltcGwgPSBpbXBsOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLWNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+JiBJTG9nZ2FibGVJbnRlcmZhY2U6OmdldERlZmF1bHRJbXBsKCkgewotICByZXR1cm4gSUxvZ2dhYmxlSW50ZXJmYWNlOjpkZWZhdWx0X2ltcGw7Ci19Ci1zdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiBJTG9nZ2FibGVJbnRlcmZhY2U6OmRlZmF1bHRfaW1wbCA9IG51bGxwdHI7Ci06Om5kazo6U2NvcGVkQVN0YXR1cyBJTG9nZ2FibGVJbnRlcmZhY2VEZWZhdWx0OjpMb2dUaGlzKGJvb2wgLyppbl9ib29sVmFsdWUqLywgc3RkOjp2ZWN0b3I8Ym9vbD4qIC8qaW5fYm9vbEFycmF5Ki8sIGludDhfdCAvKmluX2J5dGVWYWx1ZSovLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogLyppbl9ieXRlQXJyYXkqLywgY2hhcjE2X3QgLyppbl9jaGFyVmFsdWUqLywgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+KiAvKmluX2NoYXJBcnJheSovLCBpbnQzMl90IC8qaW5faW50VmFsdWUqLywgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIC8qaW5faW50QXJyYXkqLywgaW50NjRfdCAvKmluX2xvbmdWYWx1ZSovLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogLyppbl9sb25nQXJyYXkqLywgZmxvYXQgLyppbl9mbG9hdFZhbHVlKi8sIHN0ZDo6dmVjdG9yPGZsb2F0PiogLyppbl9mbG9hdEFycmF5Ki8sIGRvdWJsZSAvKmluX2RvdWJsZVZhbHVlKi8sIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIC8qaW5fZG91YmxlQXJyYXkqLywgY29uc3Qgc3RkOjpzdHJpbmcmIC8qaW5fc3RyaW5nVmFsdWUqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKmluX3N0cmluZ0FycmF5Ki8sIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogLyppbl9saXN0VmFsdWUqLywgY29uc3QgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6RGF0YSYgLyppbl9kYXRhVmFsdWUqLywgY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIC8qaW5fYmluZGVyVmFsdWUqLywgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiAvKmluX3BmZFZhbHVlKi8sIHN0ZDo6dmVjdG9yPDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvcj4qIC8qaW5fcGZkQXJyYXkqLywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiAvKl9haWRsX3JldHVybiovKSB7Ci0gIDo6bmRrOjpTY29wZWRBU3RhdHVzIF9haWRsX3N0YXR1czsKLSAgX2FpZGxfc3RhdHVzLnNldChBU3RhdHVzX2Zyb21TdGF0dXMoU1RBVFVTX1VOS05PV05fVFJBTlNBQ1RJT04pKTsKLSAgcmV0dXJuIF9haWRsX3N0YXR1czsKLX0KLTo6bmRrOjpTcEFJQmluZGVyIElMb2dnYWJsZUludGVyZmFjZURlZmF1bHQ6OmFzQmluZGVyKCkgewotICByZXR1cm4gOjpuZGs6OlNwQUlCaW5kZXIoKTsKLX0KLWJvb2wgSUxvZ2dhYmxlSW50ZXJmYWNlRGVmYXVsdDo6aXNSZW1vdGUoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuY3BwLmQgYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxNmRjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAuZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5jcHAgOiBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuYWlkbCBcCi0gIHN5c3RlbS90b29scy9haWRsL3Rlc3RzL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDJkNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jaW5jbHVkZSAiYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbF91dGlscy5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY29uc3QgY2hhciogVW5pb246OmRlc2NyaXB0b3IgPSAiYW5kcm9pZC5haWRsLmxvZ2dhYmxlLlVuaW9uIjsKLQotYmluZGVyX3N0YXR1c190IFVuaW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBBUGFyY2VsKiBfcGFyY2VsKSB7Ci0gIGJpbmRlcl9zdGF0dXNfdCBfYWlkbF9yZXRfc3RhdHVzOwotICBpbnQzMl90IF9haWRsX3RhZzsKLSAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gQVBhcmNlbF9yZWFkSW50MzIoX3BhcmNlbCwgJl9haWRsX3RhZykpICE9IFNUQVRVU19PSykgcmV0dXJuIF9haWRsX3JldF9zdGF0dXM7Ci0gIHN3aXRjaCAoX2FpZGxfdGFnKSB7Ci0gIGNhc2UgbnVtOiB7Ci0gICAgaW50MzJfdCBfYWlkbF92YWx1ZTsKLSAgICBpZiAoKF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3JlYWRJbnQzMihfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxpbnQzMl90PikgewotICAgICAgc2V0PG51bT4oX2FpZGxfdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOT0xJTlRORVhUTElORShwZXJmb3JtYW5jZS1tb3ZlLWNvbnN0LWFyZykKLSAgICAgIHNldDxudW0+KHN0ZDo6bW92ZShfYWlkbF92YWx1ZSkpOwotICAgIH0KLSAgICByZXR1cm4gU1RBVFVTX09LOyB9Ci0gIGNhc2Ugc3RyOiB7Ci0gICAgc3RkOjpzdHJpbmcgX2FpZGxfdmFsdWU7Ci0gICAgaWYgKChfYWlkbF9yZXRfc3RhdHVzID0gOjpuZGs6OkFQYXJjZWxfcmVhZFN0cmluZyhfcGFyY2VsLCAmX2FpZGxfdmFsdWUpKSAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxzdGQ6OnN0cmluZz4pIHsKLSAgICAgIHNldDxzdHI+KF9haWRsX3ZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2UtbW92ZS1jb25zdC1hcmcpCi0gICAgICBzZXQ8c3RyPihzdGQ6Om1vdmUoX2FpZGxfdmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNUQVRVU19PSzsgfQotICB9Ci0gIHJldHVybiBTVEFUVVNfQkFEX1ZBTFVFOwotfQotYmluZGVyX3N0YXR1c190IFVuaW9uOjp3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9wYXJjZWwpIGNvbnN0IHsKLSAgYmluZGVyX3N0YXR1c190IF9haWRsX3JldF9zdGF0dXMgPSBBUGFyY2VsX3dyaXRlSW50MzIoX3BhcmNlbCwgZ2V0VGFnKCkpOwotICBpZiAoX2FpZGxfcmV0X3N0YXR1cyAhPSBTVEFUVVNfT0spIHJldHVybiBfYWlkbF9yZXRfc3RhdHVzOwotICBzd2l0Y2ggKGdldFRhZygpKSB7Ci0gIGNhc2UgbnVtOiByZXR1cm4gQVBhcmNlbF93cml0ZUludDMyKF9wYXJjZWwsIGdldDxudW0+KCkpOwotICBjYXNlIHN0cjogcmV0dXJuIDo6bmRrOjpBUGFyY2VsX3dyaXRlU3RyaW5nKF9wYXJjZWwsIGdldDxzdHI+KCkpOwotICB9Ci0gIF9fYXNzZXJ0MihfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sICJjYW4ndCByZWFjaCBoZXJlIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAuZCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uY3BwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Njg3NTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5jcHAuZAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS90b29scy9haWRsL2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmNwcCA6IFwKLSAgc3lzdGVtL3Rvb2xzL2FpZGwvdGVzdHMvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL1VuaW9uLmFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuRGF0YS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5EYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTExMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBibiBjbGFzc2VzCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuRW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODViYmM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuRW51bS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuTG9nZ2FibGVJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwY2E4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CbkxvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY2xhc3MgQm5Mb2dnYWJsZUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6Qm5DSW50ZXJmYWNlPElMb2dnYWJsZUludGVyZmFjZT4gewotcHVibGljOgotICBCbkxvZ2dhYmxlSW50ZXJmYWNlKCk7Ci0gIHZpcnR1YWwgfkJuTG9nZ2FibGVJbnRlcmZhY2UoKTsKLSAgc3RydWN0IFRyYW5zYWN0aW9uTG9nIHsKLSAgICBkb3VibGUgZHVyYXRpb25fbXM7Ci0gICAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlX25hbWU7Ci0gICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWU7Ci0gICAgY29uc3Qgdm9pZCogcHJveHlfYWRkcmVzczsKLSAgICBjb25zdCB2b2lkKiBzdHViX2FkZHJlc3M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGlucHV0X2FyZ3M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IG91dHB1dF9hcmdzOwotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25fbWVzc2FnZTsKLSAgICBpbnQzMl90IGV4Y2VwdGlvbl9jb2RlOwotICAgIGludDMyX3QgdHJhbnNhY3Rpb25fZXJyb3I7Ci0gICAgaW50MzJfdCBzZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGU7Ci0gIH07Ci0gIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYzsKLXByb3RlY3RlZDoKLSAgOjpuZGs6OlNwQUlCaW5kZXIgY3JlYXRlQmluZGVyKCkgb3ZlcnJpZGU7Ci1wcml2YXRlOgotfTsKLX0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQm5Vbmlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkxMTA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JuVW5pb24uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNlcnJvciBUT0RPKGIvMTExMzYyNTkzKSBkZWZpbmVkX3R5cGVzIGRvIG5vdCBoYXZlIGJuIGNsYXNzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwRGF0YS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTBkYjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvQnBEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcEVudW0uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwRW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGEyYzZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwRW51bS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2Vycm9yIFRPRE8oYi8xMTEzNjI1OTMpIGVudW1zIGRvIG5vdCBoYXZlIGJwIGNsYXNzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwTG9nZ2FibGVJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmYzU3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcExvZ2dhYmxlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8YW5kcm9pZC90cmFjZS5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY2xhc3MgQnBMb2dnYWJsZUludGVyZmFjZSA6IHB1YmxpYyA6Om5kazo6QnBDSW50ZXJmYWNlPElMb2dnYWJsZUludGVyZmFjZT4gewotcHVibGljOgotICBleHBsaWNpdCBCcExvZ2dhYmxlSW50ZXJmYWNlKGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBiaW5kZXIpOwotICB2aXJ0dWFsIH5CcExvZ2dhYmxlSW50ZXJmYWNlKCk7Ci0KLSAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgTG9nVGhpcyhib29sIGluX2Jvb2xWYWx1ZSwgc3RkOjp2ZWN0b3I8Ym9vbD4qIGluX2Jvb2xBcnJheSwgaW50OF90IGluX2J5dGVWYWx1ZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGluX2J5dGVBcnJheSwgY2hhcjE2X3QgaW5fY2hhclZhbHVlLCBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4qIGluX2NoYXJBcnJheSwgaW50MzJfdCBpbl9pbnRWYWx1ZSwgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIGluX2ludEFycmF5LCBpbnQ2NF90IGluX2xvbmdWYWx1ZSwgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIGluX2xvbmdBcnJheSwgZmxvYXQgaW5fZmxvYXRWYWx1ZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+KiBpbl9mbG9hdEFycmF5LCBkb3VibGUgaW5fZG91YmxlVmFsdWUsIHN0ZDo6dmVjdG9yPGRvdWJsZT4qIGluX2RvdWJsZUFycmF5LCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fc3RyaW5nVmFsdWUsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5fc3RyaW5nQXJyYXksIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5fbGlzdFZhbHVlLCBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpEYXRhJiBpbl9kYXRhVmFsdWUsIGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9iaW5kZXJWYWx1ZSwgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBpbl9wZmRWYWx1ZSwgc3RkOjp2ZWN0b3I8OjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yPiogaW5fcGZkQXJyYXksIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgc3RydWN0IFRyYW5zYWN0aW9uTG9nIHsKLSAgICBkb3VibGUgZHVyYXRpb25fbXM7Ci0gICAgc3RkOjpzdHJpbmcgaW50ZXJmYWNlX25hbWU7Ci0gICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWU7Ci0gICAgY29uc3Qgdm9pZCogcHJveHlfYWRkcmVzczsKLSAgICBjb25zdCB2b2lkKiBzdHViX2FkZHJlc3M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGlucHV0X2FyZ3M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IG91dHB1dF9hcmdzOwotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBzdGQ6OnN0cmluZyBleGNlcHRpb25fbWVzc2FnZTsKLSAgICBpbnQzMl90IGV4Y2VwdGlvbl9jb2RlOwotICAgIGludDMyX3QgdHJhbnNhY3Rpb25fZXJyb3I7Ci0gICAgaW50MzJfdCBzZXJ2aWNlX3NwZWNpZmljX2Vycm9yX2NvZGU7Ci0gIH07Ci0gIHN0YXRpYyBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVHJhbnNhY3Rpb25Mb2cmKT4gbG9nRnVuYzsKLX07Ci19ICAvLyBuYW1lc3BhY2UgbG9nZ2FibGUKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwVW5pb24uaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0JwVW5pb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhMGRiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9CcFVuaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZXJyb3IgVE9ETyhiLzExMTM2MjU5MykgZGVmaW5lZF90eXBlcyBkbyBub3QgaGF2ZSBicCBjbGFzc2VzCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmggYi90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9EYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzc4OGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaW50ZXJmYWNlX3V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcGFyY2VsYWJsZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3RvX3N0cmluZy5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+Ci0jZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oPgotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGxvZ2dhYmxlIHsKLWNsYXNzIERhdGEgewotcHVibGljOgotICB0eXBlZGVmIHN0ZDo6ZmFsc2VfdHlwZSBmaXhlZF9zaXplOwotICBzdGF0aWMgY29uc3QgY2hhciogZGVzY3JpcHRvcjsKLQotICBpbnQzMl90IG51bSA9IDA7Ci0gIHN0ZDo6c3RyaW5nIHN0cjsKLSAgOjphaWRsOjphbmRyb2lkOjphaWRsOjpsb2dnYWJsZTo6VW5pb24gbmVzdGVkVW5pb247Ci0gIDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW0gbmVzdGVkRW51bSA9IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW06OkZPTzsKLQotICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsKTsKLSAgYmluZGVyX3N0YXR1c190IHdyaXRlVG9QYXJjZWwoQVBhcmNlbCogcGFyY2VsKSBjb25zdDsKLQotICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERhdGEmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShudW0sIHN0ciwgbmVzdGVkVW5pb24sIG5lc3RlZEVudW0pICE9IHN0ZDo6dGllKHJocy5udW0sIHJocy5zdHIsIHJocy5uZXN0ZWRVbmlvbiwgcmhzLm5lc3RlZEVudW0pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEYXRhJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUobnVtLCBzdHIsIG5lc3RlZFVuaW9uLCBuZXN0ZWRFbnVtKSA8IHN0ZDo6dGllKHJocy5udW0sIHJocy5zdHIsIHJocy5uZXN0ZWRVbmlvbiwgcmhzLm5lc3RlZEVudW0pOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRGF0YSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKG51bSwgc3RyLCBuZXN0ZWRVbmlvbiwgbmVzdGVkRW51bSkgPD0gc3RkOjp0aWUocmhzLm51bSwgcmhzLnN0ciwgcmhzLm5lc3RlZFVuaW9uLCByaHMubmVzdGVkRW51bSk7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEYXRhJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aWUobnVtLCBzdHIsIG5lc3RlZFVuaW9uLCBuZXN0ZWRFbnVtKSA9PSBzdGQ6OnRpZShyaHMubnVtLCByaHMuc3RyLCByaHMubmVzdGVkVW5pb24sIHJocy5uZXN0ZWRFbnVtKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRGF0YSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKG51bSwgc3RyLCBuZXN0ZWRVbmlvbiwgbmVzdGVkRW51bSkgPiBzdGQ6OnRpZShyaHMubnVtLCByaHMuc3RyLCByaHMubmVzdGVkVW5pb24sIHJocy5uZXN0ZWRFbnVtKTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IERhdGEmIHJocykgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnRpZShudW0sIHN0ciwgbmVzdGVkVW5pb24sIG5lc3RlZEVudW0pID49IHN0ZDo6dGllKHJocy5udW0sIHJocy5zdHIsIHJocy5uZXN0ZWRVbmlvbiwgcmhzLm5lc3RlZEVudW0pOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6bmRrOjpwYXJjZWxhYmxlX3N0YWJpbGl0eV90IF9haWRsX3N0YWJpbGl0eSA9IDo6bmRrOjpTVEFCSUxJVFlfTE9DQUw7Ci0gIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7Ci0gICAgb3MgPDwgIkRhdGF7IjsKLSAgICBvcyA8PCAibnVtOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKG51bSk7Ci0gICAgb3MgPDwgIiwgc3RyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKHN0cik7Ci0gICAgb3MgPDwgIiwgbmVzdGVkVW5pb246ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobmVzdGVkVW5pb24pOwotICAgIG9zIDw8ICIsIG5lc3RlZEVudW06ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcobmVzdGVkRW51bSk7Ci0gICAgb3MgPDwgIn0iOwotICAgIHJldHVybiBvcy5zdHIoKTsKLSAgfQotfTsKLX0gIC8vIG5hbWVzcGFjZSBsb2dnYWJsZQotfSAgLy8gbmFtZXNwYWNlIGFpZGwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi19ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjAyMDgwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0VudW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfZW51bXMuaD4KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1lbnVtIGNsYXNzIEVudW0gOiBpbnQ4X3QgewotICBGT08gPSA0MiwKLX07Ci0KLVtbbm9kaXNjYXJkXV0gc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhFbnVtIHZhbCkgewotICBzd2l0Y2godmFsKSB7Ci0gIGNhc2UgRW51bTo6Rk9POgotICAgIHJldHVybiAiRk9PIjsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWwpKTsKLSAgfQotfQotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCi1uYW1lc3BhY2UgbmRrIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTctZXh0ZW5zaW9ucyIKLXRlbXBsYXRlIDw+Ci1jb25zdGV4cHIgaW5saW5lIHN0ZDo6YXJyYXk8YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW0sIDE+IGVudW1fdmFsdWVzPGFpZGw6OmFuZHJvaWQ6OmFpZGw6OmxvZ2dhYmxlOjpFbnVtPiA9IHsKLSAgYWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkVudW06OkZPTywKLX07Ci0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9JTG9nZ2FibGVJbnRlcmZhY2UuaCBiL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M3OWUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2dvbGRlbl9vdXRwdXQvYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlL2dlbi9pbmNsdWRlL2FpZGwvYW5kcm9pZC9haWRsL2xvZ2dhYmxlL0lMb2dnYWJsZUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBCSU5ERVJfU1RBQklMSVRZX1NVUFBPUlQKLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9zdGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvRGF0YS5oPgotCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgbG9nZ2FibGUgewotY2xhc3MgSUxvZ2dhYmxlSW50ZXJmYWNlIDogcHVibGljIDo6bmRrOjpJQ0ludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotICBJTG9nZ2FibGVJbnRlcmZhY2UoKTsKLSAgdmlydHVhbCB+SUxvZ2dhYmxlSW50ZXJmYWNlKCk7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFOU0FDVElPTl9Mb2dUaGlzID0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDA7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+IGZyb21CaW5kZXIoY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGJpbmRlcik7Ci0gIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChBUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTG9nZ2FibGVJbnRlcmZhY2U+JiBpbnN0YW5jZSk7Ci0gIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogcGFyY2VsLCBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiogaW5zdGFuY2UpOwotICBzdGF0aWMgYm9vbCBzZXREZWZhdWx0SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiYgaW1wbCk7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiYgZ2V0RGVmYXVsdEltcGwoKTsKLSAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBMb2dUaGlzKGJvb2wgaW5fYm9vbFZhbHVlLCBzdGQ6OnZlY3Rvcjxib29sPiogaW5fYm9vbEFycmF5LCBpbnQ4X3QgaW5fYnl0ZVZhbHVlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogaW5fYnl0ZUFycmF5LCBjaGFyMTZfdCBpbl9jaGFyVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogaW5fY2hhckFycmF5LCBpbnQzMl90IGluX2ludFZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogaW5faW50QXJyYXksIGludDY0X3QgaW5fbG9uZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogaW5fbG9uZ0FycmF5LCBmbG9hdCBpbl9mbG9hdFZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIGluX2Zsb2F0QXJyYXksIGRvdWJsZSBpbl9kb3VibGVWYWx1ZSwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogaW5fZG91YmxlQXJyYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9zdHJpbmdWYWx1ZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9zdHJpbmdBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9saXN0VmFsdWUsIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEmIGluX2RhdGFWYWx1ZSwgY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2JpbmRlclZhbHVlLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIGluX3BmZFZhbHVlLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBpbl9wZmRBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pID0gMDsKLXByaXZhdGU6Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SUxvZ2dhYmxlSW50ZXJmYWNlPiBkZWZhdWx0X2ltcGw7Ci19OwotY2xhc3MgSUxvZ2dhYmxlSW50ZXJmYWNlRGVmYXVsdCA6IHB1YmxpYyBJTG9nZ2FibGVJbnRlcmZhY2UgewotcHVibGljOgotICA6Om5kazo6U2NvcGVkQVN0YXR1cyBMb2dUaGlzKGJvb2wgaW5fYm9vbFZhbHVlLCBzdGQ6OnZlY3Rvcjxib29sPiogaW5fYm9vbEFycmF5LCBpbnQ4X3QgaW5fYnl0ZVZhbHVlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogaW5fYnl0ZUFycmF5LCBjaGFyMTZfdCBpbl9jaGFyVmFsdWUsIHN0ZDo6dmVjdG9yPGNoYXIxNl90PiogaW5fY2hhckFycmF5LCBpbnQzMl90IGluX2ludFZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogaW5faW50QXJyYXksIGludDY0X3QgaW5fbG9uZ1ZhbHVlLCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogaW5fbG9uZ0FycmF5LCBmbG9hdCBpbl9mbG9hdFZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4qIGluX2Zsb2F0QXJyYXksIGRvdWJsZSBpbl9kb3VibGVWYWx1ZSwgc3RkOjp2ZWN0b3I8ZG91YmxlPiogaW5fZG91YmxlQXJyYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9zdHJpbmdWYWx1ZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9zdHJpbmdBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbl9saXN0VmFsdWUsIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6bG9nZ2FibGU6OkRhdGEmIGluX2RhdGFWYWx1ZSwgY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2JpbmRlclZhbHVlLCA6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IqIGluX3BmZFZhbHVlLCBzdGQ6OnZlY3Rvcjw6Om5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3I+KiBpbl9wZmRBcnJheSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICA6Om5kazo6U3BBSUJpbmRlciBhc0JpbmRlcigpIG92ZXJyaWRlOwotICBib29sIGlzUmVtb3RlKCkgb3ZlcnJpZGU7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL2luY2x1ZGUvYWlkbC9hbmRyb2lkL2FpZGwvbG9nZ2FibGUvVW5pb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzNzUyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vaW5jbHVkZS9haWRsL2FuZHJvaWQvYWlkbC9sb2dnYWJsZS9Vbmlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2ludGVyZmFjZV91dGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbGFibGVfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl90b19zdHJpbmcuaD4KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2YXJpYW50PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaWZkZWYgQklOREVSX1NUQUJJTElUWV9TVVBQT1JUCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfc3RhYmlsaXR5Lmg+Ci0jZW5kaWYgIC8vIEJJTkRFUl9TVEFCSUxJVFlfU1VQUE9SVAotCi0jaWZuZGVmIF9fQklPTklDX18KLSNkZWZpbmUgX19hc3NlcnQyKGEsYixjLGQpICgodm9pZCkwKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBhaWRsIHsKLW5hbWVzcGFjZSBsb2dnYWJsZSB7Ci1jbGFzcyBVbmlvbiB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlIGZpeGVkX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBkZXNjcmlwdG9yOwotCi0gIGVudW0gVGFnIDogaW50MzJfdCB7Ci0gICAgbnVtID0gMCwgIC8vIGludCBudW07Ci0gICAgc3RyLCAgLy8gU3RyaW5nIHN0cjsKLSAgfTsKLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+Ci0gIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfbm90X3NlbGYgPSAhc3RkOjppc19zYW1lX3Y8c3RkOjpyZW1vdmVfY3ZfdDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxfVHA+PiwgVW5pb24+OwotCi0gIFVuaW9uKCkgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxudW0+LCBpbnQzMl90KDQzKSkgeyB9Ci0gIFVuaW9uKGNvbnN0IFVuaW9uJikgPSBkZWZhdWx0OwotICBVbmlvbihVbmlvbiYmKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pb24mKSA9IGRlZmF1bHQ7Ci0gIFVuaW9uJiBvcGVyYXRvcj0oVW5pb24mJikgPSBkZWZhdWx0OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxfbm90X3NlbGY8X1RwPj4+Ci0gIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1leHBsaWNpdC1jb25zdHJ1Y3RvcikKLSAgY29uc3RleHByIFVuaW9uKF9UcCYmIF9hcmcpCi0gICAgICA6IF92YWx1ZShzdGQ6OmZvcndhcmQ8X1RwPihfYXJnKSkge30KLQotICB0ZW1wbGF0ZSA8c2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX1RwPgotICBjb25zdGV4cHIgZXhwbGljaXQgVW5pb24oc3RkOjppbl9wbGFjZV9pbmRleF90PF9OcD4sIF9UcCYmLi4uIF9hcmdzKQotICAgICAgOiBfdmFsdWUoc3RkOjppbl9wbGFjZV9pbmRleDxfTnA+LCBzdGQ6OmZvcndhcmQ8X1RwPihfYXJncykuLi4pIHt9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnLCB0eXBlbmFtZS4uLiBfVHA+Ci0gIHN0YXRpYyBVbmlvbiBtYWtlKF9UcCYmLi4uIF9hcmdzKSB7Ci0gICAgcmV0dXJuIFVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWcsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1VwPgotICBzdGF0aWMgVW5pb24gbWFrZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfaWwsIF9VcCYmLi4uIF9hcmdzKSB7Ci0gICAgcmV0dXJuIFVuaW9uKHN0ZDo6aW5fcGxhY2VfaW5kZXg8X3RhZz4sIHN0ZDo6bW92ZShfaWwpLCBzdGQ6OmZvcndhcmQ8X1VwPihfYXJncykuLi4pOwotICB9Ci0KLSAgVGFnIGdldFRhZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnPihfdmFsdWUuaW5kZXgoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8VGFnIF90YWc+Ci0gIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKLSAgICBpZiAoZ2V0VGFnKCkgIT0gX3RhZykgeyBfX2Fzc2VydDIoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAiYmFkIGFjY2VzczogYSB3cm9uZyB0YWciKTsgfQotICAgIHJldHVybiBzdGQ6OmdldDxfdGFnPihfdmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFRhZyBfdGFnPgotICBhdXRvJiBnZXQoKSB7Ci0gICAgaWYgKGdldFRhZygpICE9IF90YWcpIHsgX19hc3NlcnQyKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgImJhZCBhY2Nlc3M6IGEgd3JvbmcgdGFnIik7IH0KLSAgICByZXR1cm4gc3RkOjpnZXQ8X3RhZz4oX3ZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxUYWcgX3RhZywgdHlwZW5hbWUuLi4gX1RwPgotICB2b2lkIHNldChfVHAmJi4uLiBfYXJncykgewotICAgIF92YWx1ZS5lbXBsYWNlPF90YWc+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9hcmdzKS4uLik7Ci0gIH0KLQotICBiaW5kZXJfc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgQVBhcmNlbCogX3BhcmNlbCk7Ci0gIGJpbmRlcl9zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKEFQYXJjZWwqIF9wYXJjZWwpIGNvbnN0OwotCi0gIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgIT0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPCByaHMuX3ZhbHVlOwotICB9Ci0gIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgVW5pb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBfdmFsdWUgPD0gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlID09IHJocy5fdmFsdWU7Ci0gIH0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlID4gcmhzLl92YWx1ZTsKLSAgfQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFVuaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gX3ZhbHVlID49IHJocy5fdmFsdWU7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpuZGs6OnBhcmNlbGFibGVfc3RhYmlsaXR5X3QgX2FpZGxfc3RhYmlsaXR5ID0gOjpuZGs6OlNUQUJJTElUWV9MT0NBTDsKLSAgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKLSAgICBvcyA8PCAiVW5pb257IjsKLSAgICBzd2l0Y2ggKGdldFRhZygpKSB7Ci0gICAgY2FzZSBudW06IG9zIDw8ICJudW06ICIgPDwgOjphbmRyb2lkOjppbnRlcm5hbDo6VG9TdHJpbmcoZ2V0PG51bT4oKSk7IGJyZWFrOwotICAgIGNhc2Ugc3RyOiBvcyA8PCAic3RyOiAiIDw8IDo6YW5kcm9pZDo6aW50ZXJuYWw6OlRvU3RyaW5nKGdldDxzdHI+KCkpOyBicmVhazsKLSAgICB9Ci0gICAgb3MgPDwgIn0iOwotICAgIHJldHVybiBvcy5zdHIoKTsKLSAgfQotcHJpdmF0ZToKLSAgc3RkOjp2YXJpYW50PGludDMyX3QsIHN0ZDo6c3RyaW5nPiBfdmFsdWU7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGxvZ2dhYmxlCi19ICAvLyBuYW1lc3BhY2UgYWlkbAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wIGIvdGVzdHMvZ29sZGVuX291dHB1dC9haWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UvZ2VuL3RpbWVzdGFtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9nb2xkZW5fb3V0cHV0L2FpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtLXNvdXJjZS9nZW4vdGltZXN0YW1wCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dvbGRlbl90ZXN0LnNoIGIvdGVzdHMvZ29sZGVuX3Rlc3Quc2gKaW5kZXggOTcyOWJkNS4uNTQ3OTk5ZSAxMDA3NTUKLS0tIGEvdGVzdHMvZ29sZGVuX3Rlc3Quc2gKKysrIGIvdGVzdHMvZ29sZGVuX3Rlc3Quc2gKQEAgLTM5LDEyICszOSwxNyBAQAogICBtb2R1bGVzPSgKICAgICAiYWlkbC10ZXN0LWludGVyZmFjZS1jcHAtc291cmNlIgogICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLWphdmEtc291cmNlIgotICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLW5ka19wbGF0Zm9ybS1zb3VyY2UiCisgICAgImFpZGwtdGVzdC12ZXJzaW9uZWQtaW50ZXJmYWNlLVYyLWphdmEtc291cmNlIgorICAgICJhaWRsLXRlc3QtaW50ZXJmYWNlLW5kay1zb3VyY2UiCiAgICAgImFpZGwtdGVzdC1pbnRlcmZhY2UtcnVzdC1zb3VyY2UiCiAgICAgImFpZGxfdGVzdF9sb2dnYWJsZV9pbnRlcmZhY2UtY3BwLXNvdXJjZSIKICAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1qYXZhLXNvdXJjZSIKLSAgICAiYWlkbF90ZXN0X2xvZ2dhYmxlX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0tc291cmNlIgogICAgICJhaWRsX3Rlc3RfbG9nZ2FibGVfaW50ZXJmYWNlLW5kay1zb3VyY2UiCisgICAgImFpZGwtdGVzdC1pbnRlcmZhY2UtcGxhdGZvcm0tamF2YS1zb3VyY2UiCisgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1jcHAtc291cmNlIgorICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktamF2YS1zb3VyY2UiCisgICAgImFpZGwtdGVzdC1maXhlZHNpemVhcnJheS1uZGstc291cmNlIgorICAgICJhaWRsLXRlc3QtZml4ZWRzaXplYXJyYXktcnVzdC1zb3VyY2UiCiAgICkKIAogICBsb2NhbCByb290PSIuIgpAQCAtNjksNyArNzQsNyBAQAogICAgICAgbWtkaXIgLXAgIiRnb2xkZW4iCiAgICAgICBjcCAtciAiJGJ1aWx0L2dlbiIgIiRnb2xkZW4iCiAgICAgZWxzZQotICAgICAgZGlmZiAtciAiJGJ1aWx0IiAiJGdvbGRlbiIgfHwgZT0xCisgICAgICBkaWZmIC1yICIkYnVpbHQvZ2VuIiAiJGdvbGRlbi9nZW4iIHx8IGU9MQogICAgIGZpCiAgIGRvbmUKIApkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vSVRlc3RTZXJ2aWNlLmFpZGwgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9JVGVzdFNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVmZGRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vSVRlc3RTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWlkbC5zZGt2ZXJzaW9uOworCitpbnRlcmZhY2UgSVRlc3RTZXJ2aWNlIHsKKyAgICAvLyBTaW5jZSBzZGsgPSAyOSwgd2UgaGF2ZSB3cml0ZS9yZWFkQm9vbGVhbgorICAgIGJvb2xlYW4gUmVwZWF0Qm9vbGVhbihib29sZWFuIHRva2VuKTsKKworICAgIC8vIFNpbmNlIHNkayA9IDIzLCB3ZSBoYXZlIHdyaXRlL3JlYWRUeXBlZE9iamVjdAorICAgIEBKYXZhRGVyaXZlKHRvU3RyaW5nPXRydWUsIGVxdWFscz10cnVlKQorICAgIHBhcmNlbGFibGUgVHlwZWRPYmplY3QgeworICAgICAgICBib29sZWFuIGI7CisgICAgfQorICAgIEBudWxsYWJsZSBUeXBlZE9iamVjdCBSZXBlYXRUeXBlZE9iamVjdChpbiBAbnVsbGFibGUgVHlwZWRPYmplY3QgdG9rZW4pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vc2VydmljZS9BaWRsSmF2YVZlcnNpb25UZXN0U2VydmljZS5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vc2VydmljZS9BaWRsSmF2YVZlcnNpb25UZXN0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTA4YzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi9zZXJ2aWNlL0FpZGxKYXZhVmVyc2lvblRlc3RTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnNka3ZlcnNpb24uc2VydmljZTsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC5zZGt2ZXJzaW9uLklUZXN0U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFpZGwuc2RrdmVyc2lvbi5JVGVzdFNlcnZpY2UuVHlwZWRPYmplY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEFpZGxKYXZhVmVyc2lvblRlc3RTZXJ2aWNlIHsKKyAgc3RhdGljIGNsYXNzIFRlc3RTZXJ2aWNlU2VydmVyIGV4dGVuZHMgSVRlc3RTZXJ2aWNlLlN0dWIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIFJlcGVhdEJvb2xlYW4oYm9vbGVhbiB0b2tlbikgeworICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlZE9iamVjdCBSZXBlYXRUeXBlZE9iamVjdChUeXBlZE9iamVjdCB0b2tlbikgeworICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBUZXN0U2VydmljZVNlcnZlciBteVNlcnZlciA9IG5ldyBUZXN0U2VydmljZVNlcnZlcigpOworICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoSVRlc3RTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbXlTZXJ2ZXIpOworICAgIEJpbmRlci5qb2luVGhyZWFkUG9vbCgpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2RrdmVyc2lvbi90ZXN0cy9BaWRsSmF2YVZlcnNpb25UZXN0cy5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vdGVzdHMvQWlkbEphdmFWZXJzaW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM5YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Nka3ZlcnNpb24vdGVzdHMvQWlkbEphdmFWZXJzaW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwuc2RrdmVyc2lvbi50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC5zZGt2ZXJzaW9uLklUZXN0U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFpZGwuc2RrdmVyc2lvbi5JVGVzdFNlcnZpY2UuVHlwZWRPYmplY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuaW50ZXJuYWwuVGV4dExpc3RlbmVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUmVzdWx0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBaWRsSmF2YVZlcnNpb25UZXN0cyB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBKVW5pdENvcmUganVuaXQgPSBuZXcgSlVuaXRDb3JlKCk7CisgICAganVuaXQuYWRkTGlzdGVuZXIobmV3IFRleHRMaXN0ZW5lcihTeXN0ZW0ub3V0KSk7CisgICAgUmVzdWx0IHJlc3VsdCA9IGp1bml0LnJ1bihBaWRsSmF2YVZlcnNpb25UZXN0cy5jbGFzcyk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkgPyAiVEVTVCBTVUNDRVNTIiA6ICJURVNUIEZBSUxVUkUiKTsKKyAgfQorCisgIHByaXZhdGUgSVRlc3RTZXJ2aWNlIG1TZXJ2aWNlOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgSUJpbmRlciBiaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci53YWl0Rm9yU2VydmljZShJVGVzdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnROb3ROdWxsKGJpbmRlcik7CisgICAgbVNlcnZpY2UgPSBJVGVzdFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiaW5kZXIpOworICAgIGFzc2VydE5vdE51bGwobVNlcnZpY2UpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW4oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLlJlcGVhdEJvb2xlYW4odHJ1ZSkpOworICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLlJlcGVhdEJvb2xlYW4oZmFsc2UpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZE9iamVjdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIFR5cGVkT2JqZWN0IHRva2VuID0gbmV3IFR5cGVkT2JqZWN0KCk7CisgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLlJlcGVhdFR5cGVkT2JqZWN0KHRva2VuKSwgdG9rZW4pOworICAgIGFzc2VydE51bGwobVNlcnZpY2UuUmVwZWF0VHlwZWRPYmplY3QobnVsbCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2VydmljZS9UZXN0U2VydmljZVNlcnZlci5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3NlcnZpY2UvVGVzdFNlcnZpY2VTZXJ2ZXIuamF2YQppbmRleCAwNmVmNmNjLi5hZDk4NDE2IDEwMDY0NAotLS0gYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvc2VydmljZS9UZXN0U2VydmljZVNlcnZlci5qYXZhCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC9zZXJ2aWNlL1Rlc3RTZXJ2aWNlU2VydmVyLmphdmEKQEAgLTE2LDcgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5haWRsLnNlcnZpY2U7CiAKK2ltcG9ydCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLklSZXBlYXRGaXhlZFNpemVBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmFpZGwuZml4ZWRzaXplYXJyYXkuRml4ZWRTaXplQXJyYXlFeGFtcGxlLkludFBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkJhY2tlbmRUeXBlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CYWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CeXRlRW51bTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuQ29uc3RhbnRFeHByZXNzaW9uRW51bTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlOwpAQCAtMjcsMTEgKzMwLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLklUZXN0U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuSW50RW51bTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuTG9uZ0VudW07CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlJlY3Vyc2l2ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlNpbXBsZVBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLlN0cnVjdHVyZWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5VbmlvbjsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuZXh0ZW5zaW9uLkV4dGVuZGFibGVQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5leHRlbnNpb24uTXlFeHQ7CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5JTmVzdGVkU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMubmVzdGVkLlBhcmNlbGFibGVXaXRoTmVzdGVkOwogaW1wb3J0IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb247CiBpbXBvcnQgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb287CiBpbXBvcnQgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5JRm9vSW50ZXJmYWNlOwpAQCAtNDcsNiArNTMsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTU4LDYgKzY1LDEyIEBACiAgICAgRm9vSW50ZXJmYWNlIGZvbyA9IG5ldyBGb29JbnRlcmZhY2UoKTsKICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKElGb29JbnRlcmZhY2UuY2xhc3MuZ2V0TmFtZSgpLCBmb28pOwogCisgICAgTmVzdGVkU2VydmljZSBuZXN0ZWQgPSBuZXcgTmVzdGVkU2VydmljZSgpOworICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoSU5lc3RlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBuZXN0ZWQpOworCisgICAgRml4ZWRTaXplQXJyYXlTZXJ2aWNlIGZpeGVkU2l6ZSA9IG5ldyBGaXhlZFNpemVBcnJheVNlcnZpY2UoKTsKKyAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKElSZXBlYXRGaXhlZFNpemVBcnJheS5ERVNDUklQVE9SLCBmaXhlZFNpemUpOworCiAgICAgQmluZGVyLmpvaW5UaHJlYWRQb29sKCk7CiAgIH0KIApAQCAtODksNiArMTAyLDI3IEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmVzdGVkU2VydmljZSBleHRlbmRzIElOZXN0ZWRTZXJ2aWNlLlN0dWIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBSZXN1bHQgZmxpcFN0YXR1cyhQYXJjZWxhYmxlV2l0aE5lc3RlZCBwKSB7CisgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOworICAgICAgaWYgKHAuc3RhdHVzID09IFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5PSykgeworICAgICAgICByZXN1bHQuc3RhdHVzID0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk5PVF9PSzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0s7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKGJ5dGUgc3QsIElDYWxsYmFjayBjYikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBpZiAoc3QgPT0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk9LKSB7CisgICAgICAgIGNiLmRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk5PVF9PSyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjYi5kb25lKFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5PSyk7CisgICAgICB9CisgICAgfQorICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIFBhcmNlbCBkYXRhLCBQYXJjZWwgcmVwbHksIGludCBmbGFncykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgLy8gVW5pbXBsZW1lbnRlZE1ldGhvZApAQCAtMjc0LDYgKzMwOCw2MCBAQAogICAgIHJldHVybiBuYW1lLmVxdWFscyhzZXJ2aWNlLkdldE5hbWUoKSk7CiAgIH0KICAgQE92ZXJyaWRlCisgIHB1YmxpYyBJTmFtZWRDYWxsYmFja1tdIEdldEludGVyZmFjZUFycmF5KFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcyk7CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KElOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIFN0cmluZ1tdIG5hbWVzKQorICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoc2VydmljZXMsIG5hbWVzKTsKKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIElOYW1lZENhbGxiYWNrW10gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShTdHJpbmdbXSBuYW1lcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgaWYgKG5hbWVzID09IG51bGwpCisgICAgICByZXR1cm4gbnVsbDsKKyAgICBJTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzID0gbmV3IElOYW1lZENhbGxiYWNrW25hbWVzLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKG5hbWVzW2ldID09IG51bGwpIHsKKyAgICAgICAgc2VydmljZXNbaV0gPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VydmljZXNbaV0gPSBHZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWVzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2VzOworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBWZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KElOYW1lZENhbGxiYWNrW10gc2VydmljZXMsIFN0cmluZ1tdIG5hbWVzKQorICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgaWYgKHNlcnZpY2VzICE9IG51bGwgJiYgbmFtZXMgIT0gbnVsbCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoc2VydmljZXNbaV0gIT0gbnVsbCAmJiBuYW1lc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKCFWZXJpZnlOYW1lKHNlcnZpY2VzW2ldLCBuYW1lc1tpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZXNbaV0gIT0gbnVsbCB8fCBuYW1lc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHNlcnZpY2VzICE9IG51bGwgfHwgbmFtZXMgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElOYW1lZENhbGxiYWNrPiBHZXRJbnRlcmZhY2VMaXN0KFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBJTmFtZWRDYWxsYmFja1tdIHNlcnZpY2VzID0gR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcyk7CisgICAgcmV0dXJuIHNlcnZpY2VzID09IG51bGwgPyBudWxsIDogQXJyYXlzLmFzTGlzdChzZXJ2aWNlcyk7CisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIFZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUxpc3QoTGlzdDxJTmFtZWRDYWxsYmFjaz4gc2VydmljZXMsIFN0cmluZ1tdIG5hbWVzKQorICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIFZlcmlmeU5hbWVzV2l0aE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoCisgICAgICAgIHNlcnZpY2VzID09IG51bGwgPyBudWxsIDogc2VydmljZXMudG9BcnJheShuZXcgSU5hbWVkQ2FsbGJhY2tbMF0pLCBuYW1lcyk7CisgIH0KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBMaXN0PFN0cmluZz4gUmV2ZXJzZVN0cmluZ0xpc3QoTGlzdDxTdHJpbmc+IGlucHV0LCBMaXN0PFN0cmluZz4gcmVwZWF0ZWQpCiAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXZlcnNlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtMzMzLDcgKzQyMSwxNyBAQAogICAgIHJldHVybiBpbnB1dDsKICAgfQogICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cnVjdHVyZWRQYXJjZWxhYmxlIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZShTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBpbnB1dCkKKyAgcHVibGljIElUZXN0U2VydmljZS5FbXB0eSBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoSVRlc3RTZXJ2aWNlLkVtcHR5IGlucHV0KQorICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGlucHV0OworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJVGVzdFNlcnZpY2UuRW1wdHk+IFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoTGlzdDxJVGVzdFNlcnZpY2UuRW1wdHk+IGlucHV0KQorICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGlucHV0OworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3RTZXJ2aWNlLkVtcHR5W10gUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXkoSVRlc3RTZXJ2aWNlLkVtcHR5W10gaW5wdXQpCiAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICByZXR1cm4gaW5wdXQ7CiAgIH0KQEAgLTM0Niw2ICs0NDQsMTUgQEAKICAgICAvLyBkbyBub3RoaW5nCiAgIH0KICAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIFRha2VzQW5JQmluZGVyTGlzdChMaXN0PElCaW5kZXI+IGlucHV0KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAvLyBkbyBub3RoaW5nCisgIH0KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIFRha2VzQU51bGxhYmxlSUJpbmRlckxpc3QoTGlzdDxJQmluZGVyPiBpbnB1dCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgLy8gZG8gbm90aGluZworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgUmVwZWF0VXRmOENwcFN0cmluZyhTdHJpbmcgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgIHJldHVybiB0b2tlbjsKICAgfQpAQCAtNDIyLDcgKzUyOSw0NSBAQAogICAgIHBhcmNlbGFibGUudSA9IFVuaW9uLm5zKG5ldyBpbnRbXSB7MSwgMiwgM30pOwogICAgIHBhcmNlbGFibGUuc2hvdWxkQmVDb25zdFMxID0gVW5pb24ucyhVbmlvbi5TMSk7CiAgIH0KLQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIEV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMikKKyAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIGVwMi5hID0gZXAuYTsKKyAgICBlcDIuYiA9IGVwLmI7CisgICAgLy8gbm8gd2F5IHRvIGNvcHkgY3VycmVudGx5IHcvbyB1bnBhcmNlbGluZworICAgIGVwMi5leHQuc2V0UGFyY2VsYWJsZShlcC5leHQuZ2V0UGFyY2VsYWJsZShNeUV4dC5jbGFzcykpOworICAgIGVwMi5jID0gZXAuYzsKKyAgICBlcDIuZXh0Mi5zZXRQYXJjZWxhYmxlKG51bGwpOworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVjdXJzaXZlTGlzdCBSZXZlcnNlTGlzdChSZWN1cnNpdmVMaXN0IGxpc3QpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIFJlY3Vyc2l2ZUxpc3QgcmV2ZXJzZWQgPSBudWxsOworICAgIHdoaWxlIChsaXN0ICE9IG51bGwpIHsKKyAgICAgIFJlY3Vyc2l2ZUxpc3QgbmV4dCA9IGxpc3QubmV4dDsKKyAgICAgIGxpc3QubmV4dCA9IHJldmVyc2VkOworICAgICAgcmV2ZXJzZWQgPSBsaXN0OworICAgICAgbGlzdCA9IG5leHQ7CisgICAgfQorICAgIHJldHVybiByZXZlcnNlZDsKKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIElCaW5kZXJbXSBSZXZlcnNlSUJpbmRlckFycmF5KElCaW5kZXJbXSBpbnB1dCwgSUJpbmRlcltdIHJlcGVhdGVkKSB7CisgICAgSUJpbmRlcltdIHJldmVyc2VkID0gbmV3IElCaW5kZXJbaW5wdXQubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICAgICByZXBlYXRlZFtpXSA9IGlucHV0W2ldOworICAgICAgcmV2ZXJzZWRbaV0gPSBpbnB1dFtpbnB1dC5sZW5ndGggLSBpIC0gMV07CisgICAgfQorICAgIHJldHVybiByZXZlcnNlZDsKKyAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIElCaW5kZXJbXSBSZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoSUJpbmRlcltdIGlucHV0LCBJQmluZGVyW10gcmVwZWF0ZWQpIHsKKyAgICBJQmluZGVyW10gcmV2ZXJzZWQgPSBuZXcgSUJpbmRlcltpbnB1dC5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgIHJlcGVhdGVkW2ldID0gaW5wdXRbaV07CisgICAgICByZXZlcnNlZFtpXSA9IGlucHV0W2lucHV0Lmxlbmd0aCAtIGkgLSAxXTsKKyAgICB9CisgICAgcmV0dXJuIHJldmVyc2VkOworICB9CiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15T2xkTmFtZSBleHRlbmRzIElPbGROYW1lLlN0dWIgewogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgUmVhbE5hbWUoKSB7CkBAIC00NDksNiArNTk0LDEwIEBACiAKICAgY2xhc3MgTXlDcHBKYXZhVGVzdHMgZXh0ZW5kcyBJQ3BwSmF2YVRlc3RzLlN0dWIgewogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYWRQYXJjZWxhYmxlIFJlcGVhdEJhZFBhcmNlbGFibGUoQmFkUGFyY2VsYWJsZSBpbnB1dCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTaW1wbGVQYXJjZWxhYmxlIFJlcGVhdFNpbXBsZVBhcmNlbGFibGUoU2ltcGxlUGFyY2VsYWJsZSBpbnB1dCwgU2ltcGxlUGFyY2VsYWJsZSByZXBlYXQpCiAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgcmVwZWF0LnNldChpbnB1dC5nZXROYW1lKCksIGlucHV0LmdldE51bWJlcigpKTsKQEAgLTUyMCwxOSArNjY5LDc1IEBACiAgICAgICB9CiAgICAgICByZXR1cm4gcmV2ZXJzZWQ7CiAgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGaXhlZFNpemVBcnJheVNlcnZpY2UgZXh0ZW5kcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXkuU3R1YiB7CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgVGFrZXNBbklCaW5kZXJMaXN0KExpc3Q8SUJpbmRlcj4gaW5wdXQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24ge30KKyAgICBwdWJsaWMgYnl0ZVtdIFJlcGVhdEJ5dGVzKGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIHJlcGVhdGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChMaXN0PElCaW5kZXI+IGlucHV0KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHt9CisgICAgcHVibGljIGludFtdIFJlcGVhdEludHMoaW50W10gaW5wdXQsIGludFtdIHJlcGVhdGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAsIEV4dGVuZGFibGVQYXJjZWxhYmxlIGVwMikKKyAgICBwdWJsaWMgSUJpbmRlcltdIFJlcGVhdEJpbmRlcnMoSUJpbmRlcltdIGlucHV0LCBJQmluZGVyW10gcmVwZWF0ZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICByZXBlYXRlZFtpXSA9IGlucHV0W2ldOworICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW50UGFyY2VsYWJsZVtdIFJlcGVhdFBhcmNlbGFibGVzKEludFBhcmNlbGFibGVbXSBpbnB1dCwgSW50UGFyY2VsYWJsZVtdIHJlcGVhdGVkKQogICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgIGVwMi5hID0gZXAuYTsKLSAgICAgIGVwMi5iID0gZXAuYjsKLSAgICAgIC8vIG5vIHdheSB0byBjb3B5IGN1cnJlbnRseSB3L28gdW5wYXJjZWxpbmcKLSAgICAgIGVwMi5leHQuc2V0UGFyY2VsYWJsZShlcC5leHQuZ2V0UGFyY2VsYWJsZShNeUV4dC5jbGFzcykpOwotICAgICAgZXAyLmMgPSBlcC5jOwotICAgICAgZXAyLmV4dDIuc2V0UGFyY2VsYWJsZShudWxsKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmVwZWF0ZWRbaV0gPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXVtdIFJlcGVhdDJkQnl0ZXMoYnl0ZVtdW10gaW5wdXQsIGJ5dGVbXVtdIHJlcGVhdGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnB1dFtpXS5sZW5ndGg7IGorKykgeworICAgICAgICAgIHJlcGVhdGVkW2ldW2pdID0gaW5wdXRbaV1bal07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludFtdW10gUmVwZWF0MmRJbnRzKGludFtdW10gaW5wdXQsIGludFtdW10gcmVwZWF0ZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlucHV0W2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgcmVwZWF0ZWRbaV1bal0gPSBpbnB1dFtpXVtqXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlcltdW10gUmVwZWF0MmRCaW5kZXJzKElCaW5kZXJbXVtdIGlucHV0LCBJQmluZGVyW11bXSByZXBlYXRlZCkKKyAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5wdXRbaV0ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICByZXBlYXRlZFtpXVtqXSA9IGlucHV0W2ldW2pdOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRQYXJjZWxhYmxlW11bXSBSZXBlYXQyZFBhcmNlbGFibGVzKAorICAgICAgICBJbnRQYXJjZWxhYmxlW11bXSBpbnB1dCwgSW50UGFyY2VsYWJsZVtdW10gcmVwZWF0ZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlucHV0W2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgcmVwZWF0ZWRbaV1bal0gPSBpbnB1dFtpXVtqXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0OwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQWlkbEphdmFUZXN0cy5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0FpZGxKYXZhVGVzdHMuamF2YQppbmRleCA0M2Q5MjYzLi5kZDkzY2EwIDEwMDY0NAotLS0gYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQWlkbEphdmFUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9BaWRsSmF2YVRlc3RzLmphdmEKQEAgLTEyLDcgKzEyLDcgQEAKICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IGp1bml0LnJ1bihFeHRlbnNpb25UZXN0cy5jbGFzcywgR2VuZXJpY1Rlc3RzLmNsYXNzLAogICAgICAgICAgICAgSmF2YU9ubHlJbW11dGFibGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MsIE1hcFRlc3RzLmNsYXNzLCBOdWxsYWJsZVRlc3RzLmNsYXNzLAogICAgICAgICAgICAgVGVzdFNlcnZpY2VDbGllbnQuY2xhc3MsIFRlc3RWZXJzaW9uZWRJbnRlcmZhY2UuY2xhc3MsIFVuaW9uVGVzdHMuY2xhc3MsCi0gICAgICAgICAgICBWaW50ZlRlc3RzLmNsYXNzKTsKKyAgICAgICAgICAgIFZpbnRmVGVzdHMuY2xhc3MsIEJ1aWx0SW5UZXN0cy5jbGFzcywgRGVsZWdhdG9yVGVzdHMuY2xhc3MpOwogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpID8gIlRFU1QgU1VDQ0VTUyIgOiAiVEVTVCBGQUlMVVJFIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0JhZFBhcmNlbGFibGUuamF2YSBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWRQYXJjZWxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3ZmJmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CYWRQYXJjZWxhYmxlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5haWRsLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitwdWJsaWMgY2xhc3MgQmFkUGFyY2VsYWJsZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICBwcml2YXRlIGJvb2xlYW4gbUJhZDsKKyAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisgIHByaXZhdGUgaW50IG1OdW1iZXI7CisKKyAgQmFkUGFyY2VsYWJsZSgpIHt9CisgIEJhZFBhcmNlbGFibGUoYm9vbGVhbiBiYWQsIFN0cmluZyBuYW1lLCBpbnQgbnVtYmVyKSB7CisgICAgdGhpcy5tQmFkID0gYmFkOworICAgIHRoaXMubU5hbWUgPSBuYW1lOworICAgIHRoaXMubU51bWJlciA9IG51bWJlcjsKKyAgfQorCisgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsgcmV0dXJuIDA7IH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICBkZXN0LndyaXRlQm9vbGVhbihtQmFkKTsKKyAgICBkZXN0LndyaXRlU3RyaW5nKG1OYW1lKTsKKyAgICBkZXN0LndyaXRlSW50KG1OdW1iZXIpOworICAgIC8vIEJBRCEgd3JpdGUgc3VwZXJmbHVvdXMgZGF0YQorICAgIGlmIChtQmFkKSB7CisgICAgICBkZXN0LndyaXRlSW50KDQyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRnJvbVBhcmNlbChQYXJjZWwgc291cmNlKSB7CisgICAgbUJhZCA9IHNvdXJjZS5yZWFkQm9vbGVhbigpOworICAgIG1OYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICBtTnVtYmVyID0gc291cmNlLnJlYWRJbnQoKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCEobyBpbnN0YW5jZW9mIEJhZFBhcmNlbGFibGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEJhZFBhcmNlbGFibGUgcCA9IChCYWRQYXJjZWxhYmxlKSBvOworICAgIGlmIChtQmFkICE9IHAubUJhZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKG1OYW1lID09IG51bGwgJiYgcC5tTmFtZSAhPSBudWxsKSB8fCAobU5hbWUgIT0gbnVsbCAmJiAhbU5hbWUuZXF1YWxzKHAubU5hbWUpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbU51bWJlciA9PSBwLm1OdW1iZXI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiQmFkUGFyY2VsYWJsZShiYWQ9IiArIG1CYWQgKyAiLG5hbWU9IiArIG1OYW1lICsgIixudW1iZXI9IiArIG1OdW1iZXIgKyAifSI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxCYWRQYXJjZWxhYmxlPiBDUkVBVE9SID0KKyAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFkUGFyY2VsYWJsZT4oKSB7CisgICAgICAgIHB1YmxpYyBCYWRQYXJjZWxhYmxlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgIEJhZFBhcmNlbGFibGUgcCA9IG5ldyBCYWRQYXJjZWxhYmxlKCk7CisgICAgICAgICAgcC5yZWFkRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhZFBhcmNlbGFibGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeyByZXR1cm4gbmV3IEJhZFBhcmNlbGFibGVbc2l6ZV07IH0KKyAgICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQnVpbHRJblRlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvQnVpbHRJblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhYmMzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9CdWlsdEluVGVzdHMuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCdWlsdEluVGVzdHMgeworICBwcml2YXRlIElCaW5kZXIgbUJpbmRlcjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgbUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwobUJpbmRlcik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UGluZygpIHsKKyAgICBhc3NlcnRUcnVlKG1CaW5kZXIucGluZ0JpbmRlcigpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VEZXNjcmlwdG9yKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0VGhhdChtQmluZGVyLmdldEludGVyZmFjZURlc2NyaXB0b3IoKSwgaXMoImFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9EZWxlZ2F0b3JUZXN0cy5qYXZhIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0RlbGVnYXRvclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxMzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9EZWxlZ2F0b3JUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZWxlZ2F0b3JUZXN0cyB7CisgIHN0YXRpYyBieXRlIGtGYWtlQnl0ZSA9IDE2OworICBzdGF0aWMgYnl0ZSBrRXhwZWN0ZWRCeXRlID0gMTI7CisKKyAgcHJpdmF0ZSBjbGFzcyBDdXN0b20gZXh0ZW5kcyBJVGVzdFNlcnZpY2UuRGVsZWdhdG9yIHsKKyAgICBwdWJsaWMgQ3VzdG9tKElUZXN0U2VydmljZSBpbXBsKSB7IHN1cGVyKGltcGwpOyB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGUgUmVwZWF0Qnl0ZShieXRlIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBrRmFrZUJ5dGU7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlbGVnYXRvcigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIElCaW5kZXIgYmluZGVyID0gU2VydmljZU1hbmFnZXIud2FpdEZvclNlcnZpY2UoSVRlc3RTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChiaW5kZXIpOworICAgIElUZXN0U2VydmljZSBzZXJ2aWNlID0gSVRlc3RTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKyAgICBJVGVzdFNlcnZpY2UuRGVsZWdhdG9yIGRlbGVnYXRvciA9IG5ldyBJVGVzdFNlcnZpY2UuRGVsZWdhdG9yKHNlcnZpY2UpOworICAgIGFzc2VydFRoYXQoZGVsZWdhdG9yLlJlcGVhdEJ5dGUoa0V4cGVjdGVkQnl0ZSksIGlzKGtFeHBlY3RlZEJ5dGUpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21EZWxlZ2F0b3IoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICBJVGVzdFNlcnZpY2Ugc2VydmljZSA9IElUZXN0U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcik7CisgICAgSVRlc3RTZXJ2aWNlLkRlbGVnYXRvciBjdXN0b20gPSBuZXcgQ3VzdG9tKHNlcnZpY2UpOworICAgIGFzc2VydFRoYXQoY3VzdG9tLlJlcGVhdEJ5dGUoa0V4cGVjdGVkQnl0ZSksIGlzKGtGYWtlQnl0ZSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEFzQmluZGVyQXNJbnRlcmZhY2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICBJVGVzdFNlcnZpY2Ugc2VydmljZSA9IElUZXN0U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcik7CisgICAgSVRlc3RTZXJ2aWNlLkRlbGVnYXRvciBkZWxlZ2F0b3IgPSBuZXcgSVRlc3RTZXJ2aWNlLkRlbGVnYXRvcihzZXJ2aWNlKTsKKyAgICBhc3NlcnRUaGF0KElUZXN0U2VydmljZS5EZWxlZ2F0b3IuYXNJbnRlcmZhY2UoZGVsZWdhdG9yLmFzQmluZGVyKCkpLlJlcGVhdEJ5dGUoa0V4cGVjdGVkQnl0ZSksCisgICAgICAgIGlzKGtFeHBlY3RlZEJ5dGUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL0V4dGVuc2lvblRlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YQppbmRleCBlOTIzYWQyLi5kNTczMTU2IDEwMDY0NAotLS0gYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvRXh0ZW5zaW9uVGVzdHMuamF2YQpAQCAtNTgsMjAgKzU4LDE0IEBACiAgICAgcHJpdmF0ZSBVbnN0YWJsZVBhcmNlbGFibGUgdXA7CiAKICAgICBwcml2YXRlIElUZXN0U2VydmljZSBtU2VydmljZTsKLSAgICBwcml2YXRlIElDcHBKYXZhVGVzdHMgbUNwcEphdmFUZXN0czsKIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgSUJpbmRlciBiaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci53YWl0Rm9yU2VydmljZShJVGVzdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKICAgICAgIG1TZXJ2aWNlID0gSVRlc3RTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKICAgICAgIGFzc2VydE5vdE51bGwobVNlcnZpY2UpOwogCi0gICAgICBJQmluZGVyIGJpbmRlcjIgPSBtU2VydmljZS5HZXRDcHBKYXZhVGVzdHMoKTsKLSAgICAgIGlmIChiaW5kZXIyICE9IG51bGwpIHsKLSAgICAgICAgbUNwcEphdmFUZXN0cyA9IElDcHBKYXZhVGVzdHMuU3R1Yi5hc0ludGVyZmFjZShiaW5kZXIyKTsKLSAgICAgIH0KLQogICAgICAgdmVwID0gbmV3IFZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUoKTsKICAgICAgIHZwID0gbmV3IFZpbnRmUGFyY2VsYWJsZSgpOwogCkBAIC04NCw4ICs3OCw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgYXNzdW1lVHJ1ZShtQ3BwSmF2YVRlc3RzICE9IG51bGwpOwotCiAgICAgICBNeUV4dCBleHQgPSBuZXcgTXlFeHQoKTsKICAgICAgIGV4dC5hID0gNDI7CiAgICAgICBleHQuYiA9ICJFWFQiOwpAQCAtOTgsNyArOTAsNyBAQAogICAgICAgZXAuZXh0LnNldFBhcmNlbGFibGUoZXh0KTsKIAogICAgICAgRXh0ZW5kYWJsZVBhcmNlbGFibGUgZXAyID0gbmV3IEV4dGVuZGFibGVQYXJjZWxhYmxlKCk7Ci0gICAgICBtQ3BwSmF2YVRlc3RzLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKGVwLCBlcDIpOworICAgICAgbVNlcnZpY2UuUmVwZWF0RXh0ZW5kYWJsZVBhcmNlbGFibGUoZXAsIGVwMik7CiAgICAgICBhc3NlcnRUaGF0KGVwMi5hLCBpcyhlcC5hKSk7CiAgICAgICBhc3NlcnRUaGF0KGVwMi5iLCBpcyhlcC5iKSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9OZXN0ZWRUeXBlc1Rlc3RzLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTmVzdGVkVHlwZXNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODUxZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTmVzdGVkVHlwZXNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWlkbC50ZXN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5uZXN0ZWQuSU5lc3RlZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLm5lc3RlZC5QYXJjZWxhYmxlV2l0aE5lc3RlZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTmVzdGVkVHlwZXNUZXN0cyB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RVc2VOZXN0ZWRUeXBlcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIElCaW5kZXIgYmluZGVyID0gU2VydmljZU1hbmFnZXIud2FpdEZvclNlcnZpY2UoSU5lc3RlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnROb3ROdWxsKGJpbmRlcik7CisgICAgSU5lc3RlZFNlcnZpY2UgbmVzdGVkU2VydmljZSA9IElOZXN0ZWRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKyAgICBhc3NlcnROb3ROdWxsKG5lc3RlZFNlcnZpY2UpOworCisgICAgLy8gT0sgLT4gTk9UX09LCisgICAgUGFyY2VsYWJsZVdpdGhOZXN0ZWQgcCA9IG5ldyBQYXJjZWxhYmxlV2l0aE5lc3RlZCgpOworICAgIHAuc3RhdHVzID0gUGFyY2VsYWJsZVdpdGhOZXN0ZWQuU3RhdHVzLk9LOworICAgIElOZXN0ZWRTZXJ2aWNlLlJlc3VsdCByZXN1bHQgPSBuZXN0ZWRTZXJ2aWNlLmZsaXBTdGF0dXMocCk7CisgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGlzKFBhcmNlbGFibGVXaXRoTmVzdGVkLlN0YXR1cy5OT1RfT0spKTsKKworICAgIC8vIE5PVF9PSyAtPiBPSyB3aXRoIG5lc3RlZCBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICBjbGFzcyBDYWxsYmFjayBleHRlbmRzIElOZXN0ZWRTZXJ2aWNlLklDYWxsYmFjay5TdHViIHsKKyAgICAgIGJ5dGUgcmVjZWl2ZWQgPSBQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuTk9UX09LOworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb25lKGJ5dGUgc3QpIHsKKyAgICAgICAgcmVjZWl2ZWQgPSBzdDsKKyAgICAgIH0KKyAgICB9CisgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soKTsKKyAgICBuZXN0ZWRTZXJ2aWNlLmZsaXBTdGF0dXNXaXRoQ2FsbGJhY2socC5zdGF0dXMsIGNiKTsKKyAgICBhc3NlcnRUaGF0KGNiLnJlY2VpdmVkLCBpcyhQYXJjZWxhYmxlV2l0aE5lc3RlZC5TdGF0dXMuT0spKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL051bGxhYmxlVGVzdHMuamF2YSBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9OdWxsYWJsZVRlc3RzLmphdmEKaW5kZXggMzkyZDc4NC4uMmNhYjNhMiAxMDA2NDQKLS0tIGEvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL051bGxhYmxlVGVzdHMuamF2YQorKysgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvTnVsbGFibGVUZXN0cy5qYXZhCkBAIC0xNiwyNCArMTYsMjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFpZGwudGVzdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5udWxsVmFsdWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5udWxsVmFsdWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTnVsbC5ub3ROdWxsVmFsdWU7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwogCiBAUnVuV2l0aChKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTnVsbGFibGVUZXN0cyB7CkBAIC02Niw2ICs2NywyMCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBJVGVzdFNlcnZpY2UuRW1wdHlbXSBpbnB1dCA9IHtuZXcgSVRlc3RTZXJ2aWNlLkVtcHR5KCksIG51bGx9OworICAgICAgYXNzZXJ0VGhhdChtU2VydmljZS5SZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheShpbnB1dCksIGlzKGlucHV0KSk7CisgICAgICBhc3NlcnRUaGF0KG1TZXJ2aWNlLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5KG51bGwpLCBpcyhudWxsVmFsdWUoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIExpc3Q8SVRlc3RTZXJ2aWNlLkVtcHR5PiBpbnB1dCA9IEFycmF5cy5hc0xpc3QobmV3IElUZXN0U2VydmljZS5FbXB0eSgpLCBudWxsKTsKKyAgICAgIGFzc2VydFRoYXQobVNlcnZpY2UuUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdChpbnB1dCksIGlzKGlucHV0KSk7CisgICAgICBhc3NlcnRUaGF0KG1TZXJ2aWNlLlJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QobnVsbCksIGlzKG51bGxWYWx1ZSgpKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwZWN0TnBlV2l0aE51bGxCaW5kZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1TZXJ2aWNlLlRha2VzQW5JQmluZGVyKG51bGwpOwpAQCAtODAsMTIgKzk1LDEwIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBlY3ROcGVXaXRoTnVsbEJpbmRlckxpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lVHJ1ZShtQ3BwSmF2YVRlc3RzICE9IG51bGwpOwotCiAgICAgICAgIExpc3Q8SUJpbmRlcj4gbGlzdFdpdGhOdWxscyA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKICAgICAgICAgbGlzdFdpdGhOdWxscy5hZGQobnVsbCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ3BwSmF2YVRlc3RzLlRha2VzQW5JQmluZGVyTGlzdChsaXN0V2l0aE51bGxzKTsKKyAgICAgICAgICBtU2VydmljZS5UYWtlc0FuSUJpbmRlckxpc3QobGlzdFdpdGhOdWxscyk7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTk1LDYgKzEwOCwzNCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldmVyc2VJQmluZGVyQXJyYXkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIElCaW5kZXJbXSBpbnB1dCA9IHtuZXcgQmluZGVyKCksIG5ldyBCaW5kZXIoKX07CisgICAgICBJQmluZGVyW10gcmVwZWF0ZWQgPSBuZXcgSUJpbmRlcltpbnB1dC5sZW5ndGhdOworICAgICAgSUJpbmRlcltdIHJldmVyc2VkID0gbVNlcnZpY2UuUmV2ZXJzZUlCaW5kZXJBcnJheShpbnB1dCwgcmVwZWF0ZWQpOworCisgICAgICBhc3NlcnRUaGF0KHJlcGVhdGVkLCBpcyhpbnB1dCkpOworICAgICAgYXNzZXJ0VGhhdChyZXZlcnNlZC5sZW5ndGgsIGlzKGlucHV0Lmxlbmd0aCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICsraSkgeworICAgICAgICBpbnQgaiA9IHJldmVyc2VkLmxlbmd0aCAtICgxICsgaSk7CisgICAgICAgIGFzc2VydFRoYXQocmV2ZXJzZWRbal0sIGlzKGlucHV0W2ldKSk7CisgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBJQmluZGVyW10gaW5wdXQgPSB7bmV3IEJpbmRlcigpLCBudWxsfTsKKyAgICAgIElCaW5kZXJbXSByZXBlYXRlZCA9IG5ldyBJQmluZGVyW2lucHV0Lmxlbmd0aF07CisgICAgICBJQmluZGVyW10gcmV2ZXJzZWQgPSBtU2VydmljZS5SZXZlcnNlTnVsbGFibGVJQmluZGVyQXJyYXkoaW5wdXQsIHJlcGVhdGVkKTsKKworICAgICAgYXNzZXJ0VGhhdChyZXBlYXRlZCwgaXMoaW5wdXQpKTsKKyAgICAgIGFzc2VydFRoYXQocmV2ZXJzZWQubGVuZ3RoLCBpcyhpbnB1dC5sZW5ndGgpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaW50IGogPSByZXZlcnNlZC5sZW5ndGggLSAoMSArIGkpOworICAgICAgICBhc3NlcnRUaGF0KHJldmVyc2VkW2pdLCBpcyhpbnB1dFtpXSkpOworICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxhYmxlSUludGVyZmFjZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBJTmFtZWRDYWxsYmFjayBjYWxsYmFjayAgPSBtU2VydmljZS5HZXRDYWxsYmFjayhmYWxzZSk7CiAgICAgICAgIGFzc2VydFRoYXQoY2FsbGJhY2ssIGlzKG5vdE51bGxWYWx1ZSgpKSk7CmRpZmYgLS1naXQgYS90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvVGVzdFNlcnZpY2VDbGllbnQuamF2YSBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhCmluZGV4IGUxZThlOGIuLmU5MTQwY2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhCisrKyBiL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0U2VydmljZUNsaWVudC5qYXZhCkBAIC0xOCwxNiArMTgsMjMgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXNOdWxsLm5vdE51bGxWYWx1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCitpbXBvcnQgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JUmVwZWF0Rml4ZWRTaXplQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5haWRsLmZpeGVkc2l6ZWFycmF5LkZpeGVkU2l6ZUFycmF5RXhhbXBsZS5JbnRQYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CYWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5CeXRlRW51bTsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuR2VuZXJpY1N0cnVjdHVyZWRQYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JTmFtZWRDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmFpZGwudGVzdHMuSVRlc3RTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5JVGVzdFNlcnZpY2UuQ29tcGlsZXJDaGVja3M7CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkludEVudW07CiBpbXBvcnQgYW5kcm9pZC5haWRsLnRlc3RzLkxvbmdFbnVtOwogaW1wb3J0IGFuZHJvaWQuYWlkbC50ZXN0cy5TaW1wbGVQYXJjZWxhYmxlOwpAQCAtMzcsOSArNDQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwpAQCAtNTAsNiArNTksNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0yODMsNiArMjkzLDM4IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGVyQXJyYXlFeGNoYW5nZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgU3RyaW5nW10gbmFtZXMgPSB7IkZpenoiLCAiQnV6eiJ9OworICAgICAgSU5hbWVkQ2FsbGJhY2tbXSBnb3QgPSBzZXJ2aWNlLkdldEludGVyZmFjZUFycmF5KG5hbWVzKTsKKyAgICAgIGFzc2VydFRoYXQoZ290WzBdLkdldE5hbWUoKSwgaXMobmFtZXNbMF0pKTsKKyAgICAgIGFzc2VydFRoYXQoZ290WzFdLkdldE5hbWUoKSwgaXMobmFtZXNbMV0pKTsKKworICAgICAgYXNzZXJ0VGhhdChzZXJ2aWNlLlZlcmlmeU5hbWVzV2l0aEludGVyZmFjZUFycmF5KGdvdCwgbmFtZXMpLCBpcyh0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbGFibGVCaW5kZXJBcnJheUV4Y2hhbmdlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsiRml6eiIsIG51bGwsICJCdXp6In07CisgICAgICBJTmFtZWRDYWxsYmFja1tdIGdvdCA9IHNlcnZpY2UuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcyk7CisgICAgICBhc3NlcnRUaGF0KGdvdFswXS5HZXROYW1lKCksIGlzKG5hbWVzWzBdKSk7CisgICAgICBhc3NlcnROdWxsKGdvdFsxXSk7CisgICAgICBhc3NlcnRUaGF0KGdvdFsyXS5HZXROYW1lKCksIGlzKG5hbWVzWzJdKSk7CisKKyAgICAgIGFzc2VydFRoYXQoc2VydmljZS5WZXJpZnlOYW1lc1dpdGhOdWxsYWJsZUludGVyZmFjZUFycmF5KGdvdCwgbmFtZXMpLCBpcyh0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlTGlzdEV4Y2hhbmdlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsiRml6eiIsIG51bGwsICJCdXp6In07CisgICAgICBMaXN0PElOYW1lZENhbGxiYWNrPiBnb3QgPSBzZXJ2aWNlLkdldEludGVyZmFjZUxpc3QobmFtZXMpOworICAgICAgYXNzZXJ0VGhhdChnb3QuZ2V0KDApLkdldE5hbWUoKSwgaXMobmFtZXNbMF0pKTsKKyAgICAgIGFzc2VydE51bGwoZ290LmdldCgxKSk7CisgICAgICBhc3NlcnRUaGF0KGdvdC5nZXQoMikuR2V0TmFtZSgpLCBpcyhuYW1lc1syXSkpOworCisgICAgICBhc3NlcnRUaGF0KHNlcnZpY2UuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChnb3QsIG5hbWVzKSwgaXModHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExpc3RSZXZlcnNhbCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBMaXN0PFN0cmluZz4gaW5wdXQgPSBBcnJheXMuYXNMaXN0KCJXYWxrIiwgImludG8iLCAiQ8OzcmRvYmEiKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IGVjaG9lZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtMzE0LDYgKzM1NiwxOSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFBhcmNlbGFibGUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgIGFzc3VtZVRydWUoY3BwX2phdmFfdGVzdHMgIT0gbnVsbCk7CisgICAgICBCYWRQYXJjZWxhYmxlIGJhZCA9IG5ldyBCYWRQYXJjZWxhYmxlKC8qYmFkPSovdHJ1ZSwgImZvbyIsIDQyKTsKKyAgICAgIFRocm93YWJsZSBlcnJvciA9CisgICAgICAgICAgYXNzZXJ0VGhyb3dzKEJhZFBhcmNlbGFibGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGNwcF9qYXZhX3Rlc3RzLlJlcGVhdEJhZFBhcmNlbGFibGUoYmFkKSk7CisgICAgICBhc3NlcnRUcnVlKGVycm9yLmdldE1lc3NhZ2UoKS5jb250YWlucygiUGFyY2VsIGRhdGEgbm90IGZ1bGx5IGNvbnN1bWVkIikpOworCisgICAgICBCYWRQYXJjZWxhYmxlIG5vdEJhZCA9IG5ldyBCYWRQYXJjZWxhYmxlKC8qYmFkPSovZmFsc2UsICJmb28iLCA0Mik7CisgICAgICBCYWRQYXJjZWxhYmxlIG91dHB1dCA9IGNwcF9qYXZhX3Rlc3RzLlJlcGVhdEJhZFBhcmNlbGFibGUobm90QmFkKTsKKyAgICAgIGFzc2VydFRoYXQobm90QmFkLCBpcyhvdXRwdXQpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRQYXJjZWxhYmxlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc3VtZVRydWUoY3BwX2phdmFfdGVzdHMgIT0gbnVsbCk7CiAKQEAgLTQzNyw2ICs0OTIsMjEgQEAKICAgICAgICAgYXNzZXJ0VGhhdChyZXZlcnNlZFsyXS5nZXREb3VibGUodGVzdERvdWJsZUtleSksIGlzKGlucHV0WzBdLmdldERvdWJsZSh0ZXN0RG91YmxlS2V5KSkpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB3cml0ZVRvRmQoRmlsZURlc2NyaXB0b3IgZmQsIGJ5dGVbXSB0ZXN0RGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmZCk7CisgICAgICBmZFN0cmVhbS53cml0ZSh0ZXN0RGF0YSk7CisgICAgICBmZFN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGaWxlQ29udGVudHMoU3RyaW5nIGZpbGUsIGJ5dGVbXSB0ZXN0RGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgYnl0ZVtdIHJlYWREYXRhID0gbmV3IGJ5dGVbdGVzdERhdGEubGVuZ3RoXTsKKworICAgICAgYXNzZXJ0VGhhdChmaXMucmVhZChyZWFkRGF0YSksIGlzKHJlYWREYXRhLmxlbmd0aCkpOworICAgICAgYXNzZXJ0VGhhdChyZWFkRGF0YSwgaXModGVzdERhdGEpKTsKKyAgICAgIGFzc2VydFRoYXQoZmlzLnJlYWQoKSwgaXMoLTEpKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRGVzY3JpcHRvclBhc3NpbmcoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGFzc3VtZVRydWUoY3BwX2phdmFfdGVzdHMgIT0gbnVsbCk7CkBAIC00NDgsMTggKzUxOCw0MyBAQAogICAgICAgICBGaWxlRGVzY3JpcHRvciBqb3VybmV5ZWQgPSBjcHBfamF2YV90ZXN0cy5SZXBlYXRGaWxlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKICAgICAgICAgZm9zLmNsb3NlKCk7CiAKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBqb3VybmV5ZWRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShqb3VybmV5ZWQpOwotCiAgICAgICAgIFN0cmluZyB0ZXN0RGF0YSA9ICJGcmF6emxlU25henpsZUZsaW1GbGFtRmxpYmJpdHlHdW1ib0Nob3BzIjsKLSAgICAgICAgYnl0ZVtdIG91dHB1dCA9IHRlc3REYXRhLmdldEJ5dGVzKCk7Ci0gICAgICAgIGpvdXJuZXllZFN0cmVhbS53cml0ZShvdXRwdXQpOwotICAgICAgICBqb3VybmV5ZWRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgd3JpdGVUb0ZkKGpvdXJuZXllZCwgdGVzdERhdGEuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHZlcmlmeUZpbGVDb250ZW50cyhmaWxlLCB0ZXN0RGF0YS5nZXRCeXRlcygpKTsKKyAgICB9CiAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW291dHB1dC5sZW5ndGhdOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVEZXNjcmlwdG9yQXJyYXlQYXNzaW5nKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgYXNzdW1lVHJ1ZShjcHBfamF2YV90ZXN0cyAhPSBudWxsKTsKIAotICAgICAgICBhc3NlcnRUaGF0KGZpcy5yZWFkKGlucHV0KSwgaXMoaW5wdXQubGVuZ3RoKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoaW5wdXQsIGlzKG91dHB1dCkpOworICAgICAgZmluYWwgaW50IGtUZXN0U2l6ZSA9IDI7CisKKyAgICAgIFN0cmluZyBmaWxlQmFzZSA9ICIvZGF0YS9sb2NhbC90bXAvYWlkbC10ZXN0LWZpbGVfIjsKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1trVGVzdFNpemVdOyAvLyBhbnkgc2l6ZSB0byB0ZXN0CisgICAgICBGaWxlT3V0cHV0U3RyZWFtW10gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1ba1Rlc3RTaXplXTsKKyAgICAgIEZpbGVEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRmlsZURlc2NyaXB0b3Jba1Rlc3RTaXplXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RTaXplOyBpKyspIHsKKyAgICAgICAgZmlsZXNbaV0gPSBmaWxlQmFzZSArIGk7CisgICAgICAgIGZvc1tpXSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVzW2ldLCBmYWxzZSAvKmFwcGVuZCovKTsKKyAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBmb3NbaV0uZ2V0RkQoKTsKKyAgICAgIH0KKworICAgICAgRmlsZURlc2NyaXB0b3JbXSByZXBlYXRlZCA9IG5ldyBGaWxlRGVzY3JpcHRvcltrVGVzdFNpemVdOworICAgICAgRmlsZURlc2NyaXB0b3JbXSByZXZlcnNlZCA9IGNwcF9qYXZhX3Rlc3RzLlJldmVyc2VGaWxlRGVzY3JpcHRvckFycmF5KGRlc2NyaXB0b3JzLCByZXBlYXRlZCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RTaXplOyBpKyspIHsKKyAgICAgICAgZm9zW2ldLmNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RTaXplOyBpKyspIHsKKyAgICAgICAgU3RyaW5nIHRlc3REYXRhID0gIlNvbWV0aGluZyAiICsgaTsKKworICAgICAgICB3cml0ZVRvRmQocmV2ZXJzZWRba1Rlc3RTaXplIC0gMSAtIGldLCB0ZXN0RGF0YS5nZXRCeXRlcygpKTsKKyAgICAgICAgdmVyaWZ5RmlsZUNvbnRlbnRzKGZpbGVzW2ldLCB0ZXN0RGF0YS5nZXRCeXRlcygpKTsKKworICAgICAgICB3cml0ZVRvRmQocmVwZWF0ZWRbaV0sIHRlc3REYXRhLmdldEJ5dGVzKCkpOworICAgICAgICB2ZXJpZnlGaWxlQ29udGVudHMoZmlsZXNbaV0sICh0ZXN0RGF0YSArIHRlc3REYXRhKS5nZXRCeXRlcygpKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdApAQCAtNTEyLDcgKzYwNyw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlVXRmOFN0cmluZ0FycmF5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGlucHV0ID0gKFN0cmluZ1tdKXV0ZjhfcXVlcmllcy50b0FycmF5KCk7CisgICAgICAgIFN0cmluZ1tdIGlucHV0ID0gdXRmOF9xdWVyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CiAgICAgICAgIFN0cmluZyBlY2hvZWRbXSA9IG5ldyBTdHJpbmdbaW5wdXQubGVuZ3RoXTsKIAogICAgICAgICBTdHJpbmdbXSByZXZlcnNlZCA9IHNlcnZpY2UuUmV2ZXJzZVV0ZjhDcHBTdHJpbmcoaW5wdXQsIGVjaG9lZCk7CkBAIC01MzUsNyArNjMwLDcgQEAKICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgIC8vIEphdmEgZG9lc24ndCBoYW5kbGUgdW5pY29kZSBjb2RlIHBvaW50cyBhYm92ZSBVK0ZGRkYgd2VsbC4KICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKENoYXJhY3Rlci50b0NoYXJzKDB4MUY3MDEpKSArICJcdTAzQTkiKTsKLSAgICAgICAgU3RyaW5nW10gaW5wdXQgPSAoU3RyaW5nW10pdXRmOF9xdWVyaWVzX2FuZF9udWxscy50b0FycmF5KCk7CisgICAgICAgIFN0cmluZ1tdIGlucHV0ID0gdXRmOF9xdWVyaWVzX2FuZF9udWxscy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwogICAgICAgICBTdHJpbmcgZWNob2VkW10gPSBuZXcgU3RyaW5nW2lucHV0Lmxlbmd0aF07CiAKICAgICAgICAgU3RyaW5nW10gcmV2ZXJzZWQgPSBzZXJ2aWNlLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5wdXQsIGVjaG9lZCk7CkBAIC01NjYsNyArNjYxLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVjUGFyY2VsYWJsZUVxdWFsaXR5KCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkUGFyY2VsYWJsZUVxdWFsaXR5KCkgewogICAgICAgICBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSBwID0gbmV3IFN0cnVjdHVyZWRQYXJjZWxhYmxlKCk7CiAgICAgICAgIHAuc2hvdWxkQ29udGFpblRocmVlRnMgPSBuZXcgaW50W10gezEsIDIsIDN9OwogICAgICAgICBwLnNob3VsZEJlSmVycnkgPSAiSmVycnkiOwpAQCAtNTg4LDcgKzY4Myw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN1dHVyZWRQYXJjZWxhYmxlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWRQYXJjZWxhYmxlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBrRGVzaXJlZEZWYWx1ZSA9IDE3OwogCiAgICAgICAgIFN0cnVjdHVyZWRQYXJjZWxhYmxlIHAgPSBuZXcgU3RydWN0dXJlZFBhcmNlbGFibGUoKTsKQEAgLTU5OCw2ICs2OTMsNyBAQAogICAgICAgICBwLnNob3VsZENvbnRhaW5Ud29CeXRlRm9vcyA9IG5ldyBieXRlWzJdOwogICAgICAgICBwLnNob3VsZENvbnRhaW5Ud29JbnRGb29zID0gbmV3IGludFsyXTsKICAgICAgICAgcC5zaG91bGRDb250YWluVHdvTG9uZ0Zvb3MgPSBuZXcgbG9uZ1syXTsKKyAgICAgICAgcC5lbXB0eSA9IG5ldyBTdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eSgpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBkZWZhdWx0IHZhbHVlcwogICAgICAgICBhc3NlcnRUaGF0KHAuc3RyaW5nRGVmYXVsdHNUb0ZvbywgaXMoImZvbyIpKTsKQEAgLTYyOCw2ICs3MjQsOSBAQAogICAgICAgICBhc3NlcnRUaGF0KHAuaW50MzJfbWF4LCBpcyhJbnRlZ2VyLk1BWF9WQUxVRSkpOwogICAgICAgICBhc3NlcnRUaGF0KHAuaW50NjRfbWF4LCBpcyhMb25nLk1BWF9WQUxVRSkpOwogICAgICAgICBhc3NlcnRUaGF0KHAuaGV4SW50MzJfbmVnXzEsIGlzKC0xKSk7CisgICAgICAgIGZvciAoaW50IG5keCA9IDA7IG5keCA8IHAuaW50OF8xLmxlbmd0aDsgbmR4KyspIHsKKyAgICAgICAgICBhc3NlcnRUaGF0KHAuaW50OF8xW25keF0sIGlzKChieXRlKSAxKSk7CisgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgbmR4ID0gMDsgbmR4IDwgcC5pbnQzMl8xLmxlbmd0aDsgbmR4KyspIHsKICAgICAgICAgICAgIGFzc2VydFRoYXQocC5pbnQzMl8xW25keF0sIGlzKDEpKTsKICAgICAgICAgfQpAQCAtNjg3LDYgKzc4Niw4IEBACiAgICAgICAgICAgICArICJpbnQ2NF9tYXg6IDkyMjMzNzIwMzY4NTQ3NzU4MDcsICIKICAgICAgICAgICAgICsgImhleEludDMyX25lZ18xOiAtMSwgIgogICAgICAgICAgICAgKyAiaWJpbmRlcjogbnVsbCwgIgorICAgICAgICAgICAgKyAiZW1wdHk6IGFuZHJvaWQuYWlkbC50ZXN0cy5TdHJ1Y3R1cmVkUGFyY2VsYWJsZS5FbXB0eXt9LCAiCisgICAgICAgICAgICArICJpbnQ4XzE6IFsxLCAxLCAxLCAxLCAxXSwgIgogICAgICAgICAgICAgKyAiaW50MzJfMTogWzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICIKICAgICAgICAgICAgICsgIjEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICIKICAgICAgICAgICAgICsgIjEsIDEsIDEsIDFdLCAiCkBAIC04MzQsNCArOTM1LDcxIEBACiAgICAgICBhc3NlcnRUaGF0KHJlcGVhdGVkLmdldE5zKCksIGlzKG5ldyBpbnRbXSB7MSwgMiwgM30pKTsKICAgICAgIGFzc2VydFRoYXQocmV2ZXJzZWQuZ2V0TnMoKSwgaXMobmV3IGludFtdIHszLCAyLCAxfSkpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldmVyc2VSZWN1cnNpdmVMaXN0KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICBSZWN1cnNpdmVMaXN0IGhlYWQgPSBudWxsOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgIFJlY3Vyc2l2ZUxpc3Qgbm9kZSA9IG5ldyBSZWN1cnNpdmVMaXN0KCk7CisgICAgICAgIG5vZGUudmFsdWUgPSBpOworICAgICAgICBub2RlLm5leHQgPSBoZWFkOworICAgICAgICBoZWFkID0gbm9kZTsKKyAgICAgIH0KKyAgICAgIC8vIGhlYWQ6IFs5LCA4LCAuLiAsIDBdCisgICAgICBSZWN1cnNpdmVMaXN0IHJldmVyc2VkID0gc2VydmljZS5SZXZlcnNlTGlzdChoZWFkKTsKKyAgICAgIC8vIHJldmVyc2VkIHNob3VsZCBiZSBbMCwgMSwgLi4gOV0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBhc3NlcnRUaGF0KHJldmVyc2VkLnZhbHVlLCBpcyhpKSk7CisgICAgICAgIHJldmVyc2VkID0gcmV2ZXJzZWQubmV4dDsKKyAgICAgIH0KKyAgICAgIGFzc2VydE51bGwocmV2ZXJzZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29udGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIENvbXBpbGVyQ2hlY2tzIGNjID0gbmV3IENvbXBpbGVyQ2hlY2tzKCk7CisgICAgICBjYy5wZmRfYXJyYXkgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSB7bnVsbCwgbnVsbCwgbnVsbH07CisgICAgICBhc3NlcnRUaGF0KGNjLmRlc2NyaWJlQ29udGVudHMoKSwgaXMoMCkpOworCisgICAgICBTdHJpbmcgZmlsZSA9ICIvZGF0YS9sb2NhbC90bXAvYWlkbC10ZXN0LWZpbGUiOworICAgICAgY2MucGZkX2FycmF5WzFdID0gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbigKKyAgICAgICAgICBuZXcgRmlsZShmaWxlKSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9DUkVBVEUgfCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1dSSVRFX09OTFkpOworICAgICAgYXNzZXJ0VGhhdChjYy5kZXNjcmliZUNvbnRlbnRzKCksIGlzKFBhcmNlbGFibGUuQ09OVEVOVFNfRklMRV9ERVNDUklQVE9SKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRTaXplQXJyYXlPdmVyQmluZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBJQmluZGVyIGJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLndhaXRGb3JTZXJ2aWNlKElSZXBlYXRGaXhlZFNpemVBcnJheS5ERVNDUklQVE9SKTsKKyAgICAgIGFzc2VydE5vdE51bGwoYmluZGVyKTsKKyAgICAgIElSZXBlYXRGaXhlZFNpemVBcnJheSBzZXJ2aWNlID0gSVJlcGVhdEZpeGVkU2l6ZUFycmF5LlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKyAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7CisKKyAgICAgIHsKKyAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbXSB7MSwgMiwgM307CisgICAgICAgIGJ5dGVbXSByZXBlYXRlZCA9IG5ldyBieXRlWzNdOworICAgICAgICBieXRlW10gb3V0cHV0ID0gc2VydmljZS5SZXBlYXRCeXRlcyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgaW50W10gaW5wdXQgPSBuZXcgaW50W10gezEsIDIsIDN9OworICAgICAgICBpbnRbXSByZXBlYXRlZCA9IG5ldyBpbnRbM107CisgICAgICAgIGludFtdIG91dHB1dCA9IHNlcnZpY2UuUmVwZWF0SW50cyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgcmVwZWF0ZWQpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBwMSA9IG5ldyBJbnRQYXJjZWxhYmxlKCk7CisgICAgICAgIHAxLnZhbHVlID0gMTsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBwMiA9IG5ldyBJbnRQYXJjZWxhYmxlKCk7CisgICAgICAgIHAyLnZhbHVlID0gMTsKKyAgICAgICAgSW50UGFyY2VsYWJsZSBwMyA9IG5ldyBJbnRQYXJjZWxhYmxlKCk7CisgICAgICAgIHAzLnZhbHVlID0gMTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVtdW10gaW5wdXQgPSBuZXcgSW50UGFyY2VsYWJsZVtdW10ge3twMSwgcDIsIHAzfSwge3AxLCBwMiwgcDN9fTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVtdW10gcmVwZWF0ZWQgPSBuZXcgSW50UGFyY2VsYWJsZVsyXVszXTsKKyAgICAgICAgSW50UGFyY2VsYWJsZVtdW10gb3V0cHV0ID0gc2VydmljZS5SZXBlYXQyZFBhcmNlbGFibGVzKGlucHV0LCByZXBlYXRlZCk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlucHV0LCByZXBlYXRlZCk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlucHV0LCBvdXRwdXQpOworICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0VmVyc2lvbmVkSW50ZXJmYWNlLmphdmEgYi90ZXN0cy9qYXZhL3NyYy9hbmRyb2lkL2FpZGwvdGVzdHMvVGVzdFZlcnNpb25lZEludGVyZmFjZS5qYXZhCmluZGV4IGJiOTYzMzEuLmRkMjVjY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2phdmEvc3JjL2FuZHJvaWQvYWlkbC90ZXN0cy9UZXN0VmVyc2lvbmVkSW50ZXJmYWNlLmphdmEKKysrIGIvdGVzdHMvamF2YS9zcmMvYW5kcm9pZC9haWRsL3Rlc3RzL1Rlc3RWZXJzaW9uZWRJbnRlcmZhY2UuamF2YQpAQCAtOTIsOCArOTIsMjQgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZERhdGFDb3JyZWN0bHlBZnRlclBhcmNlbGFibGVXaXRoTmV3RmllbGQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgIEZvbyBpbkZvbyA9IG5ldyBGb28oKTsKICAgICAgIEZvbyBpbm91dEZvbyA9IG5ldyBGb28oKTsKKyAgICAgIGlub3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CiAgICAgICBGb28gb3V0Rm9vID0gbmV3IEZvbygpOworICAgICAgb3V0Rm9vLmludERlZmF1bHQ0MiA9IDA7CiAgICAgICBpbnQgcmV0ID0gc2VydmljZS5pZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludChpbkZvbywgaW5vdXRGb28sIG91dEZvbywgNDMpOwogICAgICAgYXNzZXJ0VGhhdChyZXQsIGlzKDQzKSk7CisgICAgICBhc3NlcnRUaGF0KGlub3V0Rm9vLmludERlZmF1bHQ0MiwgaXMoMCkpOworICAgICAgYXNzZXJ0VGhhdChvdXRGb28uaW50RGVmYXVsdDQyLCBpcygwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9yR2V0SW50ZXJmYWNlVmVyc2lvbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgSUZvb0ludGVyZmFjZS5EZWxlZ2F0b3IgZGVsZWdhdG9yID0gbmV3IElGb29JbnRlcmZhY2UuRGVsZWdhdG9yKHNlcnZpY2UpOworICAgICAgYXNzZXJ0VGhhdChkZWxlZ2F0b3IuZ2V0SW50ZXJmYWNlVmVyc2lvbigpLCBpcygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9yR2V0SW50ZXJmYWNlSGFzaCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgSUZvb0ludGVyZmFjZS5EZWxlZ2F0b3IgZGVsZWdhdG9yID0gbmV3IElGb29JbnRlcmZhY2UuRGVsZWdhdG9yKHNlcnZpY2UpOworICAgICAgYXNzZXJ0VGhhdChkZWxlZ2F0b3IuZ2V0SW50ZXJmYWNlSGFzaCgpLCBpcygiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiIpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvQW5kcm9pZC5icCBiL3Rlc3RzL2xhenlfdGVzdC9BbmRyb2lkLmJwCmluZGV4IGZlYTEyNjMuLjllYjgxNGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhenlfdGVzdC9BbmRyb2lkLmJwCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiw3IEBACiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGF6eV90ZXN0X3NlcnZpY2VfYWlkbC1jcHAiLAorICAgICAgICAibGF6eV9jYl90ZXN0X3NlcnZpY2VfYWlkbC1jcHAiLAogICAgIF0sCiB9CiAKQEAgLTUzLDMgKzU0LDMyIEBACiAgICAgICAgICJJTGF6eVRlc3RTZXJ2aWNlLmFpZGwiLAogICAgIF0sCiB9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFpZGxfbGF6eV9jYl90ZXN0X3NlcnZlciIsCisgICAgc3JjczogWworICAgICAgICAiU2VydmVyQ2IuY3BwIiwKKyAgICAgICAgIkxhenlUZXN0U2VydmljZUNiLmNwcCIsCisgICAgXSwKKyAgICBpbml0X3JjOiBbImFpZGxfbGF6eV9jYl90ZXN0X3NlcnZlci5yYyJdLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsYXp5X2NiX3Rlc3Rfc2VydmljZV9haWRsLWNwcCIsCisgICAgXSwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJsYXp5X2NiX3Rlc3Rfc2VydmljZV9haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBmbGFnczogWyItV2Vycm9yIl0sCisgICAgc3JjczogWworICAgICAgICAiSUxhenlUZXN0U2VydmljZUNiLmFpZGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvSUxhenlUZXN0U2VydmljZS5haWRsIGIvdGVzdHMvbGF6eV90ZXN0L0lMYXp5VGVzdFNlcnZpY2UuYWlkbAppbmRleCA0NjkzOWQ5Li45Y2FmZGQxIDEwMDY0NAotLS0gYS90ZXN0cy9sYXp5X3Rlc3QvSUxhenlUZXN0U2VydmljZS5haWRsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9JTGF6eVRlc3RTZXJ2aWNlLmFpZGwKQEAgLTE2LDExICsxNiw0IEBACiAKIGludGVyZmFjZSBJTGF6eVRlc3RTZXJ2aWNlIHsKICAgICB2b2lkIGZvcmNlUGVyc2lzdChib29sZWFuIHBlcnNpc3QpOwotICAgIC8qKgotICAgICAqIEFzayB0aGUgcHJvY2VzcyBob3N0aW5nIHRoZSBzZXJ2aWNlIHRvIGluc3RhbGwgYSBjYWxsYmFjayB0aGF0IG5vdGlmaWVzIGlmIHRoZXJlIGFyZQotCSAqIHNlcnZpY2VzIHdpdGggY2xpZW50cy4KLSAgICAgKiBGb3IgdGVzdGluZyBwdXJwb3NlcywgdGhpcyBjYWxsYmFjayBleGVyY2lzZXMgdGhlIGNvZGUgdG8gdW5yZWdpc3Rlci9yZS1yZWdpc3RlcgotICAgICAqIHRoZSBzZXJ2aWNlcyBhbmQgZXZlbnR1YWxseSBzaHV0cyBkb3duIHRoZSBwcm9jZXNzLgotICAgICAqLwotICAgIHZvaWQgc2V0Q3VzdG9tQWN0aXZlU2VydmljZXNDYWxsYmFjaygpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L0lMYXp5VGVzdFNlcnZpY2VDYi5haWRsIGIvdGVzdHMvbGF6eV90ZXN0L0lMYXp5VGVzdFNlcnZpY2VDYi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDQ3NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYXp5X3Rlc3QvSUxhenlUZXN0U2VydmljZUNiLmFpZGwKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ludGVyZmFjZSBJTGF6eVRlc3RTZXJ2aWNlQ2IgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXZlbnRmZCB1c2VkIHRvIG5vdGlmeSB0aGF0IHRoZSBhY3RpdmUgc2VydmljZXMKKyAgICAgKiBjYWxsYmFjayBpcyBiZWluZyBleGVjdXRlZCBhbmQgaXMgYWJvdXQgdG8gdGVybWluYXRlIHRoZSBwcm9jZXNzLgorICAgICAqLworICAgIHZvaWQgc2V0RXZlbnRGZChpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBwYXJjZWxGZCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlLmNwcCBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuY3BwCmluZGV4IGNlOGI0MDYuLmQ2YTVjZDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuY3BwCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuY3BwCkBAIC0yNywzNCArMjcsNSBAQAogICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgTGF6eVRlc3RTZXJ2aWNlOjpzZXRDdXN0b21BY3RpdmVTZXJ2aWNlc0NhbGxiYWNrKCkgewotICBhdXRvIGxhenlSZWdpc3RyYXIgPSBMYXp5U2VydmljZVJlZ2lzdHJhcjo6Z2V0SW5zdGFuY2UoKTsKLSAgbGF6eVJlZ2lzdHJhci5zZXRBY3RpdmVTZXJ2aWNlc0NhbGxiYWNrKFtsYXp5UmVnaXN0cmFyXShib29sIGhhc0NsaWVudHMpIG11dGFibGUgLT4gYm9vbCB7Ci0gICAgaWYgKGhhc0NsaWVudHMpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIGFsbCBzZXJ2aWNlcwotICAgIGlmICghbGF6eVJlZ2lzdHJhci50cnlVbnJlZ2lzdGVyKCkpIHsKLSAgICAgIC8vIFByZXZlbnQgc2h1dGRvd24gKHRlc3Qgd2lsbCBmYWlsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gUmUtcmVnaXN0ZXIgYWxsIHNlcnZpY2VzCi0gICAgbGF6eVJlZ2lzdHJhci5yZVJlZ2lzdGVyKCk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIGFnYWluIGJlZm9yZSBzaHV0ZG93bgotICAgIGlmICghbGF6eVJlZ2lzdHJhci50cnlVbnJlZ2lzdGVyKCkpIHsKLSAgICAgIC8vIFByZXZlbnQgc2h1dGRvd24gKHRlc3Qgd2lsbCBmYWlsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZXhpdChFWElUX1NVQ0NFU1MpOwotICAgIC8vIFVucmVhY2hhYmxlCi0gIH0pOwotCi0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlLmggYi90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlLmgKaW5kZXggZmJhYjFmNS4uMzFkMTE1NSAxMDA2NDQKLS0tIGEvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZS5oCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2UuaApAQCAtMjgsNyArMjgsNiBAQAogICB2aXJ0dWFsIH5MYXp5VGVzdFNlcnZpY2UoKSB7fQogCiAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZm9yY2VQZXJzaXN0KGJvb2wgcGVyc2lzdCk7Ci0gIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgc2V0Q3VzdG9tQWN0aXZlU2VydmljZXNDYWxsYmFjaygpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZUNiLmNwcCBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2VDYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9MYXp5VGVzdFNlcnZpY2VDYi5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0xhenlTZXJ2aWNlUmVnaXN0cmFyLmg+CisjaW5jbHVkZSAiTGF6eVRlc3RTZXJ2aWNlQ2IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJpbmRlciB7CisKK3ZvaWQgTGF6eVRlc3RTZXJ2aWNlQ2I6OnNldEN1c3RvbUFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soKSB7CisgIGF1dG8gbGF6eVJlZ2lzdHJhciA9IExhenlTZXJ2aWNlUmVnaXN0cmFyOjpnZXRJbnN0YW5jZSgpOworICBsYXp5UmVnaXN0cmFyLnNldEFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soW2xhenlSZWdpc3RyYXIsIHRoaXNdKGJvb2wgaGFzQ2xpZW50cykgbXV0YWJsZSAtPiBib29sIHsKKyAgICBpZiAoaGFzQ2xpZW50cykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAvLyBQcmV2ZW50IHNodXRkb3duICh0ZXN0IHdpbGwgZmFpbCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFVucmVnaXN0ZXIgYWxsIHNlcnZpY2VzCisgICAgaWYgKCFsYXp5UmVnaXN0cmFyLnRyeVVucmVnaXN0ZXIoKSkgeworICAgICAgLy8gUHJldmVudCBzaHV0ZG93biAodGVzdCB3aWxsIGZhaWwpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZS1yZWdpc3RlciBhbGwgc2VydmljZXMKKyAgICBsYXp5UmVnaXN0cmFyLnJlUmVnaXN0ZXIoKTsKKworICAgIC8vIFVucmVnaXN0ZXIgYWdhaW4gYmVmb3JlIHNodXRkb3duCisgICAgaWYgKCFsYXp5UmVnaXN0cmFyLnRyeVVucmVnaXN0ZXIoKSkgeworICAgICAgLy8gUHJldmVudCBzaHV0ZG93biAodGVzdCB3aWxsIGZhaWwpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBUZWxsIHRoZSB0ZXN0IHdlJ3JlIHNodXR0aW5nIGRvd24KKyAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKGV2ZW50ZmRfd3JpdGUobUZkLCAvKiB2YWx1ZSAqLyAxKSkgPCAwKSB7CisgICAgICAvLyBQcmV2ZW50IHNodXRkb3duICh0ZXN0IHdpbGwgZmFpbCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgICAvLyBVbnJlYWNoYWJsZQorICB9KTsKK30KKworU3RhdHVzIExhenlUZXN0U2VydmljZUNiOjpzZXRFdmVudEZkKGNvbnN0IDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yJiBwYXJjZWxGZCkgeworICBtRmQgPSBkdXAocGFyY2VsRmQuZ2V0KCkpOworCisgIHJldHVybiBtRmQgPCAwID8gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpIDogU3RhdHVzOjpvaygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmluZGVyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZUNiLmggYi90ZXN0cy9sYXp5X3Rlc3QvTGF6eVRlc3RTZXJ2aWNlQ2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZjODA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGF6eV90ZXN0L0xhenlUZXN0U2VydmljZUNiLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Qm5MYXp5VGVzdFNlcnZpY2VDYi5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJpbmRlciB7CisKK2NsYXNzIExhenlUZXN0U2VydmljZUNiIDogcHVibGljIEJuTGF6eVRlc3RTZXJ2aWNlQ2IgeworIHB1YmxpYzoKKyAgTGF6eVRlc3RTZXJ2aWNlQ2IoKSA6IG1GZCgtMSkge30KKyAgdmlydHVhbCB+TGF6eVRlc3RTZXJ2aWNlQ2IoKSB7fQorCisgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgc2V0RXZlbnRGZChjb25zdCA6OmFuZHJvaWQ6Om9zOjpQYXJjZWxGaWxlRGVzY3JpcHRvciYgcGFyY2VsRmQpOworICB2b2lkIHNldEN1c3RvbUFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soKTsKKworIHByaXZhdGU6CisgIGludCBtRmQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmluZGVyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L1NlcnZlckNiLmNwcCBiL3Rlc3RzL2xhenlfdGVzdC9TZXJ2ZXJDYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkOWVjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9TZXJ2ZXJDYi5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTGF6eVNlcnZpY2VSZWdpc3RyYXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJMYXp5VGVzdFNlcnZpY2VDYi5oIgorCit1c2luZyBhbmRyb2lkOjpCQmluZGVyOwordXNpbmcgYW5kcm9pZDo6SUJpbmRlcjsKK3VzaW5nIGFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOwordXNpbmcgYW5kcm9pZDo6T0s7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6TGF6eVNlcnZpY2VSZWdpc3RyYXI7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OkxhenlUZXN0U2VydmljZUNiOworCitpbnQgbWFpbigpIHsKKyAgc3A8TGF6eVRlc3RTZXJ2aWNlQ2I+IHNlcnZpY2UgPSBuZXcgTGF6eVRlc3RTZXJ2aWNlQ2IoKTsKKworICAvLyBTZXQgdGhlIGNhbGxiYWNrIGJlZm9yZSByZWdpc3RlcmluZyB0aGUgc2VydmljZQorICBzZXJ2aWNlLT5zZXRDdXN0b21BY3RpdmVTZXJ2aWNlc0NhbGxiYWNrKCk7CisKKyAgYXV0byBsYXp5UmVnaXN0cmFyID0gTGF6eVNlcnZpY2VSZWdpc3RyYXI6OmdldEluc3RhbmNlKCk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoT0sgIT0gbGF6eVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2Uoc2VydmljZSwgImFpZGxfbGF6eV9jYl90ZXN0IiksICIiKTsKKworICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF6eV90ZXN0L2FpZGxfbGF6eV9jYl90ZXN0X3NlcnZlci5yYyBiL3Rlc3RzL2xhenlfdGVzdC9haWRsX2xhenlfY2JfdGVzdF9zZXJ2ZXIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiNTA1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9haWRsX2xhenlfY2JfdGVzdF9zZXJ2ZXIucmMKQEAgLTAsMCArMSw2IEBACitzZXJ2aWNlIGFpZGxfbGF6eV9jYl90ZXN0IC9zeXN0ZW1fZXh0L2Jpbi9haWRsX2xhenlfY2JfdGVzdF9zZXJ2ZXIKKyAgICBpbnRlcmZhY2UgYWlkbCBhaWRsX2xhenlfY2JfdGVzdAorICAgIHVzZXIgc3lzdGVtCisgICAgZ3JvdXAgc3lzdGVtCisgICAgb25lc2hvdAorICAgIGRpc2FibGVkCmRpZmYgLS1naXQgYS90ZXN0cy9sYXp5X3Rlc3QvbWFpbi5jcHAgYi90ZXN0cy9sYXp5X3Rlc3QvbWFpbi5jcHAKaW5kZXggZTFmYTVmMS4uMGE4MzkzZiAxMDA2NDQKLS0tIGEvdGVzdHMvbGF6eV90ZXN0L21haW4uY3BwCisrKyBiL3Rlc3RzL2xhenlfdGVzdC9tYWluLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxjdGltZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KQEAgLTIxLDkgKzIyLDExIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KIAorI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8SUxhenlUZXN0U2VydmljZS5oPgorI2luY2x1ZGUgPElMYXp5VGVzdFNlcnZpY2VDYi5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgpAQCAtMzUsOSArMzgsMTIgQEAKIHVzaW5nIDo6YW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIHVzaW5nIDo6YW5kcm9pZDo6U3RyaW5nMTY7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIDo6YW5kcm9pZDo6b3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogCiBzdGQ6OnZlY3RvcjxTdHJpbmcxNj4gZ1NlcnZpY2VOYW1lczsKIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IFNIVVRET1dOX1dBSVRfVElNRSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQ0FMTEJBQ0tfU0hVVERPV05fV0FJVF9USU1FID0gNTsKIAogc3A8SUJpbmRlcj4gd2FpdEZvclNlcnZpY2UoY29uc3QgU3RyaW5nMTYmIG5hbWUpIHsKICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBtYW5hZ2VyOwpAQCAtMTY2LDggKzE3Miw5IEBACiAgIH0KIH07CiAKLXNwPElMYXp5VGVzdFNlcnZpY2U+IHdhaXRGb3JMYXp5VGVzdFNlcnZpY2UoU3RyaW5nMTYgbmFtZSkgewotICBzcDxJTGF6eVRlc3RTZXJ2aWNlPiBzZXJ2aWNlID0gYW5kcm9pZDo6d2FpdEZvclNlcnZpY2U8SUxhenlUZXN0U2VydmljZT4obmFtZSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3NwPFQ+IHdhaXRGb3JMYXp5VGVzdFNlcnZpY2UoU3RyaW5nMTYgbmFtZSkgeworICBzcDxUPiBzZXJ2aWNlID0gYW5kcm9pZDo6d2FpdEZvclNlcnZpY2U8VD4obmFtZSk7CiAgIEVYUEVDVF9ORShzZXJ2aWNlLCBudWxscHRyKTsKICAgcmV0dXJuIHNlcnZpY2U7CiB9CkBAIC0xNzUsNyArMTgyLDcgQEAKIFRFU1RfRihBaWRsTGF6eVJlZ2lzdHJhclRlc3QsIEZvcmNlZFBlcnNpc3RlbmNlVGVzdCkgewogICBzcDxJTGF6eVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgIHNlcnZpY2UgPSB3YWl0Rm9yTGF6eVRlc3RTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKyAgICBzZXJ2aWNlID0gd2FpdEZvckxhenlUZXN0U2VydmljZTxJTGF6eVRlc3RTZXJ2aWNlPihzZXJ2aWNlTmFtZSk7CiAgICAgRVhQRUNUX1RSVUUoc2VydmljZS0+Zm9yY2VQZXJzaXN0KGkgPT0gMCkuaXNPaygpKTsKICAgICBzZXJ2aWNlID0gbnVsbHB0cjsKIApAQCAtMTkzLDE1ICsyMDAsNDkgQEAKIH0KIAogVEVTVF9GKEFpZGxMYXp5UmVnaXN0cmFyVGVzdCwgQWN0aXZlU2VydmljZXNDb3VudENhbGxiYWNrVGVzdCkgewotICBzcDxJTGF6eVRlc3RTZXJ2aWNlPiBzZXJ2aWNlOwotICBzZXJ2aWNlID0gd2FpdEZvckxhenlUZXN0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gIEFTU0VSVF9UUlVFKHNlcnZpY2UtPnNldEN1c3RvbUFjdGl2ZVNlcnZpY2VzQ2FsbGJhY2soKS5pc09rKCkpOworICBjb25zdCBTdHJpbmcxNiBjYlNlcnZpY2VOYW1lID0gU3RyaW5nMTYoImFpZGxfbGF6eV9jYl90ZXN0Iik7CisKKyAgaW50IGVmZCA9IGV2ZW50ZmQoMCwgMCk7CisgIEFTU0VSVF9HRShlZmQsIDApIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGV2ZW50ZmQiOworCisgIHVuaXF1ZV9mZCB1bmlxdWVFdmVudEZkKGVmZCk7CisgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBhcmNlbEV2ZW50RmQoc3RkOjptb3ZlKHVuaXF1ZUV2ZW50RmQpKTsKKworICBzcDxJTGF6eVRlc3RTZXJ2aWNlQ2I+IHNlcnZpY2U7CisgIHNlcnZpY2UgPSB3YWl0Rm9yTGF6eVRlc3RTZXJ2aWNlPElMYXp5VGVzdFNlcnZpY2VDYj4oY2JTZXJ2aWNlTmFtZSk7CisgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPnNldEV2ZW50RmQocGFyY2VsRXZlbnRGZCkuaXNPaygpKTsKICAgc2VydmljZSA9IG51bGxwdHI7CiAKLSAgc3RkOjpjb3V0IDw8ICJXYWl0aW5nICIgPDwgU0hVVERPV05fV0FJVF9USU1FIDw8ICIgc2Vjb25kcyBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGUgIgotICAgICAgICAgICAgPDwgInNlcnZpY2UgaXMgc3RpbGwgcnVubmluZy4iIDw8IHN0ZDo6ZW5kbDsKICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICBzbGVlcChTSFVURE9XTl9XQUlUX1RJTUUpOworCisgIHN0ZDo6Y291dCA8PCAiV2FpdGluZyAiIDw8IFNIVVRET1dOX1dBSVRfVElNRSA8PCAiIHNlY29uZHMgZm9yIGNhbGxiYWNrIGNvbXBsZXRpb24gIgorICAgICAgICAgICAgPDwgIm5vdGlmaWNhdGlvbi4iIDw8IHN0ZDo6ZW5kbDsKKworICBpbnQgZXBvbGxGZCA9IGVwb2xsX2NyZWF0ZTEoRVBPTExfQ0xPRVhFQyk7CisgIEFTU0VSVF9HRShlcG9sbEZkLCAwKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBlcG9sbCI7CisgIHVuaXF1ZV9mZCBlcG9sbFVuaXF1ZUZkKGVwb2xsRmQpOworCisgIGNvbnN0IGludCBFUE9MTF9NQVhfRVZFTlRTID0gMTsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50LCBldmVudHNbRVBPTExfTUFYX0VWRU5UU107CisKKyAgZXZlbnQuZXZlbnRzID0gRVBPTExJTjsKKyAgZXZlbnQuZGF0YS5mZCA9IGVmZDsKKyAgaW50IHJjID0gZXBvbGxfY3RsKGVwb2xsRmQsIEVQT0xMX0NUTF9BREQsIGVmZCwgJmV2ZW50KTsKKyAgQVNTRVJUX0dFKHJjLCAwKSA8PCAiRmFpbGVkIHRvIGFkZCBmZCB0byBlcG9sbCI7CisKKyAgcmMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoZXBvbGxfd2FpdChlcG9sbEZkLCBldmVudHMsIEVQT0xMX01BWF9FVkVOVFMsIFNIVVRET1dOX1dBSVRfVElNRSAqIDEwMDApKTsKKyAgQVNTRVJUX05FKHJjLCAwKSA8PCAiU2VydmljZSBzaHV0ZG93biB0aW1lb3V0IjsKKyAgQVNTRVJUX0dUKHJjLCAwKSA8PCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmljZSBzaHV0ZG93biBub3RpZmljYXRpb24iOworCisgIGV2ZW50ZmRfdCBjb3VudGVyOworICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShldmVudGZkX3JlYWQocGFyY2VsRXZlbnRGZC5nZXQoKSwgJmNvdW50ZXIpKTsKKyAgQVNTRVJUX0dFKHJjLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBjYWxsYmFjayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmcm9tIHNlcnZpY2UiOworICBBU1NFUlRfRVEoY291bnRlciwgMSk7CisKKyAgc3RkOjpjb3V0IDw8ICJXYWl0aW5nICIgPDwgQ0FMTEJBQ0tfU0hVVERPV05fV0FJVF9USU1FIDw8ICIgc2Vjb25kcyBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGUgIgorICAgICAgICAgICAgPDwgInNlcnZpY2UgaXMgc3RpbGwgcnVubmluZy4iIDw8IHN0ZDo6ZW5kbDsKKworICBzbGVlcChDQUxMQkFDS19TSFVURE9XTl9XQUlUX1RJTUUpOwogCiAgIEFTU0VSVF9GQUxTRShpc1NlcnZpY2VSdW5uaW5nKHNlcnZpY2VOYW1lKSkgPDwgIlNlcnZpY2UgZmFpbGVkIHRvIHNodXQgZG93bi4iOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnVzdC90ZXN0X2NsaWVudC5ycyBiL3Rlc3RzL3J1c3QvdGVzdF9jbGllbnQucnMKaW5kZXggMDcyNTE2MS4uMWQ3NTIzNCAxMDA2NDQKLS0tIGEvdGVzdHMvcnVzdC90ZXN0X2NsaWVudC5ycworKysgYi90ZXN0cy9ydXN0L3Rlc3RfY2xpZW50LnJzCkBAIC0xNiwyNSArMTYsNDYgQEAKIAogLy8hIFRlc3QgUnVzdCBjbGllbnQgZm9yIHRoZSBBSURMIGNvbXBpbGVyLgogCit1c2UgOjpiaW5kZXI6OntiaW5kZXJfaW1wbDo6UGFyY2VsLCBQYXJjZWxhYmxlfTsKK3VzZSBhaWRsX3Rlc3RfZml4ZWRzaXplYXJyYXk6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OmZpeGVkc2l6ZWFycmF5OjpGaXhlZFNpemVBcnJheUV4YW1wbGU6OnsKKyAgICBGaXhlZFNpemVBcnJheUV4YW1wbGUsCisgICAgSVJlcGVhdEZpeGVkU2l6ZUFycmF5Ojp7QnBSZXBlYXRGaXhlZFNpemVBcnJheSwgSVJlcGVhdEZpeGVkU2l6ZUFycmF5fSwKKyAgICBJbnRQYXJjZWxhYmxlOjpJbnRQYXJjZWxhYmxlLAorfTsKK3VzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bmVzdGVkOjp7CisgICAgSU5lc3RlZFNlcnZpY2UsIFBhcmNlbGFibGVXaXRoTmVzdGVkLAorfTsKK3VzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6dW5pb25zOjpFbnVtVW5pb246OkVudW1VbmlvbjsKIHVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6SU5ld05hbWU6OntzZWxmLCBCcE5ld05hbWV9OwogdXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJT2xkTmFtZTo6e3NlbGYsIEJwT2xkTmFtZX07CiB1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6ewotICAgIHNlbGYsIEJwVGVzdFNlcnZpY2UsIElUZXN0U2VydmljZURlZmF1bHQsIElUZXN0U2VydmljZURlZmF1bHRSZWYsCisgICAgc2VsZiwgQnBUZXN0U2VydmljZSwgRW1wdHk6OkVtcHR5LCBJVGVzdFNlcnZpY2VEZWZhdWx0LCBJVGVzdFNlcnZpY2VEZWZhdWx0UmVmLAogfTsKIHVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6ewotICAgIEJhY2tlbmRUeXBlOjpCYWNrZW5kVHlwZSwgQnl0ZUVudW06OkJ5dGVFbnVtLCBJbnRFbnVtOjpJbnRFbnVtLCBMb25nRW51bTo6TG9uZ0VudW0sIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBVbmlvbiwKKyAgICBleHRlbnNpb246OkV4dGVuZGFibGVQYXJjZWxhYmxlOjpFeHRlbmRhYmxlUGFyY2VsYWJsZSwgZXh0ZW5zaW9uOjpNeUV4dDo6TXlFeHQsCisgICAgZXh0ZW5zaW9uOjpNeUV4dDI6Ok15RXh0MiwgZXh0ZW5zaW9uOjpNeUV4dExpa2U6Ok15RXh0TGlrZSwgQmFja2VuZFR5cGU6OkJhY2tlbmRUeXBlLAorICAgIEJ5dGVFbnVtOjpCeXRlRW51bSwgSW50RW51bTo6SW50RW51bSwgTG9uZ0VudW06OkxvbmdFbnVtLCBSZWN1cnNpdmVMaXN0OjpSZWN1cnNpdmVMaXN0LAorICAgIFN0cnVjdHVyZWRQYXJjZWxhYmxlLCBVbmlvbiwKIH07Ci11c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OnVuaW9uczo6ewotICAgIEVudW1Vbmlvbjo6RW51bVVuaW9uLAordXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmJpbmRlcjo6e3NlbGYsIEJpbmRlckZlYXR1cmVzLCBJQmluZGVyLCBJbnRlcmZhY2V9OwordXNlIGFpZGxfdGVzdF9ub252aW50Zl9wYXJjZWxhYmxlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6bm9udmludGY6OnsKKyAgICBOb25WaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlOjpOb25WaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlLAorICAgIE5vblZpbnRmUGFyY2VsYWJsZTo6Tm9uVmludGZQYXJjZWxhYmxlLAogfTsKLXVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjpiaW5kZXI7Cit1c2UgYWlkbF90ZXN0X3Vuc3RhYmxlX3BhcmNlbGFibGU6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp1bnN0YWJsZTo6eworICAgIFVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGU6OlVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVW5zdGFibGVQYXJjZWxhYmxlOjpVbnN0YWJsZVBhcmNlbGFibGUsCit9OwogdXNlIGFpZGxfdGVzdF92ZXJzaW9uZWRfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjp7Ci0gICAgSUZvb0ludGVyZmFjZSwgSUZvb0ludGVyZmFjZTo6QnBGb29JbnRlcmZhY2UsIEJhelVuaW9uOjpCYXpVbmlvbiwKKyAgICBCYXpVbmlvbjo6QmF6VW5pb24sIEZvbzo6Rm9vLCBJRm9vSW50ZXJmYWNlLCBJRm9vSW50ZXJmYWNlOjpCcEZvb0ludGVyZmFjZSwKK307Cit1c2UgYWlkbF90ZXN0X3ZpbnRmX3BhcmNlbGFibGU6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp2aW50Zjo6eworICAgIFZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGU6OlZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUsIFZpbnRmUGFyY2VsYWJsZTo6VmludGZQYXJjZWxhYmxlLAogfTsKIHVzZSBzdGQ6OmZzOjpGaWxlOwogdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CiB1c2Ugc3RkOjpvczo6dW5peDo6aW86OkZyb21SYXdGZDsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKIAogZm4gZ2V0X3Rlc3Rfc2VydmljZSgpIC0+IGJpbmRlcjo6U3Ryb25nPGR5biBJVGVzdFNlcnZpY2U6OklUZXN0U2VydmljZT4gewogICAgIGJpbmRlcjo6Z2V0X2ludGVyZmFjZSg8QnBUZXN0U2VydmljZSBhcyBJVGVzdFNlcnZpY2U6OklUZXN0U2VydmljZT46OmdldF9kZXNjcmlwdG9yKCkpCkBAIC0xNjAsNyArMTgxLDcgQEAKICAgICAgICAgSVRlc3RTZXJ2aWNlOjpTVFJJTkdfVEVTVF9DT05TVEFOVDIuaW50bygpLAogICAgIF07CiAgICAgZm9yIGlucHV0IGluICZpbnB1dHMgewotICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5SZXBlYXRTdHJpbmcoJmlucHV0KTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuUmVwZWF0U3RyaW5nKGlucHV0KTsKICAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQuYXNfcmVmKCksIE9rKGlucHV0KSk7CiAgICAgfQogfQpAQCAtMTY5LDcgKzE5MCw3IEBACiAgICAgKCR0ZXN0OmlkZW50LCAkZnVuYzppZGVudCwgJGFycmF5OmV4cHIpID0+IHsKICAgICAgICAgI1t0ZXN0XQogICAgICAgICBmbiAkdGVzdCgpIHsKLSAgICAgICAgICAgIGxldCBtdXQgYXJyYXkgPSAkYXJyYXk7CisgICAgICAgICAgICBsZXQgbXV0IGFycmF5ID0gJGFycmF5LnRvX3ZlYygpOwogCiAgICAgICAgICAgICAvLyBKYXZhIG5lZWRzIGluaXRpYWwgdmFsdWVzIGhlcmUgKGNhbid0IHJlc2l6ZSBhcnJheXMpCiAgICAgICAgICAgICBsZXQgbXV0IHJlcGVhdGVkID0gdmVjIVtEZWZhdWx0OjpkZWZhdWx0KCk7IGFycmF5LmxlbigpXTsKQEAgLTIwOCw2ICsyMjksMTEgQEAKICAgICB2ZWMhW0J5dGVFbnVtOjpGT08sIEJ5dGVFbnVtOjpCQVIsIEJ5dGVFbnVtOjpCQVJdCiB9CiB0ZXN0X3JldmVyc2VfYXJyYXkhIHsKKyAgICB0ZXN0X2FycmF5X2J5dGVfZW51bV92YWx1ZXMsCisgICAgUmV2ZXJzZUJ5dGVFbnVtLAorICAgIEJ5dGVFbnVtOjplbnVtX3ZhbHVlcygpCit9Cit0ZXN0X3JldmVyc2VfYXJyYXkhIHsKICAgICB0ZXN0X2FycmF5X2J5dGVfZW51bV92MiwKICAgICBSZXZlcnNlQnl0ZUVudW0sCiAgICAgdmVjIVtCeXRlRW51bTo6Rk9PLCBCeXRlRW51bTo6QkFSLCBCeXRlRW51bTo6QkFaXQpAQCAtMjQzLDEzICsyNjksNTggQEAKIGZuIHRlc3RfYmluZGVyX2V4Y2hhbmdlKCkgewogICAgIGNvbnN0IE5BTUU6ICZzdHIgPSAiU215dGhlIjsKICAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKLSAgICBsZXQgZ290ID0gc2VydmljZQotICAgICAgICAuR2V0T3RoZXJUZXN0U2VydmljZShOQU1FKQotICAgICAgICAuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE90aGVyVGVzdFNlcnZpY2UiKTsKKyAgICBsZXQgZ290ID0gc2VydmljZS5HZXRPdGhlclRlc3RTZXJ2aWNlKE5BTUUpLmV4cGVjdCgiZXJyb3IgY2FsbGluZyBHZXRPdGhlclRlc3RTZXJ2aWNlIik7CiAgICAgYXNzZXJ0X2VxIShnb3QuR2V0TmFtZSgpLmFzX3JlZigpLm1hcChTdHJpbmc6OmFzX3JlZiksIE9rKE5BTUUpKTsKICAgICBhc3NlcnRfZXEhKHNlcnZpY2UuVmVyaWZ5TmFtZSgmZ290LCBOQU1FKSwgT2sodHJ1ZSkpOwogfQogCisjW3Rlc3RdCitmbiB0ZXN0X2JpbmRlcl9hcnJheV9leGNoYW5nZSgpIHsKKyAgICBsZXQgbmFtZXMgPSB2ZWMhWyJGaXp6Ii5pbnRvKCksICJCdXp6Ii5pbnRvKCldOworICAgIGxldCBzZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOworICAgIGxldCBnb3QgPSBzZXJ2aWNlLkdldEludGVyZmFjZUFycmF5KCZuYW1lcykuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldEludGVyZmFjZUFycmF5Iik7CisgICAgYXNzZXJ0X2VxIShnb3QuaXRlcigpLm1hcCh8c3wgcy5HZXROYW1lKCkpLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+LCBfPj4oKSwgT2sobmFtZXMuY2xvbmUoKSkpOworICAgIGFzc2VydF9lcSEoc2VydmljZS5WZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgmZ290LCAmbmFtZXMpLCBPayh0cnVlKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfYmluZGVyX251bGxhYmxlX2FycmF5X2V4Y2hhbmdlKCkgeworICAgIGxldCBuYW1lcyA9IHZlYyFbU29tZSgiRml6eiIuaW50bygpKSwgTm9uZSwgU29tZSgiQnV6eiIuaW50bygpKV07CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IGdvdCA9IHNlcnZpY2UKKyAgICAgICAgLkdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoU29tZSgmbmFtZXMpKQorICAgICAgICAuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkiKTsKKyAgICBhc3NlcnRfZXEhKAorICAgICAgICBnb3QuYXNfcmVmKCkubWFwKHxhcnJ8IGFycgorICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8b3B0X3N8IG9wdF9zLmFzX3JlZigpLm1hcCh8c3wgcy5HZXROYW1lKCkuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE5hbWUiKSkpCisgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSksCisgICAgICAgIFNvbWUobmFtZXMuY2xvbmUoKSkKKyAgICApOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHNlcnZpY2UuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShnb3QuYXNfcmVmKCkubWFwKHx2fCAmdlsuLl0pLCBTb21lKCZuYW1lcykpLAorICAgICAgICBPayh0cnVlKQorICAgICk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfaW50ZXJmYWNlX2xpc3RfZXhjaGFuZ2UoKSB7CisgICAgbGV0IG5hbWVzID0gdmVjIVtTb21lKCJGaXp6Ii5pbnRvKCkpLCBOb25lLCBTb21lKCJCdXp6Ii5pbnRvKCkpXTsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgZ290ID0gc2VydmljZS5HZXRJbnRlcmZhY2VMaXN0KFNvbWUoJm5hbWVzKSkuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldEludGVyZmFjZUxpc3QiKTsKKyAgICBhc3NlcnRfZXEhKAorICAgICAgICBnb3QuYXNfcmVmKCkubWFwKHxhcnJ8IGFycgorICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8b3B0X3N8IG9wdF9zLmFzX3JlZigpLm1hcCh8c3wgcy5HZXROYW1lKCkuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldE5hbWUiKSkpCisgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSksCisgICAgICAgIFNvbWUobmFtZXMuY2xvbmUoKSkKKyAgICApOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHNlcnZpY2UuVmVyaWZ5TmFtZXNXaXRoSW50ZXJmYWNlTGlzdChnb3QuYXNfcmVmKCkubWFwKHx2fCAmdlsuLl0pLCBTb21lKCZuYW1lcykpLAorICAgICAgICBPayh0cnVlKQorICAgICk7Cit9CisKIGZuIGJ1aWxkX3BpcGUoKSAtPiAoRmlsZSwgRmlsZSkgewogICAgIC8vIFNhZmV0eTogd2UgZ2V0IHR3byBmaWxlIGRlc2NyaXB0b3JzIGZyb20gcGlwZSgpCiAgICAgLy8gYW5kIHBhc3MgdGhlbSBhZnRlciBjaGVja2luZyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQKQEAgLTI3NSwxNSArMzQ2LDEwIEBACiAgICAgICAgIC5leHBlY3QoImVycm9yIGNhbGxpbmcgUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKIAogICAgIGNvbnN0IFRFU1RfREFUQTogJlt1OF0gPSBiIkZyYXp6bGVTbmF6emxlRmxpbUZsYW1GbGliYml0eUd1bWJvQ2hvcHMiOwotICAgIHJlc3VsdF9wZmQKLSAgICAgICAgLmFzX3JlZigpCi0gICAgICAgIC53cml0ZV9hbGwoVEVTVF9EQVRBKQotICAgICAgICAuZXhwZWN0KCJlcnJvciB3cml0aW5nIHRvIHBpcGUiKTsKKyAgICByZXN1bHRfcGZkLmFzX3JlZigpLndyaXRlX2FsbChURVNUX0RBVEEpLmV4cGVjdCgiZXJyb3Igd3JpdGluZyB0byBwaXBlIik7CiAKICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IFRFU1RfREFUQS5sZW4oKV07Ci0gICAgcmVhZF9maWxlCi0gICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQotICAgICAgICAuZXhwZWN0KCJlcnJvciByZWFkaW5nIGZyb20gcGlwZSIpOworICAgIHJlYWRfZmlsZS5yZWFkX2V4YWN0KCZtdXQgYnVmKS5leHBlY3QoImVycm9yIHJlYWRpbmcgZnJvbSBwaXBlIik7CiAgICAgYXNzZXJ0X2VxISgmYnVmWy4uXSwgVEVTVF9EQVRBKTsKIH0KIApAQCAtMzExLDI3ICszNzcsMTggQEAKICAgICAgICAgLlJldmVyc2VQYXJjZWxGaWxlRGVzY3JpcHRvckFycmF5KCZpbnB1dFsuLl0sICZtdXQgcmVwZWF0ZWQpCiAgICAgICAgIC5leHBlY3QoImVycm9yIGNhbGxpbmcgUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkiKTsKIAotICAgIGlucHV0WzFdCi0gICAgICAgIC5hc19yZWYoKQotICAgICAgICAud3JpdGVfYWxsKGIiRmlyc3QiKQotICAgICAgICAuZXhwZWN0KCJlcnJvciB3cml0aW5nIHRvIHBpcGUiKTsKKyAgICBpbnB1dFsxXS5hc19yZWYoKS53cml0ZV9hbGwoYiJGaXJzdCIpLmV4cGVjdCgiZXJyb3Igd3JpdGluZyB0byBwaXBlIik7CiAgICAgcmVwZWF0ZWRbMV0KICAgICAgICAgLmFzX211dCgpCiAgICAgICAgIC5leHBlY3QoInJlY2VpdmVkIE5vbmUgZm9yIFBhcmNlbEZpbGVEZXNjcmlwdG9yIikKICAgICAgICAgLmFzX3JlZigpCiAgICAgICAgIC53cml0ZV9hbGwoYiJTZWNvbmQiKQogICAgICAgICAuZXhwZWN0KCJlcnJvciB3cml0aW5nIHRvIHBpcGUiKTsKLSAgICByZXN1bHRbMF0KLSAgICAgICAgLmFzX3JlZigpCi0gICAgICAgIC53cml0ZV9hbGwoYiJUaGlyZCIpCi0gICAgICAgIC5leHBlY3QoImVycm9yIHdyaXRpbmcgdG8gcGlwZSIpOworICAgIHJlc3VsdFswXS5hc19yZWYoKS53cml0ZV9hbGwoYiJUaGlyZCIpLmV4cGVjdCgiZXJyb3Igd3JpdGluZyB0byBwaXBlIik7CiAKICAgICBjb25zdCBURVNUX0RBVEE6ICZbdThdID0gYiJGaXJzdFNlY29uZFRoaXJkIjsKICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IFRFU1RfREFUQS5sZW4oKV07Ci0gICAgaW5wdXRbMF0KLSAgICAgICAgLmFzX3JlZigpCi0gICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQotICAgICAgICAuZXhwZWN0KCJlcnJvciByZWFkaW5nIGZyb20gcGlwZSIpOworICAgIGlucHV0WzBdLmFzX3JlZigpLnJlYWRfZXhhY3QoJm11dCBidWYpLmV4cGVjdCgiZXJyb3IgcmVhZGluZyBmcm9tIHBpcGUiKTsKICAgICBhc3NlcnRfZXEhKCZidWZbLi5dLCBURVNUX0RBVEEpOwogfQogCkBAIC0zMzksMjEgKzM5NiwxMiBAQAogZm4gdGVzdF9zZXJ2aWNlX3NwZWNpZmljX2V4Y2VwdGlvbigpIHsKICAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKIAotICAgIGxldCBiYWNrZW5kID0gc2VydmljZS5nZXRCYWNrZW5kVHlwZSgpLmV4cGVjdCgiZXJyb3IgZ2V0dGluZyBiYWNrZW5kIHR5cGUiKTsKLSAgICBpZiBiYWNrZW5kID09IEJhY2tlbmRUeXBlOjpKQVZBIHsKLSAgICAgICAgLy8gVE9ETyhiLzE3ODg2MTQ2OCk6IG5vdCBjb3JyZWN0bHkgdGhyb3duIGZyb20gSmF2YQotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgZm9yIGkgaW4gLTEuLjIgewogICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5UaHJvd1NlcnZpY2VFeGNlcHRpb24oaSk7CiAgICAgICAgIGFzc2VydCEocmVzdWx0LmlzX2VycigpKTsKIAogICAgICAgICBsZXQgc3RhdHVzID0gcmVzdWx0LnVud3JhcF9lcnIoKTsKLSAgICAgICAgYXNzZXJ0X2VxISgKLSAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25fY29kZSgpLAotICAgICAgICAgICAgYmluZGVyOjpFeGNlcHRpb25Db2RlOjpTRVJWSUNFX1NQRUNJRklDCi0gICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEoc3RhdHVzLmV4Y2VwdGlvbl9jb2RlKCksIGJpbmRlcjo6RXhjZXB0aW9uQ29kZTo6U0VSVklDRV9TUEVDSUZJQyk7CiAgICAgICAgIGFzc2VydF9lcSEoc3RhdHVzLnNlcnZpY2Vfc3BlY2lmaWNfZXJyb3IoKSwgaSk7CiAgICAgfQogfQpAQCAtNDA1LDEwICs0NTMsNyBAQAogCiAjW3Rlc3RdCiBmbiB0ZXN0X251bGxhYmxlX3BhcmNlbGFibGUoKSB7Ci0gICAgbGV0IHZhbHVlID0gU3RydWN0dXJlZFBhcmNlbGFibGU6OlN0cnVjdHVyZWRQYXJjZWxhYmxlewotICAgICAgICBmOiA0MiwKLSAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKLSAgICB9OworICAgIGxldCB2YWx1ZSA9IEVtcHR5IHt9OwogCiAgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CiAgICAgbGV0IHZhbHVlID0gU29tZSh2YWx1ZSk7CkBAIC00MTksMTMgKzQ2NCwyOCBAQAogICAgIGFzc2VydF9lcSEocmVzdWx0LCBPayhOb25lKSk7CiB9CiAKK3Rlc3RfbnVsbGFibGUhIHsKKyAgICB0ZXN0X251bGxhYmxlX3BhcmNlbGFibGVfYXJyYXksCisgICAgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlQXJyYXksCisgICAgdmVjIVsKKyAgICAgICAgU29tZShFbXB0eSB7fSksCisgICAgICAgIE5vbmUsCisgICAgXQorfQorCit0ZXN0X251bGxhYmxlISB7CisgICAgdGVzdF9udWxsYWJsZV9wYXJjZWxhYmxlX2xpc3QsCisgICAgUmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwKKyAgICB2ZWMhWworICAgICAgICBTb21lKEVtcHR5IHt9KSwKKyAgICAgICAgTm9uZSwKKyAgICBdCit9CisKICNbdGVzdF0KIGZuIHRlc3RfYmluZGVyKCkgewogICAgIGxldCBzZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOwotICAgIGFzc2VydCEoc2VydmljZQotICAgICAgICAuR2V0Q2FsbGJhY2sodHJ1ZSkKLSAgICAgICAgLmV4cGVjdCgiZXJyb3IgY2FsbGluZyBHZXRDYWxsYmFjayIpCi0gICAgICAgIC5pc19ub25lKCkpOworICAgIGFzc2VydCEoc2VydmljZS5HZXRDYWxsYmFjayh0cnVlKS5leHBlY3QoImVycm9yIGNhbGxpbmcgR2V0Q2FsbGJhY2siKS5pc19ub25lKCkpOwogICAgIGxldCBjYWxsYmFjayA9IHNlcnZpY2UKICAgICAgICAgLkdldENhbGxiYWNrKGZhbHNlKQogICAgICAgICAuZXhwZWN0KCJlcnJvciBjYWxsaW5nIEdldENhbGxiYWNrIikKQEAgLTUxOSwxMSArNTc5LDExIEBACiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmJ5dGVEZWZhdWx0c1RvRm91ciwgNCk7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmludERlZmF1bHRzVG9GaXZlLCA1KTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUubG9uZ0RlZmF1bHRzVG9OZWdhdGl2ZVNldmVuLCAtNyk7Ci0gICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSwgdHJ1ZSk7CisgICAgYXNzZXJ0IShwYXJjZWxhYmxlLmJvb2xlYW5EZWZhdWx0c1RvVHJ1ZSk7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmNoYXJEZWZhdWx0c1RvQywgJ0MnIGFzIHUxNik7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmZsb2F0RGVmYXVsdHNUb1BpLCAzLjE0ZjMyKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuZG91YmxlV2l0aERlZmF1bHQsIC0zLjE0ZTE3ZjY0KTsKLSAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuYm9vbERlZmF1bHQsIGZhbHNlKTsKKyAgICBhc3NlcnQhKCFwYXJjZWxhYmxlLmJvb2xEZWZhdWx0KTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuYnl0ZURlZmF1bHQsIDApOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5pbnREZWZhdWx0LCAwKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUubG9uZ0RlZmF1bHQsIDApOwpAQCAtNTM1LDE1ICs1OTUsMTUgQEAKICAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5GaWxsT3V0U3RydWN0dXJlZFBhcmNlbGFibGUoJm11dCBwYXJjZWxhYmxlKTsKICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgT2soKCkpKTsKIAotICAgIGFzc2VydF9lcSEoCi0gICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQ29udGFpblRocmVlRnMsCi0gICAgICAgIFtERVNJUkVEX1ZBTFVFLCBERVNJUkVEX1ZBTFVFLCBERVNJUkVEX1ZBTFVFXQotICAgICk7CisgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLnNob3VsZENvbnRhaW5UaHJlZUZzLCBbREVTSVJFRF9WQUxVRSwgREVTSVJFRF9WQUxVRSwgREVTSVJFRF9WQUxVRV0pOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5zaG91bGRCZUplcnJ5LCAiSmVycnkiKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuaW50MzJfbWluLCBpMzI6Ok1JTik7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmludDMyX21heCwgaTMyOjpNQVgpOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5pbnQ2NF9tYXgsIGk2NDo6TUFYKTsKICAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuaGV4SW50MzJfbmVnXzEsIC0xKTsKKyAgICBmb3IgaSBpbiBwYXJjZWxhYmxlLmludDhfMSB7CisgICAgICAgIGFzc2VydF9lcSEoaSwgMSk7CisgICAgfQogICAgIGZvciBpIGluIHBhcmNlbGFibGUuaW50MzJfMSB7CiAgICAgICAgIGFzc2VydF9lcSEoaSwgMSk7CiAgICAgfQpAQCAtNTYzLDE4ICs2MjMsMjA1IEBACiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzkuMCwgMSk7CiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzEwLjAsIDEpOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5hZGRTdHJpbmcxLCAiaGVsbG8gd29ybGQhIik7Ci0gICAgYXNzZXJ0X2VxISgKLSAgICAgICAgcGFyY2VsYWJsZS5hZGRTdHJpbmcyLAotICAgICAgICAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iCi0gICAgKTsKKyAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuYWRkU3RyaW5nMiwgIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuIik7CiAKLSAgICBhc3NlcnRfZXEhKHBhcmNlbGFibGUuc2hvdWxkU2V0Qml0MEFuZEJpdDIsIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpCSVQwIHwgU3RydWN0dXJlZFBhcmNlbGFibGU6OkJJVDIpOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkU2V0Qml0MEFuZEJpdDIsCisgICAgICAgIFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpCSVQwIHwgU3RydWN0dXJlZFBhcmNlbGFibGU6OkJJVDIKKyAgICApOwogCiAgICAgYXNzZXJ0X2VxIShwYXJjZWxhYmxlLnUsIFNvbWUoVW5pb246OlVuaW9uOjpOcyh2ZWMhWzEsIDIsIDNdKSkpOwogICAgIGFzc2VydF9lcSEocGFyY2VsYWJsZS5zaG91bGRCZUNvbnN0UzEsIFNvbWUoVW5pb246OlVuaW9uOjpTKFVuaW9uOjpTMS50b19zdHJpbmcoKSkpKQogfQogCiAjW3Rlc3RdCitmbiB0ZXN0X3JlcGVhdF9leHRlbmRhYmxlX3BhcmNlbGFibGUoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisKKyAgICBsZXQgZXh0ID0gQXJjOjpuZXcoTXlFeHQgeyBhOiA0MiwgYjogIkVYVCIuaW50bygpIH0pOworICAgIGxldCBtdXQgZXAgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7IGE6IDEsIGI6ICJhIi5pbnRvKCksIGM6IDQyLCAuLkRlZmF1bHQ6OmRlZmF1bHQoKSB9OworICAgIGVwLmV4dC5zZXRfcGFyY2VsYWJsZShBcmM6OmNsb25lKCZleHQpKS5leHBlY3QoImVycm9yIHNldHRpbmcgcGFyY2VsYWJsZSIpOworCisgICAgbGV0IG11dCBlcDIgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZTo6ZGVmYXVsdCgpOworICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlLlJlcGVhdEV4dGVuZGFibGVQYXJjZWxhYmxlKCZlcCwgJm11dCBlcDIpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBPaygoKSkpOworICAgIGFzc2VydF9lcSEoZXAyLmEsIGVwLmEpOworICAgIGFzc2VydF9lcSEoZXAyLmIsIGVwLmIpOworCisgICAgbGV0IHJldF9leHQgPSBlcDIuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHQ+KCkuZXhwZWN0KCJlcnJvciBnZXR0aW5nIHBhcmNlbGFibGUiKTsKKyAgICBhc3NlcnQhKHJldF9leHQuaXNfc29tZSgpKTsKKworICAgIGxldCByZXRfZXh0ID0gcmV0X2V4dC51bndyYXAoKTsKKyAgICBhc3NlcnRfZXEhKHJldF9leHQuYSwgZXh0LmEpOworICAgIGFzc2VydF9lcSEocmV0X2V4dC5iLCBleHQuYik7Cit9CisKK21hY3JvX3J1bGVzISB0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSB7CisgICAgKCR0ZXN0OmlkZW50LCAkaG9sZGVyOnBhdGgsICRwYXJjZWxhYmxlOnBhdGgpID0+IHsKKyAgICAgICAgI1t0ZXN0XQorICAgICAgICBmbiAkdGVzdCgpIHsKKyAgICAgICAgICAgIGxldCBtdXQgaG9sZGVyID0gPCRob2xkZXI+OjpkZWZhdWx0KCk7CisgICAgICAgICAgICBsZXQgcGFyY2VsYWJsZSA9IEFyYzo6bmV3KDwkcGFyY2VsYWJsZT46OmRlZmF1bHQoKSk7CisgICAgICAgICAgICBsZXQgcmVzdWx0ID0gaG9sZGVyLmV4dC5zZXRfcGFyY2VsYWJsZShBcmM6OmNsb25lKCZwYXJjZWxhYmxlKSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgT2soKCkpKTsKKworICAgICAgICAgICAgbGV0IHBhcmNlbGFibGUyID0gaG9sZGVyLmV4dC5nZXRfcGFyY2VsYWJsZTo6PCRwYXJjZWxhYmxlPigpLnVud3JhcCgpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0IShBcmM6OnB0cl9lcSgmcGFyY2VsYWJsZSwgJnBhcmNlbGFibGUyKSk7CisgICAgICAgIH0KKyAgICB9OworfQorCit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3RfdmludGZfcGFyY2VsYWJsZV9ob2xkZXJfY2FuX2NvbnRhaW5fdmludGZfcGFyY2VsYWJsZSwKKyAgICBWaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlLAorICAgIFZpbnRmUGFyY2VsYWJsZQorfQordGVzdF9wYXJjZWxhYmxlX2hvbGRlcl9zdGFiaWxpdHkhIHsKKyAgICB0ZXN0X3N0YWJsZV9wYXJjZWxhYmxlX2hvbGRlcl9jYW5fY29udGFpbl92aW50Zl9wYXJjZWxhYmxlLAorICAgIE5vblZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVmludGZQYXJjZWxhYmxlCit9Cit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3Rfc3RhYmxlX3BhcmNlbGFibGVfaG9sZGVyX2Nhbl9jb250YWluX25vbl92aW50Zl9wYXJjZWxhYmxlLAorICAgIE5vblZpbnRmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgTm9uVmludGZQYXJjZWxhYmxlCit9Cit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3Rfc3RhYmxlX3BhcmNlbGFibGVfaG9sZGVyX2Nhbl9jb250YWluX3Vuc3RhYmxlX3BhcmNlbGFibGUsCisgICAgTm9uVmludGZFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICBVbnN0YWJsZVBhcmNlbGFibGUKK30KK3Rlc3RfcGFyY2VsYWJsZV9ob2xkZXJfc3RhYmlsaXR5ISB7CisgICAgdGVzdF91bnN0YWJsZV9wYXJjZWxhYmxlX2hvbGRlcl9jYW5fY29udGFpbl92aW50Zl9wYXJjZWxhYmxlLAorICAgIFVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVmludGZQYXJjZWxhYmxlCit9Cit0ZXN0X3BhcmNlbGFibGVfaG9sZGVyX3N0YWJpbGl0eSEgeworICAgIHRlc3RfdW5zdGFibGVfcGFyY2VsYWJsZV9ob2xkZXJfY2FuX2NvbnRhaW5fbm9uX3ZpbnRmX3BhcmNlbGFibGUsCisgICAgVW5zdGFibGVFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICBOb25WaW50ZlBhcmNlbGFibGUKK30KK3Rlc3RfcGFyY2VsYWJsZV9ob2xkZXJfc3RhYmlsaXR5ISB7CisgICAgdGVzdF91bnN0YWJsZV9wYXJjZWxhYmxlX2hvbGRlcl9jYW5fY29udGFpbl91bnN0YWJsZV9wYXJjZWxhYmxlLAorICAgIFVuc3RhYmxlRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgVW5zdGFibGVQYXJjZWxhYmxlCit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfdmludGZfcGFyY2VsYWJsZV9ob2xkZXJfY2Fubm90X2NvbnRhaW5fbm90X3ZpbnRmX3BhcmNlbGFibGUoKSB7CisgICAgbGV0IG11dCBob2xkZXIgPSBWaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZWZhdWx0KCk7CisgICAgbGV0IHBhcmNlbGFibGUgPSBBcmM6Om5ldyhOb25WaW50ZlBhcmNlbGFibGU6OmRlZmF1bHQoKSk7CisgICAgbGV0IHJlc3VsdCA9IGhvbGRlci5leHQuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmcGFyY2VsYWJsZSkpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpKTsKKworICAgIGxldCBwYXJjZWxhYmxlMiA9IGhvbGRlci5leHQuZ2V0X3BhcmNlbGFibGU6OjxOb25WaW50ZlBhcmNlbGFibGU+KCk7CisgICAgYXNzZXJ0IShwYXJjZWxhYmxlMi51bndyYXAoKS5pc19ub25lKCkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3ZpbnRmX3BhcmNlbGFibGVfaG9sZGVyX2Nhbm5vdF9jb250YWluX3Vuc3RhYmxlX3BhcmNlbGFibGUoKSB7CisgICAgbGV0IG11dCBob2xkZXIgPSBWaW50ZkV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZWZhdWx0KCk7CisgICAgbGV0IHBhcmNlbGFibGUgPSBBcmM6Om5ldyhVbnN0YWJsZVBhcmNlbGFibGU6OmRlZmF1bHQoKSk7CisgICAgbGV0IHJlc3VsdCA9IGhvbGRlci5leHQuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmcGFyY2VsYWJsZSkpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBFcnIoYmluZGVyOjpTdGF0dXNDb2RlOjpCQURfVkFMVUUpKTsKKworICAgIGxldCBwYXJjZWxhYmxlMiA9IGhvbGRlci5leHQuZ2V0X3BhcmNlbGFibGU6OjxVbnN0YWJsZVBhcmNlbGFibGU+KCk7CisgICAgYXNzZXJ0IShwYXJjZWxhYmxlMi51bndyYXAoKS5pc19ub25lKCkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3JlYWRfd3JpdGVfZXh0ZW5zaW9uKCkgeworICAgIGxldCBleHQgPSBBcmM6Om5ldyhNeUV4dCB7IGE6IDQyLCBiOiAiRVhUIi5pbnRvKCkgfSk7CisgICAgbGV0IGV4dDIgPSBBcmM6Om5ldyhNeUV4dDIgeyBhOiA0MiwgYjogTXlFeHQgeyBhOiAyNCwgYjogIklORVhUIi5pbnRvKCkgfSwgYzogIkVYVDIiLmludG8oKSB9KTsKKworICAgIGxldCBtdXQgZXAgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZSB7IGE6IDEsIGI6ICJhIi5pbnRvKCksIGM6IDQyLCAuLkRlZmF1bHQ6OmRlZmF1bHQoKSB9OworCisgICAgZXAuZXh0LnNldF9wYXJjZWxhYmxlKEFyYzo6Y2xvbmUoJmV4dCkpLnVud3JhcCgpOworICAgIGVwLmV4dDIuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmZXh0MikpLnVud3JhcCgpOworCisgICAgbGV0IGV4dF9saWtlID0gZXAuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHRMaWtlPigpOworICAgIGFzc2VydF9lcSEoZXh0X2xpa2UudW53cmFwX2VycigpLCBiaW5kZXI6OlN0YXR1c0NvZGU6OkJBRF9WQUxVRSk7CisKKyAgICBsZXQgYWN0dWFsX2V4dCA9IGVwLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpOworICAgIGFzc2VydCEoYWN0dWFsX2V4dC51bndyYXAoKS5pc19zb21lKCkpOworICAgIGxldCBhY3R1YWxfZXh0MiA9IGVwLmV4dDIuZ2V0X3BhcmNlbGFibGU6OjxNeUV4dDI+KCk7CisgICAgYXNzZXJ0IShhY3R1YWxfZXh0Mi51bndyYXAoKS5pc19zb21lKCkpOworCisgICAgY2hlY2tfZXh0ZW5zaW9uX2NvbnRlbnQoJmVwLCAmZXh0LCAmZXh0Mik7CisKKyAgICBsZXQgbXV0IHBhcmNlbCA9IFBhcmNlbDo6bmV3KCk7CisgICAgZXAud3JpdGVfdG9fcGFyY2VsKCZtdXQgcGFyY2VsLmJvcnJvd2VkKCkpLnVud3JhcCgpOworCisgICAgdW5zYWZlIHsKKyAgICAgICAgcGFyY2VsLnNldF9kYXRhX3Bvc2l0aW9uKDApLnVud3JhcCgpOworICAgIH0KKyAgICBsZXQgbXV0IGVwMSA9IEV4dGVuZGFibGVQYXJjZWxhYmxlOjpkZWZhdWx0KCk7CisgICAgZXAxLnJlYWRfZnJvbV9wYXJjZWwocGFyY2VsLmJvcnJvd2VkX3JlZigpKS51bndyYXAoKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbigwKS51bndyYXAoKTsKKyAgICB9CisgICAgZXAxLndyaXRlX3RvX3BhcmNlbCgmbXV0IHBhcmNlbC5ib3Jyb3dlZCgpKS51bndyYXAoKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbigwKS51bndyYXAoKTsKKyAgICB9CisgICAgbGV0IG11dCBlcDIgPSBFeHRlbmRhYmxlUGFyY2VsYWJsZTo6ZGVmYXVsdCgpOworICAgIGVwMi5yZWFkX2Zyb21fcGFyY2VsKHBhcmNlbC5ib3Jyb3dlZF9yZWYoKSkudW53cmFwKCk7CisKKyAgICBsZXQgZXh0X2xpa2UgPSBlcDIuZXh0LmdldF9wYXJjZWxhYmxlOjo8TXlFeHRMaWtlPigpOworICAgIGFzc2VydCEoZXh0X2xpa2UudW53cmFwKCkuaXNfbm9uZSgpKTsKKworICAgIGxldCBhY3R1YWxfZXh0ID0gZXAyLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpOworICAgIGFzc2VydCEoYWN0dWFsX2V4dC51bndyYXAoKS5pc19zb21lKCkpOworCisgICAgbGV0IG5ld19leHQyID0KKyAgICAgICAgQXJjOjpuZXcoTXlFeHQyIHsgYTogNzksIGI6IE15RXh0IHsgYTogNDIsIGI6ICJJTk5FV0VYVCIuaW50bygpIH0sIGM6ICJORVdFWFQyIi5pbnRvKCkgfSk7CisgICAgZXAyLmV4dDIuc2V0X3BhcmNlbGFibGUoQXJjOjpjbG9uZSgmbmV3X2V4dDIpKS51bndyYXAoKTsKKworICAgIGNoZWNrX2V4dGVuc2lvbl9jb250ZW50KCZlcDEsICZleHQsICZleHQyKTsKKyAgICBjaGVja19leHRlbnNpb25fY29udGVudCgmZXAyLCAmZXh0LCAmbmV3X2V4dDIpOworfQorCitmbiBjaGVja19leHRlbnNpb25fY29udGVudChlcDogJkV4dGVuZGFibGVQYXJjZWxhYmxlLCBleHQ6ICZNeUV4dCwgZXh0MjogJk15RXh0MikgeworICAgIGFzc2VydF9lcSEoZXAuYSwgMSk7CisgICAgYXNzZXJ0X2VxIShlcC5iLCAiYSIpOworICAgIGFzc2VydF9lcSEoZXAuYywgNDIpOworCisgICAgbGV0IGFjdHVhbF9leHQgPSBlcC5leHQuZ2V0X3BhcmNlbGFibGU6OjxNeUV4dD4oKS51bndyYXAoKS51bndyYXAoKTsKKyAgICBhc3NlcnRfZXEhKGV4dC5hLCBhY3R1YWxfZXh0LmEpOworICAgIGFzc2VydF9lcSEoZXh0LmIsIGFjdHVhbF9leHQuYik7CisKKyAgICBsZXQgYWN0dWFsX2V4dDIgPSBlcC5leHQyLmdldF9wYXJjZWxhYmxlOjo8TXlFeHQyPigpLnVud3JhcCgpLnVud3JhcCgpOworICAgIGFzc2VydF9lcSEoZXh0Mi5hLCBhY3R1YWxfZXh0Mi5hKTsKKyAgICBhc3NlcnRfZXEhKGV4dDIuYi5hLCBhY3R1YWxfZXh0Mi5iLmEpOworICAgIGFzc2VydF9lcSEoZXh0Mi5iLmIsIGFjdHVhbF9leHQyLmIuYik7CisgICAgYXNzZXJ0X2VxIShleHQyLmMsIGFjdHVhbF9leHQyLmMpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3JldmVyc2VfcmVjdXJzaXZlX2xpc3QoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisKKyAgICBsZXQgbXV0IGhlYWQgPSBOb25lOworICAgIGZvciBuIGluIDAuLjEwIHsKKyAgICAgICAgbGV0IG5vZGUgPSBSZWN1cnNpdmVMaXN0IHsgdmFsdWU6IG4sIG5leHQ6IGhlYWQgfTsKKyAgICAgICAgaGVhZCA9IFNvbWUoQm94OjpuZXcobm9kZSkpOworICAgIH0KKyAgICAvLyBoZWFkID0gWzksIDgsIC4uLCAwXQorICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlLlJldmVyc2VMaXN0KGhlYWQuYXNfcmVmKCkudW53cmFwKCkpOworICAgIGFzc2VydCEocmVzdWx0LmlzX29rKCkpOworCisgICAgLy8gcmV2ZXJzZWQgc2hvdWxkIGJlIFswLCAxLCAuLi4gOV0KKyAgICBsZXQgbXV0IHJldmVyc2VkOiBPcHRpb248JlJlY3Vyc2l2ZUxpc3Q+ID0gcmVzdWx0LmFzX3JlZigpLm9rKCk7CisgICAgZm9yIG4gaW4gMC4uMTAgeworICAgICAgICBhc3NlcnRfZXEhKHJldmVyc2VkLm1hcCh8aW5uZXJ8IGlubmVyLnZhbHVlKSwgU29tZShuKSk7CisgICAgICAgIHJldmVyc2VkID0gcmV2ZXJzZWQudW53cmFwKCkubmV4dC5hc19yZWYoKS5tYXAofG58IG4uYXNfcmVmKCkpOworICAgIH0KKyAgICBhc3NlcnQhKHJldmVyc2VkLmlzX25vbmUoKSkKK30KKworI1t0ZXN0XQogZm4gdGVzdF91bmlvbnMoKSB7CiAgICAgYXNzZXJ0X2VxIShVbmlvbjo6VW5pb246OmRlZmF1bHQoKSwgVW5pb246OlVuaW9uOjpOcyh2ZWMhW10pKTsKICAgICBhc3NlcnRfZXEhKEVudW1Vbmlvbjo6ZGVmYXVsdCgpLCBFbnVtVW5pb246OkludEVudW0oSW50RW51bTo6Rk9PKSk7CkBAIC02MjEsMTAgKzg2OCw3IEBACiAgICAgICAgICAgICAuZXhwZWN0KCJkaWQgbm90IGdldCBiaW5kZXIgc2VydmljZSIpOwogCiAgICAgbGV0IGhhc2ggPSBzZXJ2aWNlLmdldEludGVyZmFjZUhhc2goKTsKLSAgICBhc3NlcnRfZXEhKAotICAgICAgICBoYXNoLmFzX3JlZigpLm1hcChTdHJpbmc6OmFzX3N0ciksCi0gICAgICAgIE9rKCI5ZTdiZTE4NTk4MjBjNTlkOWQ1NWRkMTMzZTcxYTM2ODdiNWQyZTViIikKLSAgICApOworICAgIGFzc2VydF9lcSEoaGFzaC5hc19yZWYoKS5tYXAoU3RyaW5nOjphc19zdHIpLCBPaygiOWU3YmUxODU5ODIwYzU5ZDlkNTVkZDEzM2U3MWEzNjg3YjVkMmU1YiIpKTsKIH0KIAogI1t0ZXN0XQpAQCAtNjc0LDEwICs5MTgsMTIgQEAKICAgICAgICAgICAgIC5leHBlY3QoImRpZCBub3QgZ2V0IGJpbmRlciBzZXJ2aWNlIik7CiAKICAgICBsZXQgaW5fZm9vID0gRGVmYXVsdDo6ZGVmYXVsdCgpOwotICAgIGxldCBtdXQgaW5vdXRfZm9vID0gRGVmYXVsdDo6ZGVmYXVsdCgpOwotICAgIGxldCBtdXQgb3V0X2ZvbyA9IERlZmF1bHQ6OmRlZmF1bHQoKTsKKyAgICBsZXQgbXV0IGlub3V0X2ZvbyA9IEZvbyB7IGludERlZmF1bHQ0MjogMCB9OworICAgIGxldCBtdXQgb3V0X2ZvbyA9IEZvbyB7IGludERlZmF1bHQ0MjogMCB9OwogICAgIGxldCByZXQgPSBzZXJ2aWNlLmlnbm9yZVBhcmNlbGFibGVzQW5kUmVwZWF0SW50KCZpbl9mb28sICZtdXQgaW5vdXRfZm9vLCAmbXV0IG91dF9mb28sIDQzKTsKICAgICBhc3NlcnRfZXEhKHJldCwgT2soNDMpKTsKKyAgICBhc3NlcnRfZXEhKGlub3V0X2Zvby5pbnREZWZhdWx0NDIsIDApOworICAgIGFzc2VydF9lcSEob3V0X2Zvby5pbnREZWZhdWx0NDIsIDApOwogfQogCiBmbiB0ZXN0X3JlbmFtZWRfaW50ZXJmYWNlPEY+KGY6IEYpCkBAIC03MjMsOSArOTY5LDcgQEAKICNbdGVzdF0KIGZuIHRlc3RfcmVuYW1lZF9pbnRlcmZhY2Vfb2xkX2FzX25ldygpIHsKICAgICB0ZXN0X3JlbmFtZWRfaW50ZXJmYWNlKHxvbGRfbmFtZSwgX3wgewotICAgICAgICBsZXQgbmV3X25hbWUgPSBvbGRfbmFtZQotICAgICAgICAgICAgLmFzX2JpbmRlcigpCi0gICAgICAgICAgICAuaW50b19pbnRlcmZhY2U6OjxkeW4gSU5ld05hbWU6OklOZXdOYW1lPigpOworICAgICAgICBsZXQgbmV3X25hbWUgPSBvbGRfbmFtZS5hc19iaW5kZXIoKS5pbnRvX2ludGVyZmFjZTo6PGR5biBJTmV3TmFtZTo6SU5ld05hbWU+KCk7CiAgICAgICAgIGFzc2VydCEobmV3X25hbWUuaXNfb2soKSk7CiAKICAgICAgICAgbGV0IHJlYWxfbmFtZSA9IG5ld19uYW1lLnVud3JhcCgpLlJlYWxOYW1lKCk7CkBAIC03MzYsMTIgKzk4MCwyMzIgQEAKICNbdGVzdF0KIGZuIHRlc3RfcmVuYW1lZF9pbnRlcmZhY2VfbmV3X2FzX29sZCgpIHsKICAgICB0ZXN0X3JlbmFtZWRfaW50ZXJmYWNlKHxfLCBuZXdfbmFtZXwgewotICAgICAgICBsZXQgb2xkX25hbWUgPSBuZXdfbmFtZQotICAgICAgICAgICAgLmFzX2JpbmRlcigpCi0gICAgICAgICAgICAuaW50b19pbnRlcmZhY2U6OjxkeW4gSU9sZE5hbWU6OklPbGROYW1lPigpOworICAgICAgICBsZXQgb2xkX25hbWUgPSBuZXdfbmFtZS5hc19iaW5kZXIoKS5pbnRvX2ludGVyZmFjZTo6PGR5biBJT2xkTmFtZTo6SU9sZE5hbWU+KCk7CiAgICAgICAgIGFzc2VydCEob2xkX25hbWUuaXNfb2soKSk7CiAKICAgICAgICAgbGV0IHJlYWxfbmFtZSA9IG9sZF9uYW1lLnVud3JhcCgpLlJlYWxOYW1lKCk7CiAgICAgICAgIGFzc2VydF9lcSEocmVhbF9uYW1lLmFzX3JlZigpLm1hcChTdHJpbmc6OmFzX3N0ciksIE9rKCJOZXdOYW1lIikpOwogICAgIH0pOwogfQorCisjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCitzdHJ1Y3QgQ2FsbGJhY2sgeworICAgIHJlY2VpdmVkOiBBcmM8TXV0ZXg8T3B0aW9uPFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1cz4+PiwKK30KKworaW1wbCBJbnRlcmZhY2UgZm9yIENhbGxiYWNrIHt9CisKK2ltcGwgSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6SUNhbGxiYWNrIGZvciBDYWxsYmFjayB7CisgICAgZm4gZG9uZSgmc2VsZiwgc3Q6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1cykgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKnNlbGYucmVjZWl2ZWQubG9jaygpLnVud3JhcCgpID0gU29tZShzdCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworI1t0ZXN0XQorZm4gdGVzdF9uZXN0ZWRfdHlwZSgpIHsKKyAgICBsZXQgc2VydmljZTogYmluZGVyOjpTdHJvbmc8ZHluIElOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZT4gPSBiaW5kZXI6OmdldF9pbnRlcmZhY2UoCisgICAgICAgIDxJTmVzdGVkU2VydmljZTo6QnBOZXN0ZWRTZXJ2aWNlIGFzIElOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZT46OmdldF9kZXNjcmlwdG9yKCksCisgICAgKQorICAgIC5leHBlY3QoImRpZCBub3QgZ2V0IGJpbmRlciBzZXJ2aWNlIik7CisKKyAgICBsZXQgcCA9IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCB7CisgICAgICAgIHN0YXR1czogUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSywKKyAgICB9OworICAgIC8vIE9LIC0+IE5PVF9PSworICAgIGxldCByZXQgPSBzZXJ2aWNlLmZsaXBTdGF0dXMoJnApOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHJldCwKKyAgICAgICAgT2soSU5lc3RlZFNlcnZpY2U6OlJlc3VsdDo6UmVzdWx0IHsgc3RhdHVzOiBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSyB9KQorICAgICk7CisgICAgbGV0IHJlY2VpdmVkID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhOb25lKSk7CisgICAgLy8gTk9UX09LIC0+IE9LIHdpdGggbmVzdGVkIGNhbGxiYWNrIGludGVyZmFjZQorICAgIGxldCBjYiA9IElOZXN0ZWRTZXJ2aWNlOjpJQ2FsbGJhY2s6OkJuQ2FsbGJhY2s6Om5ld19iaW5kZXIoCisgICAgICAgIENhbGxiYWNrIHsgcmVjZWl2ZWQ6IEFyYzo6Y2xvbmUoJnJlY2VpdmVkKSB9LAorICAgICAgICBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpLAorICAgICk7CisgICAgbGV0IHJldCA9IHNlcnZpY2UuZmxpcFN0YXR1c1dpdGhDYWxsYmFjayhQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSywgJmNiKTsKKyAgICBhc3NlcnRfZXEhKHJldCwgT2soKCkpKTsKKyAgICBsZXQgcmVjZWl2ZWQgPSByZWNlaXZlZC5sb2NrKCkudW53cmFwKCk7CisgICAgYXNzZXJ0X2VxISgqcmVjZWl2ZWQsIFNvbWUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSykpCit9CisKKyNbdGVzdF0KK2ZuIHRlc3Rfbm9ubnVsbF9iaW5kZXIoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuVGFrZXNBbklCaW5kZXIoJnNlcnZpY2UuYXNfYmluZGVyKCkpOworICAgIGFzc2VydCEocmVzdWx0LmlzX29rKCkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X2JpbmRlcl9saXN0X3dpdGhvdXRfbnVsbCgpIHsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5UYWtlc0FuSUJpbmRlckxpc3QoJltzZXJ2aWNlLmFzX2JpbmRlcigpXSk7CisgICAgYXNzZXJ0IShyZXN1bHQuaXNfb2soKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfbnVsbF9iaW5kZXJfdG9fYW5ub3RhdGVkX21ldGhvZCgpIHsKKyAgICBsZXQgc2VydmljZSA9IGdldF90ZXN0X3NlcnZpY2UoKTsKKyAgICBsZXQgcmVzdWx0ID0gc2VydmljZS5UYWtlc0FOdWxsYWJsZUlCaW5kZXIoTm9uZSk7CisgICAgYXNzZXJ0IShyZXN1bHQuaXNfb2soKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfYmluZGVyX2xpc3Rfd2l0aF9udWxsX3RvX2Fubm90YXRlZF9tZXRob2QoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuVGFrZXNBTnVsbGFibGVJQmluZGVyTGlzdChTb21lKCZbU29tZShzZXJ2aWNlLmFzX2JpbmRlcigpKSwgTm9uZV0pKTsKKyAgICBhc3NlcnQhKHJlc3VsdC5pc19vaygpKTsKK30KKworI1t0ZXN0XQorZm4gdGVzdF9iaW5kZXJfYXJyYXkoKSB7CisgICAgbGV0IHNlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IGNhbGxiYWNrID0gc2VydmljZQorICAgICAgICAuR2V0Q2FsbGJhY2soZmFsc2UpCisgICAgICAgIC5leHBlY3QoImVycm9yIGNhbGxpbmcgR2V0Q2FsbGJhY2siKQorICAgICAgICAuZXhwZWN0KCJleHBlY3RlZCBTb21lIGZyb20gR2V0Q2FsbGJhY2siKTsKKworICAgIGxldCBtdXQgYXJyYXkgPSB2ZWMhW3NlcnZpY2UuYXNfYmluZGVyKCksIGNhbGxiYWNrLmFzX2JpbmRlcigpXTsKKworICAgIC8vIEphdmEgbmVlZHMgaW5pdGlhbCB2YWx1ZXMgaGVyZSAoY2FuJ3QgcmVzaXplIGFycmF5cykKKyAgICBsZXQgbXV0IHJlcGVhdGVkID0gdmVjIVtEZWZhdWx0OjpkZWZhdWx0KCk7IGFycmF5LmxlbigpXTsKKworICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlLlJldmVyc2VJQmluZGVyQXJyYXkoJmFycmF5LCAmbXV0IHJlcGVhdGVkKTsKKyAgICBhc3NlcnRfZXEhKHJlcGVhdGVkLmludG9faXRlcigpLmNvbGxlY3Q6OjxPcHRpb248VmVjPF8+Pj4oKS5hc19yZWYoKSwgU29tZSgmYXJyYXkpKTsKKyAgICBhcnJheS5yZXZlcnNlKCk7CisgICAgYXNzZXJ0X2VxIShyZXN1bHQsIE9rKGFycmF5KSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfbnVsbGFibGVfYmluZGVyX2FycmF5KCkgeworICAgIGxldCBzZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOworICAgIGxldCBtdXQgYXJyYXkgPSB2ZWMhW1NvbWUoc2VydmljZS5hc19iaW5kZXIoKSksIE5vbmVdOworCisgICAgLy8gSmF2YSBuZWVkcyBpbml0aWFsIHZhbHVlcyBoZXJlIChjYW4ndCByZXNpemUgYXJyYXlzKQorICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBTb21lKHZlYyFbRGVmYXVsdDo6ZGVmYXVsdCgpOyBhcnJheS5sZW4oKV0pOworCisgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UuUmV2ZXJzZU51bGxhYmxlSUJpbmRlckFycmF5KFNvbWUoJmFycmF5Wy4uXSksICZtdXQgcmVwZWF0ZWQpOworICAgIGFzc2VydF9lcSEocmVwZWF0ZWQuYXNfcmVmKCksIFNvbWUoJmFycmF5KSk7CisgICAgYXJyYXkucmV2ZXJzZSgpOworICAgIGFzc2VydF9lcSEocmVzdWx0LCBPayhTb21lKGFycmF5KSkpOworfQorCisjW3Rlc3RdCitmbiB0ZXN0X3JlYWRfd3JpdGVfZml4ZWRfc2l6ZV9hcnJheSgpIHsKKyAgICBsZXQgbXV0IHBhcmNlbCA9IFBhcmNlbDo6bmV3KCk7CisgICAgbGV0IG11dCBwOiBGaXhlZFNpemVBcnJheUV4YW1wbGUgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgcC5ieXRlTWF0cml4WzBdWzBdID0gMDsKKyAgICBwLmJ5dGVNYXRyaXhbMF1bMV0gPSAxOworICAgIHAuYnl0ZU1hdHJpeFsxXVswXSA9IDI7CisgICAgcC5ieXRlTWF0cml4WzFdWzFdID0gMzsKKworICAgIHAuZmxvYXRNYXRyaXhbMF1bMF0gPSAwLjA7CisgICAgcC5mbG9hdE1hdHJpeFswXVsxXSA9IDEuMDsKKyAgICBwLmZsb2F0TWF0cml4WzFdWzBdID0gMi4wOworICAgIHAuZmxvYXRNYXRyaXhbMV1bMV0gPSAzLjA7CisKKyAgICBwLmJvb2xOdWxsYWJsZUFycmF5ID0gU29tZShbdHJ1ZSwgZmFsc2VdKTsKKyAgICBwLmJ5dGVOdWxsYWJsZUFycmF5ID0gU29tZShbNDIsIDBdKTsKKyAgICBwLnN0cmluZ051bGxhYmxlQXJyYXkgPSBTb21lKFtTb21lKCJoZWxsbyIuaW50bygpKSwgU29tZSgid29ybGQiLmludG8oKSldKTsKKworICAgIHAuYm9vbE51bGxhYmxlTWF0cml4ID0gU29tZShbW3RydWUsIGZhbHNlXSwgRGVmYXVsdDo6ZGVmYXVsdCgpXSk7CisgICAgcC5ieXRlTnVsbGFibGVNYXRyaXggPSBTb21lKFtbNDIsIDBdLCBEZWZhdWx0OjpkZWZhdWx0KCldKTsKKyAgICBwLnN0cmluZ051bGxhYmxlTWF0cml4ID0KKyAgICAgICAgU29tZShbW1NvbWUoImhlbGxvIi5pbnRvKCkpLCBTb21lKCJ3b3JsZCIuaW50bygpKV0sIERlZmF1bHQ6OmRlZmF1bHQoKV0pOworCisgICAgYXNzZXJ0X2VxIShwYXJjZWwud3JpdGUoJnApLCBPaygoKSkpOworICAgIHVuc2FmZSB7CisgICAgICAgIHBhcmNlbC5zZXRfZGF0YV9wb3NpdGlvbigwKS51bndyYXAoKTsKKyAgICB9CisgICAgYXNzZXJ0X2VxIShwLCBwYXJjZWwucmVhZDo6PEZpeGVkU2l6ZUFycmF5RXhhbXBsZT4oKS51bndyYXAoKSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfZml4ZWRfc2l6ZV9hcnJheV91c2VzX2FycmF5X29wdGltaXphdGlvbigpIHsKKyAgICBsZXQgbXV0IHBhcmNlbCA9IFBhcmNlbDo6bmV3KCk7CisgICAgbGV0IGJ5dGVfYXJyYXkgPSBbWzF1OCwgMnU4LCAzdThdLCBbNHU4LCA1dTgsIDZ1OF1dOworICAgIGFzc2VydF9lcSEocGFyY2VsLndyaXRlKCZieXRlX2FycmF5KSwgT2soKCkpKTsKKyAgICB1bnNhZmUgeworICAgICAgICBwYXJjZWwuc2V0X2RhdGFfcG9zaXRpb24oMCkudW53cmFwKCk7CisgICAgfQorICAgIGFzc2VydF9lcSEocGFyY2VsLnJlYWQ6OjxpMzI+KCksIE9rKDJpMzIpKTsKKyAgICBhc3NlcnRfZXEhKHBhcmNlbC5yZWFkOjo8VmVjPHU4Pj4oKSwgT2sodmVjIVsxdTgsIDJ1OCwgM3U4XSkpOworICAgIGFzc2VydF9lcSEocGFyY2VsLnJlYWQ6OjxWZWM8dTg+PigpLCBPayh2ZWMhWzR1OCwgNXU4LCA2dThdKSk7Cit9CisKK21hY3JvX3J1bGVzISB0ZXN0X3JlcGVhdF9maXhlZF9zaXplX2FycmF5IHsKKyAgICAoJHNlcnZpY2U6aWRlbnQsICRmdW5jOmlkZW50LCAkdmFsdWU6ZXhwcikgPT4geworICAgICAgICBsZXQgYXJyYXkgPSAkdmFsdWU7CisgICAgICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCByZXN1bHQgPSAkc2VydmljZS4kZnVuYygmYXJyYXksICZtdXQgcmVwZWF0ZWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHJlcGVhdGVkLCBhcnJheSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCBhcnJheSk7CisgICAgfTsKK30KKworbWFjcm9fcnVsZXMhIHRlc3RfcmVwZWF0X2ZpeGVkX3NpemVfYXJyYXlfMWRfYmluZGVyIHsKKyAgICAoJHNlcnZpY2U6aWRlbnQsICRmdW5jOmlkZW50LCAkdmFsdWU6ZXhwcikgPT4geworICAgICAgICBsZXQgYXJyYXkgPSAkdmFsdWU7CisgICAgICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCByZXN1bHQgPSAkc2VydmljZS4kZnVuYygmYXJyYXksICZtdXQgcmVwZWF0ZWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgYXJyYXkuY2xvbmUoKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVwZWF0ZWQsIGFycmF5Lm1hcChTb21lKSk7CisgICAgfTsKK30KKworbWFjcm9fcnVsZXMhIHRlc3RfcmVwZWF0X2ZpeGVkX3NpemVfYXJyYXlfMmRfYmluZGVyIHsKKyAgICAoJHNlcnZpY2U6aWRlbnQsICRmdW5jOmlkZW50LCAkdmFsdWU6ZXhwcikgPT4geworICAgICAgICBsZXQgYXJyYXkgPSAkdmFsdWU7CisgICAgICAgIGxldCBtdXQgcmVwZWF0ZWQgPSBEZWZhdWx0OjpkZWZhdWx0KCk7CisgICAgICAgIGxldCByZXN1bHQgPSAkc2VydmljZS4kZnVuYygmYXJyYXksICZtdXQgcmVwZWF0ZWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgYXJyYXkuY2xvbmUoKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVwZWF0ZWQsIGFycmF5Lm1hcCh8cm93fCByb3cubWFwKFNvbWUpKSk7CisgICAgfTsKK30KKworI1t0ZXN0XQorZm4gdGVzdF9maXhlZF9zaXplX2FycmF5X292ZXJfYmluZGVyKCkgeworICAgIGxldCB0ZXN0X3NlcnZpY2UgPSBnZXRfdGVzdF9zZXJ2aWNlKCk7CisgICAgbGV0IHNlcnZpY2U6IGJpbmRlcjo6U3Ryb25nPGR5biBJUmVwZWF0Rml4ZWRTaXplQXJyYXk+ID0KKyAgICAgICAgYmluZGVyOjpnZXRfaW50ZXJmYWNlKDxCcFJlcGVhdEZpeGVkU2l6ZUFycmF5IGFzIElSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldF9kZXNjcmlwdG9yKCkpCisgICAgICAgICAgICAuZXhwZWN0KCJkaWQgbm90IGdldCBiaW5kZXIgc2VydmljZSIpOworCisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0Qnl0ZXMsIFsxdTgsIDJ1OCwgM3U4XSk7CisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0SW50cywgWzFpMzIsIDJpMzIsIDNpMzJdKTsKKworICAgIGxldCBiaW5kZXIxID0gdGVzdF9zZXJ2aWNlLmFzX2JpbmRlcigpOworICAgIGxldCBiaW5kZXIyID0gdGVzdF9zZXJ2aWNlCisgICAgICAgIC5HZXRDYWxsYmFjayhmYWxzZSkKKyAgICAgICAgLmV4cGVjdCgiZXJyb3IgY2FsbGluZyBHZXRDYWxsYmFjayIpCisgICAgICAgIC5leHBlY3QoImV4cGVjdGVkIFNvbWUgZnJvbSBHZXRDYWxsYmFjayIpCisgICAgICAgIC5hc19iaW5kZXIoKTsKKyAgICBsZXQgYmluZGVyMyA9IHNlcnZpY2UuYXNfYmluZGVyKCk7CisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheV8xZF9iaW5kZXIhKAorICAgICAgICBzZXJ2aWNlLAorICAgICAgICBSZXBlYXRCaW5kZXJzLAorICAgICAgICBbYmluZGVyMS5jbG9uZSgpLCBiaW5kZXIyLmNsb25lKCksIGJpbmRlcjMuY2xvbmUoKV0KKyAgICApOworCisgICAgbGV0IHAxID0gSW50UGFyY2VsYWJsZSB7IHZhbHVlOiAxIH07CisgICAgbGV0IHAyID0gSW50UGFyY2VsYWJsZSB7IHZhbHVlOiAyIH07CisgICAgbGV0IHAzID0gSW50UGFyY2VsYWJsZSB7IHZhbHVlOiAzIH07CisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0UGFyY2VsYWJsZXMsIFtwMSwgcDIsIHAzXSk7CisKKyAgICB0ZXN0X3JlcGVhdF9maXhlZF9zaXplX2FycmF5IShzZXJ2aWNlLCBSZXBlYXQyZEJ5dGVzLCBbWzF1OCwgMnU4LCAzdThdLCBbMXU4LCAydTgsIDN1OF1dKTsKKyAgICB0ZXN0X3JlcGVhdF9maXhlZF9zaXplX2FycmF5IShzZXJ2aWNlLCBSZXBlYXQyZEludHMsIFtbMWkzMiwgMmkzMiwgM2kzMl0sIFsxaTMyLCAyaTMyLCAzaTMyXV0pOworCisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheV8yZF9iaW5kZXIhKAorICAgICAgICBzZXJ2aWNlLAorICAgICAgICBSZXBlYXQyZEJpbmRlcnMsCisgICAgICAgIFtbYmluZGVyMS5jbG9uZSgpLCBiaW5kZXIyLmNsb25lKCksIGJpbmRlcjMuY2xvbmUoKV0sIFtiaW5kZXIxLCBiaW5kZXIyLCBiaW5kZXIzXV0KKyAgICApOworCisgICAgdGVzdF9yZXBlYXRfZml4ZWRfc2l6ZV9hcnJheSEoc2VydmljZSwgUmVwZWF0MmRQYXJjZWxhYmxlcywgW1twMSwgcDIsIHAzXSwgW3AxLCBwMiwgcDNdXSk7Cit9CisKKyNbdGVzdF0KK2ZuIHRlc3RfcGluZygpIHsKKyAgICBsZXQgdGVzdF9zZXJ2aWNlID0gZ2V0X3Rlc3Rfc2VydmljZSgpOworICAgIGFzc2VydF9lcSEodGVzdF9zZXJ2aWNlLmFzX2JpbmRlcigpLnBpbmdfYmluZGVyKCksIE9rKCgpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9ydXN0L3Rlc3Rfc2VydmljZS5ycyBiL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlLnJzCmluZGV4IDkwMTk3NzUuLjFkM2MwOTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlLnJzCisrKyBiL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlLnJzCkBAIC0xNiwxMyArMTYsMjAgQEAKIAogLy8hIFRlc3QgUnVzdCBzZXJ2aWNlIGZvciB0aGUgQUlETCBjb21waWxlci4KIAordXNlIGFpZGxfdGVzdF9maXhlZHNpemVhcnJheTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6Zml4ZWRzaXplYXJyYXk6OkZpeGVkU2l6ZUFycmF5RXhhbXBsZTo6eworICAgIElSZXBlYXRGaXhlZFNpemVBcnJheSwgSW50UGFyY2VsYWJsZTo6SW50UGFyY2VsYWJsZSwKK307Cit1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6Om5lc3RlZDo6eworICAgIElOZXN0ZWRTZXJ2aWNlLCBQYXJjZWxhYmxlV2l0aE5lc3RlZCwKK307CiB1c2UgYWlkbF90ZXN0X2ludGVyZmFjZTo6YWlkbDo6YW5kcm9pZDo6YWlkbDo6dGVzdHM6OklUZXN0U2VydmljZTo6ewotICAgIHNlbGYsIEJuVGVzdFNlcnZpY2UsIEJwVGVzdFNlcnZpY2UsCisgICAgc2VsZiwgQm5UZXN0U2VydmljZSwgQnBUZXN0U2VydmljZSwgRW1wdHk6OkVtcHR5LAogfTsKIHVzZSBhaWRsX3Rlc3RfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp0ZXN0czo6eworICAgIGV4dGVuc2lvbjo6RXh0ZW5kYWJsZVBhcmNlbGFibGU6OkV4dGVuZGFibGVQYXJjZWxhYmxlLCBleHRlbnNpb246Ok15RXh0OjpNeUV4dCwKICAgICBCYWNrZW5kVHlwZTo6QmFja2VuZFR5cGUsIEJ5dGVFbnVtOjpCeXRlRW51bSwgQ29uc3RhbnRFeHByZXNzaW9uRW51bTo6Q29uc3RhbnRFeHByZXNzaW9uRW51bSwKLSAgICBJTmFtZWRDYWxsYmFjaywgSU5ld05hbWUsIElPbGROYW1lLCBJbnRFbnVtOjpJbnRFbnVtLCBMb25nRW51bTo6TG9uZ0VudW0sIFN0cnVjdHVyZWRQYXJjZWxhYmxlLAotICAgIFVuaW9uLAorICAgIElOYW1lZENhbGxiYWNrLCBJTmV3TmFtZSwgSU9sZE5hbWUsIEludEVudW06OkludEVudW0sIExvbmdFbnVtOjpMb25nRW51bSwKKyAgICBSZWN1cnNpdmVMaXN0OjpSZWN1cnNpdmVMaXN0LCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgVW5pb24sCiB9OwogdXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmJpbmRlcjo6ewogICAgIHNlbGYsIEJpbmRlckZlYXR1cmVzLCBJbnRlcmZhY2UsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBTcElCaW5kZXIsCkBAIC0xNzQsNiArMTgxLDg3IEBACiAgICAgICAgIHNlcnZpY2UuR2V0TmFtZSgpLm1hcCh8Zm91bmRfbmFtZXwgZm91bmRfbmFtZSA9PSBuYW1lKQogICAgIH0KIAorICAgIGZuIEdldEludGVyZmFjZUFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbmFtZXM6ICZbU3RyaW5nXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4+IHsKKyAgICAgICAgbmFtZXMuaXRlcigpLm1hcCh8bmFtZXwgc2VsZi5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpKS5jb2xsZWN0KCkKKyAgICB9CisKKyAgICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+XSwKKyAgICAgICAgbmFtZXM6ICZbU3RyaW5nXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgaWYgc2VydmljZXMubGVuKCkgPT0gbmFtZXMubGVuKCkgeworICAgICAgICAgICAgZm9yIChzLCBuKSBpbiBzZXJ2aWNlcy5pdGVyKCkuemlwKG5hbWVzKSB7CisgICAgICAgICAgICAgICAgaWYgIXNlbGYuVmVyaWZ5TmFtZShzLCBuKT8geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2soZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9rKHRydWUpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhmYWxzZSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoCisgICAgICAgICZzZWxmLAorICAgICAgICBuYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pj4+PgorICAgIHsKKyAgICAgICAgaWYgbGV0IFNvbWUobmFtZXMpID0gbmFtZXMgeworICAgICAgICAgICAgbGV0IG11dCBzZXJ2aWNlcyA9IHZlYyFbXTsKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzIHsKKyAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShuYW1lKSA9IG5hbWUgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFNvbWUoc2VsZi5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpPykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goTm9uZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2soU29tZShzZXJ2aWNlcykpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhOb25lKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+XT4sCisgICAgICAgIG5hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBpZiBsZXQgKFNvbWUoc2VydmljZXMpLCBTb21lKG5hbWVzKSkgPSAoc2VydmljZXMsIG5hbWVzKSB7CisgICAgICAgICAgICBmb3IgKHMsIG4pIGluIHNlcnZpY2VzLml0ZXIoKS56aXAobmFtZXMpIHsKKyAgICAgICAgICAgICAgICBpZiBsZXQgKFNvbWUocyksIFNvbWUobikpID0gKHMsIG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgIXNlbGYuVmVyaWZ5TmFtZShzLCBuKT8geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9rKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBzLmlzX3NvbWUoKSB8fCBuLmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPayhmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2sodHJ1ZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKHNlcnZpY2VzLmlzX25vbmUoKSAmJiBuYW1lcy5pc19ub25lKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBHZXRJbnRlcmZhY2VMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4+Pj4KKyAgICB7CisgICAgICAgIHNlbGYuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcykKKyAgICB9CisKKyAgICBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj5dPiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMpCisgICAgfQorCiAgICAgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoCiAgICAgICAgICZzZWxmLAogICAgICAgICByZWFkOiAmUGFyY2VsRmlsZURlc2NyaXB0b3IsCkBAIC0yMDksMTMgKzI5NywxMyBAQAogICAgICAgICBPayhpbnB1dC5tYXAoU3RyaW5nOjpmcm9tKSkKICAgICB9CiAKLSAgICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoCi0gICAgICAgICZzZWxmLAotICAgICAgICBpbnB1dDogT3B0aW9uPCZTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6U3RydWN0dXJlZFBhcmNlbGFibGU+LAotICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cnVjdHVyZWRQYXJjZWxhYmxlOjpTdHJ1Y3R1cmVkUGFyY2VsYWJsZT4+IHsKKyAgICBmbiBSZXBlYXROdWxsYWJsZVBhcmNlbGFibGUoJnNlbGYsIGlucHV0OiBPcHRpb248JkVtcHR5PikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPEVtcHR5Pj4gewogICAgICAgICBPayhpbnB1dC5jbG9uZWQoKSkKICAgICB9CiAKKyAgICBpbXBsX3JlcGVhdF9udWxsYWJsZSEge1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUFycmF5LCBPcHRpb248RW1wdHk+fQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVQYXJjZWxhYmxlTGlzdCwgT3B0aW9uPEVtcHR5Pn0KKwogICAgIGZuIFRha2VzQW5JQmluZGVyKCZzZWxmLCBfOiAmU3BJQmluZGVyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4gewogICAgICAgICBPaygoKSkKICAgICB9CkBAIC0yMjQsNiArMzEyLDE0IEBACiAgICAgICAgIE9rKCgpKQogICAgIH0KIAorICAgIGZuIFRha2VzQW5JQmluZGVyTGlzdCgmc2VsZiwgXzogJltTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KCZzZWxmLCBfOiBPcHRpb248JltPcHRpb248U3BJQmluZGVyPl0+KSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKICAgICBmbiBSZXZlcnNlTnVsbGFibGVVdGY4Q3BwU3RyaW5nKAogICAgICAgICAmc2VsZiwKICAgICAgICAgaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCkBAIC0yODksMTggKzM4NSw2MCBAQAogICAgICAgICBPaygoKSkKICAgICB9CiAKKyAgICBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGVwOiAmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgICAgIGVwMjogJm11dCBFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIGVwMi5hID0gZXAuYTsKKyAgICAgICAgZXAyLmIgPSBlcC5iLmNsb25lKCk7CisKKyAgICAgICAgbGV0IG15X2V4dCA9IGVwLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpPzsKKyAgICAgICAgaWYgbGV0IFNvbWUobXlfZXh0KSA9IG15X2V4dCB7CisgICAgICAgICAgICBlcDIuZXh0LnNldF9wYXJjZWxhYmxlKG15X2V4dCk/OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXAyLmV4dC5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIGxpc3Q6ICZSZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OlJlc3VsdDxSZWN1cnNpdmVMaXN0PiB7CisgICAgICAgIGxldCBtdXQgcmV2ZXJzZWQ6IE9wdGlvbjxSZWN1cnNpdmVMaXN0PiA9IE5vbmU7CisgICAgICAgIGxldCBtdXQgY3VyOiBPcHRpb248JlJlY3Vyc2l2ZUxpc3Q+ID0gU29tZShsaXN0KTsKKyAgICAgICAgd2hpbGUgbGV0IFNvbWUobm9kZSkgPSBjdXIgeworICAgICAgICAgICAgcmV2ZXJzZWQgPSBTb21lKFJlY3Vyc2l2ZUxpc3QgeyB2YWx1ZTogbm9kZS52YWx1ZSwgbmV4dDogcmV2ZXJzZWQubWFwKEJveDo6bmV3KSB9KTsKKyAgICAgICAgICAgIGN1ciA9IG5vZGUubmV4dC5hc19yZWYoKS5tYXAofG58IG4uYXNfcmVmKCkpOworICAgICAgICB9CisgICAgICAgIC8vIGBsaXN0YCBpcyBhbHdheXMgbm90IGVtcHR5LCBzbyBpcyBgcmV2ZXJzZWRgLgorICAgICAgICBPayhyZXZlcnNlZC51bndyYXAoKSkKKyAgICB9CisKKyAgICBmbiBSZXZlcnNlSUJpbmRlckFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbU3BJQmluZGVyXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxTcElCaW5kZXI+PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTcElCaW5kZXI+PiB7CisgICAgICAgICpyZXBlYXRlZCA9IGlucHV0Lml0ZXIoKS5jbG9uZWQoKS5tYXAoU29tZSkuY29sbGVjdCgpOworICAgICAgICBPayhpbnB1dC5pdGVyKCkucmV2KCkuY2xvbmVkKCkuY29sbGVjdCgpKQorICAgIH0KKworICAgIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiBPcHRpb248JltPcHRpb248U3BJQmluZGVyPl0+LAorICAgICAgICByZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTcElCaW5kZXI+Pj4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTcElCaW5kZXI+Pj4+IHsKKyAgICAgICAgbGV0IGlucHV0ID0gaW5wdXQuZXhwZWN0KCJpbnB1dCBpcyBudWxsIik7CisgICAgICAgICpyZXBlYXRlZCA9IFNvbWUoaW5wdXQudG9fdmVjKCkpOworICAgICAgICBPayhTb21lKGlucHV0Lml0ZXIoKS5yZXYoKS5jbG9uZWQoKS5jb2xsZWN0KCkpKQorICAgIH0KKwogICAgIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBJT2xkTmFtZTo6SU9sZE5hbWU+PiB7Ci0gICAgICAgIE9rKElPbGROYW1lOjpCbk9sZE5hbWU6Om5ld19iaW5kZXIoCi0gICAgICAgICAgICBPbGROYW1lLAotICAgICAgICAgICAgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSwKLSAgICAgICAgKSkKKyAgICAgICAgT2soSU9sZE5hbWU6OkJuT2xkTmFtZTo6bmV3X2JpbmRlcihPbGROYW1lLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKSkKICAgICB9CiAKICAgICBmbiBHZXROZXdOYW1lSW50ZXJmYWNlKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gSU5ld05hbWU6OklOZXdOYW1lPj4gewotICAgICAgICBPayhJTmV3TmFtZTo6Qm5OZXdOYW1lOjpuZXdfYmluZGVyKAotICAgICAgICAgICAgTmV3TmFtZSwKLSAgICAgICAgICAgIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCksCi0gICAgICAgICkpCisgICAgICAgIE9rKElOZXdOYW1lOjpCbk5ld05hbWU6Om5ld19iaW5kZXIoTmV3TmFtZSwgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSkpCiAgICAgfQogCiAgICAgZm4gR2V0Q3BwSmF2YVRlc3RzKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248U3BJQmluZGVyPj4gewpAQCAtMzI4LDExICs0NjYsMTEwIEBACiAgICAgZm4gcmV0dXJuc0xlbmd0aE9mRm9vQXJyYXkoJnNlbGYsIGZvb3M6ICZbRm9vXSkgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CiAgICAgICAgIE9rKGZvb3MubGVuKCkgYXMgaTMyKQogICAgIH0KLSAgICBmbiBpZ25vcmVQYXJjZWxhYmxlc0FuZFJlcGVhdEludCgmc2VsZiwgX2luX2ZvbzogJkZvbywgX2lub3V0X2ZvbzogJm11dCBGb28sIF9vdXRfZm9vOiAmbXV0IEZvbywgdmFsdWU6IGkzMikgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgZm4gaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoCisgICAgICAgICZzZWxmLAorICAgICAgICBfaW5fZm9vOiAmRm9vLAorICAgICAgICBfaW5vdXRfZm9vOiAmbXV0IEZvbywKKyAgICAgICAgX291dF9mb286ICZtdXQgRm9vLAorICAgICAgICB2YWx1ZTogaTMyLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CiAgICAgICAgIE9rKHZhbHVlKQogICAgIH0KIH0KIAorc3RydWN0IE5lc3RlZFNlcnZpY2U7CisKK2ltcGwgSW50ZXJmYWNlIGZvciBOZXN0ZWRTZXJ2aWNlIHt9CisKK2ltcGwgSU5lc3RlZFNlcnZpY2U6OklOZXN0ZWRTZXJ2aWNlIGZvciBOZXN0ZWRTZXJ2aWNlIHsKKyAgICBmbiBmbGlwU3RhdHVzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgcDogJlBhcmNlbGFibGVXaXRoTmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OlJlc3VsdD4geworICAgICAgICBpZiBwLnN0YXR1cyA9PSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok9LIHsKKyAgICAgICAgICAgIE9rKElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OlJlc3VsdCB7CisgICAgICAgICAgICAgICAgc3RhdHVzOiBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSywKKyAgICAgICAgICAgIH0pCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpSZXN1bHQgeyBzdGF0dXM6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6T0sgfSkKKyAgICAgICAgfQorICAgIH0KKyAgICBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc3Q6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1cywKKyAgICAgICAgY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6SUNhbGxiYWNrPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHN0ID09IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6T0sgeworICAgICAgICAgICAgY2IuZG9uZShQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNiLmRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSykKKyAgICAgICAgfQorICAgIH0KK30KKworc3RydWN0IEZpeGVkU2l6ZUFycmF5U2VydmljZTsKKworaW1wbCBJbnRlcmZhY2UgZm9yIEZpeGVkU2l6ZUFycmF5U2VydmljZSB7fQorCitpbXBsIElSZXBlYXRGaXhlZFNpemVBcnJheTo6SVJlcGVhdEZpeGVkU2l6ZUFycmF5IGZvciBGaXhlZFNpemVBcnJheVNlcnZpY2UgeworICAgIGZuIFJlcGVhdEJ5dGVzKCZzZWxmLCBpbnB1dDogJlt1ODsgM10sIHJlcGVhdGVkOiAmbXV0IFt1ODsgM10pIC0+IGJpbmRlcjo6UmVzdWx0PFt1ODsgM10+IHsKKyAgICAgICAgKnJlcGVhdGVkID0gKmlucHV0OworICAgICAgICBPaygqaW5wdXQpCisgICAgfQorICAgIGZuIFJlcGVhdEludHMoJnNlbGYsIGlucHV0OiAmW2kzMjsgM10sIHJlcGVhdGVkOiAmbXV0IFtpMzI7IDNdKSAtPiBiaW5kZXI6OlJlc3VsdDxbaTMyOyAzXT4geworICAgICAgICAqcmVwZWF0ZWQgPSAqaW5wdXQ7CisgICAgICAgIE9rKCppbnB1dCkKKyAgICB9CisgICAgZm4gUmVwZWF0QmluZGVycygKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiAmW1NwSUJpbmRlcjsgM10sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IFtPcHRpb248U3BJQmluZGVyPjsgM10sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxbU3BJQmluZGVyOyAzXT4geworICAgICAgICAqcmVwZWF0ZWQgPSBpbnB1dC5jbG9uZSgpLm1hcChTb21lKTsKKyAgICAgICAgT2soaW5wdXQuY2xvbmUoKSkKKyAgICB9CisgICAgZm4gUmVwZWF0UGFyY2VsYWJsZXMoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltJbnRQYXJjZWxhYmxlOyAzXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgW0ludFBhcmNlbGFibGU7IDNdLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8W0ludFBhcmNlbGFibGU7IDNdPiB7CisgICAgICAgICpyZXBlYXRlZCA9ICppbnB1dDsKKyAgICAgICAgT2soKmlucHV0KQorICAgIH0KKyAgICBmbiBSZXBlYXQyZEJ5dGVzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbW3U4OyAzXTsgMl0sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IFtbdTg7IDNdOyAyXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFtbdTg7IDNdOyAyXT4geworICAgICAgICAqcmVwZWF0ZWQgPSAqaW5wdXQ7CisgICAgICAgIE9rKCppbnB1dCkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRJbnRzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbW2kzMjsgM107IDJdLAorICAgICAgICByZXBlYXRlZDogJm11dCBbW2kzMjsgM107IDJdLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8W1tpMzI7IDNdOyAyXT4geworICAgICAgICAqcmVwZWF0ZWQgPSAqaW5wdXQ7CisgICAgICAgIE9rKCppbnB1dCkKKyAgICB9CisgICAgZm4gUmVwZWF0MmRCaW5kZXJzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbW1NwSUJpbmRlcjsgM107IDJdLAorICAgICAgICByZXBlYXRlZDogJm11dCBbW09wdGlvbjxTcElCaW5kZXI+OyAzXTsgMl0sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxbW1NwSUJpbmRlcjsgM107IDJdPiB7CisgICAgICAgICpyZXBlYXRlZCA9IGlucHV0LmNsb25lKCkubWFwKHxuZXN0ZWR8IG5lc3RlZC5tYXAoU29tZSkpOworICAgICAgICBPayhpbnB1dC5jbG9uZSgpKQorICAgIH0KKyAgICBmbiBSZXBlYXQyZFBhcmNlbGFibGVzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbW0ludFBhcmNlbGFibGU7IDNdOyAyXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgW1tJbnRQYXJjZWxhYmxlOyAzXTsgMl0sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxbW0ludFBhcmNlbGFibGU7IDNdOyAyXT4geworICAgICAgICAqcmVwZWF0ZWQgPSAqaW5wdXQ7CisgICAgICAgIE9rKCppbnB1dCkKKyAgICB9Cit9CisKIGZuIG1haW4oKSB7CiAgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OnNldF90aHJlYWRfcG9vbF9tYXhfdGhyZWFkX2NvdW50KDApOwogICAgIGJpbmRlcjo6UHJvY2Vzc1N0YXRlOjpzdGFydF90aHJlYWRfcG9vbCgpOwpAQCAtMzQ2LDUgKzU4MywyMSBAQAogICAgIGJpbmRlcjo6YWRkX3NlcnZpY2UodmVyc2lvbmVkX3NlcnZpY2VfbmFtZSwgdmVyc2lvbmVkX3NlcnZpY2UuYXNfYmluZGVyKCkpCiAgICAgICAgIC5leHBlY3QoIkNvdWxkIG5vdCByZWdpc3RlciBzZXJ2aWNlIik7CiAKKyAgICBsZXQgbmVzdGVkX3NlcnZpY2VfbmFtZSA9CisgICAgICAgIDxJTmVzdGVkU2VydmljZTo6QnBOZXN0ZWRTZXJ2aWNlIGFzIElOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZT46OmdldF9kZXNjcmlwdG9yKCk7CisgICAgbGV0IG5lc3RlZF9zZXJ2aWNlID0KKyAgICAgICAgSU5lc3RlZFNlcnZpY2U6OkJuTmVzdGVkU2VydmljZTo6bmV3X2JpbmRlcihOZXN0ZWRTZXJ2aWNlLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKTsKKyAgICBiaW5kZXI6OmFkZF9zZXJ2aWNlKG5lc3RlZF9zZXJ2aWNlX25hbWUsIG5lc3RlZF9zZXJ2aWNlLmFzX2JpbmRlcigpKQorICAgICAgICAuZXhwZWN0KCJDb3VsZCBub3QgcmVnaXN0ZXIgc2VydmljZSIpOworCisgICAgbGV0IGZpeGVkX3NpemVfYXJyYXlfc2VydmljZV9uYW1lID0KKyAgICAgICAgPElSZXBlYXRGaXhlZFNpemVBcnJheTo6QnBSZXBlYXRGaXhlZFNpemVBcnJheSBhcyBJUmVwZWF0Rml4ZWRTaXplQXJyYXk6OklSZXBlYXRGaXhlZFNpemVBcnJheT46OmdldF9kZXNjcmlwdG9yKCk7CisgICAgbGV0IGZpeGVkX3NpemVfYXJyYXlfc2VydmljZSA9IElSZXBlYXRGaXhlZFNpemVBcnJheTo6Qm5SZXBlYXRGaXhlZFNpemVBcnJheTo6bmV3X2JpbmRlcigKKyAgICAgICAgRml4ZWRTaXplQXJyYXlTZXJ2aWNlLAorICAgICAgICBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpLAorICAgICk7CisgICAgYmluZGVyOjphZGRfc2VydmljZShmaXhlZF9zaXplX2FycmF5X3NlcnZpY2VfbmFtZSwgZml4ZWRfc2l6ZV9hcnJheV9zZXJ2aWNlLmFzX2JpbmRlcigpKQorICAgICAgICAuZXhwZWN0KCJDb3VsZCBub3QgcmVnaXN0ZXIgc2VydmljZSIpOworCiAgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OmpvaW5fdGhyZWFkX3Bvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlX2FzeW5jLnJzIGIvdGVzdHMvcnVzdC90ZXN0X3NlcnZpY2VfYXN5bmMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjZDAzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1c3QvdGVzdF9zZXJ2aWNlX2FzeW5jLnJzCkBAIC0wLDAgKzEsNTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIFRlc3QgUnVzdCBzZXJ2aWNlIGZvciB0aGUgQUlETCBjb21waWxlci4KKwordXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpuZXN0ZWQ6OnsKKyAgICBJTmVzdGVkU2VydmljZSwgUGFyY2VsYWJsZVdpdGhOZXN0ZWQsCit9OwordXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjpJVGVzdFNlcnZpY2U6OnsKKyAgICBzZWxmLCBCblRlc3RTZXJ2aWNlLCBCcFRlc3RTZXJ2aWNlLCBFbXB0eTo6RW1wdHksCit9OwordXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmFpZGw6OmFuZHJvaWQ6OmFpZGw6OnRlc3RzOjp7CisgICAgZXh0ZW5zaW9uOjpFeHRlbmRhYmxlUGFyY2VsYWJsZTo6RXh0ZW5kYWJsZVBhcmNlbGFibGUsIGV4dGVuc2lvbjo6TXlFeHQ6Ok15RXh0LAorICAgIEJhY2tlbmRUeXBlOjpCYWNrZW5kVHlwZSwgQnl0ZUVudW06OkJ5dGVFbnVtLCBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpDb25zdGFudEV4cHJlc3Npb25FbnVtLAorICAgIElOYW1lZENhbGxiYWNrLCBJTmV3TmFtZSwgSU9sZE5hbWUsIEludEVudW06OkludEVudW0sIExvbmdFbnVtOjpMb25nRW51bSwKKyAgICBSZWN1cnNpdmVMaXN0OjpSZWN1cnNpdmVMaXN0LCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZSwgVW5pb24sCit9OwordXNlIGFpZGxfdGVzdF9pbnRlcmZhY2U6OmJpbmRlcjo6eworICAgIHNlbGYsIEJpbmRlckZlYXR1cmVzLCBJbnRlcmZhY2UsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBTcElCaW5kZXIsCit9OwordXNlIGFpZGxfdGVzdF92ZXJzaW9uZWRfaW50ZXJmYWNlOjphaWRsOjphbmRyb2lkOjphaWRsOjp2ZXJzaW9uZWQ6OnRlc3RzOjp7CisgICAgQmF6VW5pb246OkJhelVuaW9uLCBGb286OkZvbywgSUZvb0ludGVyZmFjZSwgSUZvb0ludGVyZmFjZTo6Qm5Gb29JbnRlcmZhY2UsCisgICAgSUZvb0ludGVyZmFjZTo6QnBGb29JbnRlcmZhY2UsCit9OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpzeW5jOjpNdXRleDsKKwordXNlIGFzeW5jX3RyYWl0Ojphc3luY190cmFpdDsKKworZm4gZHVwX2ZkKGZkOiAmUGFyY2VsRmlsZURlc2NyaXB0b3IpIC0+IFBhcmNlbEZpbGVEZXNjcmlwdG9yIHsKKyAgICBQYXJjZWxGaWxlRGVzY3JpcHRvcjo6bmV3KGZkLmFzX3JlZigpLnRyeV9jbG9uZSgpLnVud3JhcCgpKQorfQorCitzdHJ1Y3QgTmFtZWRDYWxsYmFjayhTdHJpbmcpOworCitpbXBsIEludGVyZmFjZSBmb3IgTmFtZWRDYWxsYmFjayB7fQorCisjW2FzeW5jX3RyYWl0XQoraW1wbCBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2tBc3luY1NlcnZlciBmb3IgTmFtZWRDYWxsYmFjayB7CisgICAgYXN5bmMgZm4gR2V0TmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIE9rKHNlbGYuMC5jbG9uZSgpKQorICAgIH0KK30KKworc3RydWN0IE9sZE5hbWU7CisKK2ltcGwgSW50ZXJmYWNlIGZvciBPbGROYW1lIHt9CisKKyNbYXN5bmNfdHJhaXRdCitpbXBsIElPbGROYW1lOjpJT2xkTmFtZUFzeW5jU2VydmVyIGZvciBPbGROYW1lIHsKKyAgICBhc3luYyBmbiBSZWFsTmFtZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIE9rKCJPbGROYW1lIi5pbnRvKCkpCisgICAgfQorfQorCisjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCitzdHJ1Y3QgTmV3TmFtZTsKKworaW1wbCBJbnRlcmZhY2UgZm9yIE5ld05hbWUge30KKworI1thc3luY190cmFpdF0KK2ltcGwgSU5ld05hbWU6OklOZXdOYW1lQXN5bmNTZXJ2ZXIgZm9yIE5ld05hbWUgeworICAgIGFzeW5jIGZuIFJlYWxOYW1lKCZzZWxmKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgT2soIk5ld05hbWUiLmludG8oKSkKKyAgICB9Cit9CisKKyNbZGVyaXZlKERlZmF1bHQpXQorc3RydWN0IFRlc3RTZXJ2aWNlIHsKKyAgICBzZXJ2aWNlX21hcDogTXV0ZXg8SGFzaE1hcDxTdHJpbmcsIGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pj4sCit9CisKK2ltcGwgSW50ZXJmYWNlIGZvciBUZXN0U2VydmljZSB7fQorCisvLyBNYWNyb3MgYXJlIGV4cGFuZGVkIGluIHRoZSB3cm9uZyBvcmRlciwgc28gYXN5bmNfdHJhaXQgZG9lcyBub3QgYXBwbHkgdG8KKy8vIGZ1bmN0aW9ucyBkZWZpbmVkIGJ5IGRlY2xhcmF0aXZlIG1hY3Jvcy4KKwordHlwZSBCb3hGdXR1cmU8J2EsIFQ+ID0gc3RkOjpwaW46OlBpbjxCb3g8ZHluIHN0ZDo6ZnV0dXJlOjpGdXR1cmU8T3V0cHV0ID0gVD4gKyBTZW5kICsgJ2E+PjsKKworbWFjcm9fcnVsZXMhIGltcGxfcmVwZWF0IHsKKyAgICAoJHJlcGVhdF9uYW1lOmlkZW50LCAkdHlwZTp0eSkgPT4geworICAgICAgICBmbiAkcmVwZWF0X25hbWU8J2EsICdiPigmJ2Egc2VsZiwgdG9rZW46ICR0eXBlKSAtPiBCb3hGdXR1cmU8J2IsIGJpbmRlcjo6UmVzdWx0PCR0eXBlPj4KKyAgICAgICAgd2hlcmUKKyAgICAgICAgICAgICdhOiAnYiwKKyAgICAgICAgICAgIFNlbGY6ICdiLAorICAgICAgICB7CisgICAgICAgICAgICBCb3g6OnBpbihhc3luYyBtb3ZlIHsgT2sodG9rZW4pIH0pCisgICAgICAgIH0KKyAgICB9OworfQorCittYWNyb19ydWxlcyEgaW1wbF9yZXZlcnNlIHsKKyAgICAoJHJldmVyc2VfbmFtZTppZGVudCwgJHR5cGU6dHkpID0+IHsKKyAgICAgICAgZm4gJHJldmVyc2VfbmFtZTwnYSwgJ2IsICdjLCAnZD4oCisgICAgICAgICAgICAmJ2Egc2VsZiwKKyAgICAgICAgICAgIGlucHV0OiAmJ2IgWyR0eXBlXSwKKyAgICAgICAgICAgIHJlcGVhdGVkOiAmJ2MgbXV0IFZlYzwkdHlwZT4sCisgICAgICAgICkgLT4gQm94RnV0dXJlPCdkLCBiaW5kZXI6OlJlc3VsdDxWZWM8JHR5cGU+Pj4KKyAgICAgICAgd2hlcmUKKyAgICAgICAgICAgICdhOiAnZCwKKyAgICAgICAgICAgICdiOiAnZCwKKyAgICAgICAgICAgICdjOiAnZCwKKyAgICAgICAgICAgIFNlbGY6ICdkLAorICAgICAgICB7CisgICAgICAgICAgICBCb3g6OnBpbihhc3luYyBtb3ZlIHsKKyAgICAgICAgICAgICAgICByZXBlYXRlZC5jbGVhcigpOworICAgICAgICAgICAgICAgIHJlcGVhdGVkLmV4dGVuZF9mcm9tX3NsaWNlKGlucHV0KTsKKyAgICAgICAgICAgICAgICBPayhpbnB1dC5pdGVyKCkucmV2KCkuY2xvbmVkKCkuY29sbGVjdCgpKQorICAgICAgICAgICAgfSkKKyAgICAgICAgfQorICAgIH07Cit9CisKK21hY3JvX3J1bGVzISBpbXBsX3JlcGVhdF9yZXZlcnNlIHsKKyAgICAoJHJlcGVhdF9uYW1lOmlkZW50LCAkcmV2ZXJzZV9uYW1lOmlkZW50LCAkdHlwZTp0eSkgPT4geworICAgICAgICBpbXBsX3JlcGVhdCEgeyRyZXBlYXRfbmFtZSwgJHR5cGV9CisgICAgICAgIGltcGxfcmV2ZXJzZSEgeyRyZXZlcnNlX25hbWUsICR0eXBlfQorICAgIH07Cit9CisKK21hY3JvX3J1bGVzISBpbXBsX3JlcGVhdF9udWxsYWJsZSB7CisgICAgKCRyZXBlYXRfbnVsbGFibGVfbmFtZTppZGVudCwgJHR5cGU6dHkpID0+IHsKKyAgICAgICAgZm4gJHJlcGVhdF9udWxsYWJsZV9uYW1lPCdhLCAnYiwgJ2M+KAorICAgICAgICAgICAgJidhIHNlbGYsCisgICAgICAgICAgICBpbnB1dDogT3B0aW9uPCYnYiBbJHR5cGVdPiwKKyAgICAgICAgKSAtPiBCb3hGdXR1cmU8J2MsIGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8JHR5cGU+Pj4+CisgICAgICAgIHdoZXJlCisgICAgICAgICAgICAnYTogJ2MsCisgICAgICAgICAgICAnYjogJ2MsCisgICAgICAgICAgICBTZWxmOiAnYywKKyAgICAgICAgeworICAgICAgICAgICAgQm94OjpwaW4oYXN5bmMgbW92ZSB7IE9rKGlucHV0Lm1hcCg8WyR0eXBlXT46OnRvX3ZlYykpIH0pCisgICAgICAgIH0KKyAgICB9OworfQorCisjW2FzeW5jX3RyYWl0XQoraW1wbCBJVGVzdFNlcnZpY2U6OklUZXN0U2VydmljZUFzeW5jU2VydmVyIGZvciBUZXN0U2VydmljZSB7CisgICAgaW1wbF9yZXBlYXQhIHtSZXBlYXRCeXRlLCBpOH0KKyAgICBpbXBsX3JldmVyc2UhIHtSZXZlcnNlQnl0ZSwgdTh9CisKKyAgICBhc3luYyBmbiBVbmltcGxlbWVudGVkTWV0aG9kKCZzZWxmLCBfOiBpMzIpIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgICAgICAvLyBQcmV0ZW5kIHRoaXMgbWV0aG9kIGhhc24ndCBiZWVuIGltcGxlbWVudGVkCisgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fVFJBTlNBQ1RJT04uaW50bygpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFRlc3RPbmV3YXkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIEVycihiaW5kZXI6OlN0YXR1c0NvZGU6OlVOS05PV05fRVJST1IuaW50bygpKQorICAgIH0KKworICAgIGFzeW5jIGZuIERlcHJlY2F0ZWQoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGltcGxfcmVwZWF0X3JldmVyc2UhIHtSZXBlYXRCb29sZWFuLCBSZXZlcnNlQm9vbGVhbiwgYm9vbH0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0Q2hhciwgUmV2ZXJzZUNoYXIsIHUxNn0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0SW50LCBSZXZlcnNlSW50LCBpMzJ9CisgICAgaW1wbF9yZXBlYXRfcmV2ZXJzZSEge1JlcGVhdExvbmcsIFJldmVyc2VMb25nLCBpNjR9CisgICAgaW1wbF9yZXBlYXRfcmV2ZXJzZSEge1JlcGVhdEZsb2F0LCBSZXZlcnNlRmxvYXQsIGYzMn0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0RG91YmxlLCBSZXZlcnNlRG91YmxlLCBmNjR9CisgICAgaW1wbF9yZXBlYXRfcmV2ZXJzZSEge1JlcGVhdEJ5dGVFbnVtLCBSZXZlcnNlQnl0ZUVudW0sIEJ5dGVFbnVtfQorICAgIGltcGxfcmVwZWF0X3JldmVyc2UhIHtSZXBlYXRJbnRFbnVtLCBSZXZlcnNlSW50RW51bSwgSW50RW51bX0KKyAgICBpbXBsX3JlcGVhdF9yZXZlcnNlISB7UmVwZWF0TG9uZ0VudW0sIFJldmVyc2VMb25nRW51bSwgTG9uZ0VudW19CisgICAgaW1wbF9yZXZlcnNlISB7UmV2ZXJzZVN0cmluZywgU3RyaW5nfQorICAgIGltcGxfcmV2ZXJzZSEge1JldmVyc2VTdHJpbmdMaXN0LCBTdHJpbmd9CisgICAgaW1wbF9yZXZlcnNlISB7UmV2ZXJzZVV0ZjhDcHBTdHJpbmcsIFN0cmluZ30KKworICAgIGFzeW5jIGZuIFJlcGVhdFN0cmluZygmc2VsZiwgaW5wdXQ6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBPayhpbnB1dC5pbnRvKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmVwZWF0VXRmOENwcFN0cmluZygmc2VsZiwgaW5wdXQ6ICZzdHIpIC0+IGJpbmRlcjo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBPayhpbnB1dC5pbnRvKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0T3RoZXJUZXN0U2VydmljZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG5hbWU6ICZzdHIsCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4geworICAgICAgICBsZXQgbXV0IHNlcnZpY2VfbWFwID0gc2VsZi5zZXJ2aWNlX21hcC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBvdGhlcl9zZXJ2aWNlID0gc2VydmljZV9tYXAuZW50cnkobmFtZS5pbnRvKCkpLm9yX2luc2VydF93aXRoKHx8IHsKKyAgICAgICAgICAgIGxldCBuYW1lZF9jYWxsYmFjayA9IE5hbWVkQ2FsbGJhY2sobmFtZS5pbnRvKCkpOworICAgICAgICAgICAgSU5hbWVkQ2FsbGJhY2s6OkJuTmFtZWRDYWxsYmFjazo6bmV3X2FzeW5jX2JpbmRlcigKKyAgICAgICAgICAgICAgICBuYW1lZF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICBydCgpLAorICAgICAgICAgICAgICAgIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCksCisgICAgICAgICAgICApCisgICAgICAgIH0pOworICAgICAgICBPayhvdGhlcl9zZXJ2aWNlLnRvX293bmVkKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gVmVyaWZ5TmFtZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2U6ICZiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPiwKKyAgICAgICAgbmFtZTogJnN0ciwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VydmljZS5HZXROYW1lKCkubWFwKHxmb3VuZF9uYW1lfCBmb3VuZF9uYW1lID09IG5hbWUpCisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0SW50ZXJmYWNlQXJyYXkoCisgICAgICAgICZzZWxmLAorICAgICAgICBuYW1lczogJltTdHJpbmddLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pj4geworICAgICAgICBsZXQgbXV0IHJlcyA9IFZlYzo6bmV3KCk7CisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzIHsKKyAgICAgICAgICAgIHJlcy5wdXNoKHNlbGYuR2V0T3RoZXJUZXN0U2VydmljZShuYW1lKS5hd2FpdD8pOworICAgICAgICB9CisgICAgICAgIE9rKHJlcykKKyAgICB9CisKKyAgICBhc3luYyBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2VzOiAmW2JpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+XSwKKyAgICAgICAgbmFtZXM6ICZbU3RyaW5nXSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgaWYgc2VydmljZXMubGVuKCkgPT0gbmFtZXMubGVuKCkgeworICAgICAgICAgICAgZm9yIChzLCBuKSBpbiBzZXJ2aWNlcy5pdGVyKCkuemlwKG5hbWVzKSB7CisgICAgICAgICAgICAgICAgaWYgIXNlbGYuVmVyaWZ5TmFtZShzLCBuKS5hd2FpdD8geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2soZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9rKHRydWUpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhmYWxzZSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzeW5jIGZuIEdldE51bGxhYmxlSW50ZXJmYWNlQXJyYXkoCisgICAgICAgICZzZWxmLAorICAgICAgICBuYW1lczogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPGJpbmRlcjo6U3Ryb25nPGR5biBJTmFtZWRDYWxsYmFjazo6SU5hbWVkQ2FsbGJhY2s+Pj4+PgorICAgIHsKKyAgICAgICAgaWYgbGV0IFNvbWUobmFtZXMpID0gbmFtZXMgeworICAgICAgICAgICAgbGV0IG11dCBzZXJ2aWNlcyA9IHZlYyFbXTsKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzIHsKKyAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShuYW1lKSA9IG5hbWUgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFNvbWUoc2VsZi5HZXRPdGhlclRlc3RTZXJ2aWNlKG5hbWUpLmF3YWl0PykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goTm9uZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2soU29tZShzZXJ2aWNlcykpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhOb25lKQorICAgICAgICB9CisgICAgfQorCisgICAgYXN5bmMgZm4gVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHNlcnZpY2VzOiBPcHRpb248JltPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+XT4sCisgICAgICAgIG5hbWVzOiBPcHRpb248JltPcHRpb248U3RyaW5nPl0+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBpZiBsZXQgKFNvbWUoc2VydmljZXMpLCBTb21lKG5hbWVzKSkgPSAoc2VydmljZXMsIG5hbWVzKSB7CisgICAgICAgICAgICBmb3IgKHMsIG4pIGluIHNlcnZpY2VzLml0ZXIoKS56aXAobmFtZXMpIHsKKyAgICAgICAgICAgICAgICBpZiBsZXQgKFNvbWUocyksIFNvbWUobikpID0gKHMsIG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgIXNlbGYuVmVyaWZ5TmFtZShzLCBuKS5hd2FpdD8geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9rKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBzLmlzX3NvbWUoKSB8fCBuLmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPayhmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT2sodHJ1ZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKHNlcnZpY2VzLmlzX25vbmUoKSAmJiBuYW1lcy5pc19ub25lKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3luYyBmbiBHZXRJbnRlcmZhY2VMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj4+Pj4KKyAgICB7CisgICAgICAgIHNlbGYuR2V0TnVsbGFibGVJbnRlcmZhY2VBcnJheShuYW1lcykuYXdhaXQKKyAgICB9CisKKyAgICBhc3luYyBmbiBWZXJpZnlOYW1lc1dpdGhJbnRlcmZhY2VMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc2VydmljZXM6IE9wdGlvbjwmW09wdGlvbjxiaW5kZXI6OlN0cm9uZzxkeW4gSU5hbWVkQ2FsbGJhY2s6OklOYW1lZENhbGxiYWNrPj5dPiwKKyAgICAgICAgbmFtZXM6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuVmVyaWZ5TmFtZXNXaXRoTnVsbGFibGVJbnRlcmZhY2VBcnJheShzZXJ2aWNlcywgbmFtZXMpLmF3YWl0CisgICAgfQorCisgICAgYXN5bmMgZm4gUmVwZWF0UGFyY2VsRmlsZURlc2NyaXB0b3IoCisgICAgICAgICZzZWxmLAorICAgICAgICByZWFkOiAmUGFyY2VsRmlsZURlc2NyaXB0b3IsCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxQYXJjZWxGaWxlRGVzY3JpcHRvcj4geworICAgICAgICBPayhkdXBfZmQocmVhZCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmV2ZXJzZVBhcmNlbEZpbGVEZXNjcmlwdG9yQXJyYXkoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogJltQYXJjZWxGaWxlRGVzY3JpcHRvcl0sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IFZlYzxPcHRpb248UGFyY2VsRmlsZURlc2NyaXB0b3I+PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxQYXJjZWxGaWxlRGVzY3JpcHRvcj4+IHsKKyAgICAgICAgcmVwZWF0ZWQuY2xlYXIoKTsKKyAgICAgICAgcmVwZWF0ZWQuZXh0ZW5kKGlucHV0Lml0ZXIoKS5tYXAoZHVwX2ZkKS5tYXAoU29tZSkpOworICAgICAgICBPayhpbnB1dC5pdGVyKCkucmV2KCkubWFwKGR1cF9mZCkuY29sbGVjdCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFRocm93U2VydmljZUV4Y2VwdGlvbigmc2VsZiwgY29kZTogaTMyKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBFcnIoYmluZGVyOjpTdGF0dXM6Om5ld19zZXJ2aWNlX3NwZWNpZmljX2Vycm9yKGNvZGUsIE5vbmUpKQorICAgIH0KKworICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVJbnRBcnJheSwgaTMyfQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVCeXRlRW51bUFycmF5LCBCeXRlRW51bX0KKyAgICBpbXBsX3JlcGVhdF9udWxsYWJsZSEge1JlcGVhdE51bGxhYmxlSW50RW51bUFycmF5LCBJbnRFbnVtfQorICAgIGltcGxfcmVwZWF0X251bGxhYmxlISB7UmVwZWF0TnVsbGFibGVMb25nRW51bUFycmF5LCBMb25nRW51bX0KKyAgICBpbXBsX3JlcGVhdF9udWxsYWJsZSEge1JlcGVhdE51bGxhYmxlU3RyaW5nTGlzdCwgT3B0aW9uPFN0cmluZz59CisKKyAgICBhc3luYyBmbiBSZXBlYXROdWxsYWJsZVN0cmluZygmc2VsZiwgaW5wdXQ6IE9wdGlvbjwmc3RyPikgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFN0cmluZz4+IHsKKyAgICAgICAgT2soaW5wdXQubWFwKFN0cmluZzo6ZnJvbSkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmVwZWF0TnVsbGFibGVVdGY4Q3BwU3RyaW5nKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6IE9wdGlvbjwmc3RyPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTdHJpbmc+PiB7CisgICAgICAgIE9rKGlucHV0Lm1hcChTdHJpbmc6OmZyb20pKQorICAgIH0KKworICAgIGFzeW5jIGZuIFJlcGVhdE51bGxhYmxlUGFyY2VsYWJsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiBPcHRpb248JkVtcHR5PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxFbXB0eT4+IHsKKyAgICAgICAgT2soaW5wdXQuY2xvbmVkKCkpCisgICAgfQorCisgICAgaW1wbF9yZXBlYXRfbnVsbGFibGUhIHtSZXBlYXROdWxsYWJsZVBhcmNlbGFibGVBcnJheSwgT3B0aW9uPEVtcHR5Pn0KKyAgICBpbXBsX3JlcGVhdF9udWxsYWJsZSEge1JlcGVhdE51bGxhYmxlUGFyY2VsYWJsZUxpc3QsIE9wdGlvbjxFbXB0eT59CisKKyAgICBhc3luYyBmbiBUYWtlc0FuSUJpbmRlcigmc2VsZiwgXzogJlNwSUJpbmRlcikgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gVGFrZXNBTnVsbGFibGVJQmluZGVyKCZzZWxmLCBfOiBPcHRpb248JlNwSUJpbmRlcj4pIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFRha2VzQW5JQmluZGVyTGlzdCgmc2VsZiwgXzogJltTcElCaW5kZXJdKSAtPiBiaW5kZXI6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBUYWtlc0FOdWxsYWJsZUlCaW5kZXJMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgXzogT3B0aW9uPCZbT3B0aW9uPFNwSUJpbmRlcj5dPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoCisgICAgICAgICZzZWxmLAorICAgICAgICBpbnB1dDogT3B0aW9uPCZbT3B0aW9uPFN0cmluZz5dPiwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgT3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+LAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8T3B0aW9uPFZlYzxPcHRpb248U3RyaW5nPj4+PiB7CisgICAgICAgIGlmIGxldCBTb21lKGlucHV0KSA9IGlucHV0IHsKKyAgICAgICAgICAgICpyZXBlYXRlZCA9IFNvbWUoaW5wdXQudG9fdmVjKCkpOworICAgICAgICAgICAgT2soU29tZShpbnB1dC5pdGVyKCkucmV2KCkuY2xvbmVkKCkuY29sbGVjdCgpKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHRvdWNoIGByZXBlYXRlZGAgaGVyZSwgc2luY2UKKyAgICAgICAgICAgIC8vIHRoZSBDKysgdGVzdCBzZXJ2aWNlIGRvZXNuJ3QgZWl0aGVyCisgICAgICAgICAgICBPayhOb25lKQorICAgICAgICB9CisgICAgfQorCisgICAgYXN5bmMgZm4gUmV2ZXJzZVV0ZjhDcHBTdHJpbmdMaXN0KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6IE9wdGlvbjwmW09wdGlvbjxTdHJpbmc+XT4sCisgICAgICAgIHJlcGVhdGVkOiAmbXV0IE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxWZWM8T3B0aW9uPFN0cmluZz4+Pj4geworICAgICAgICBzZWxmLlJldmVyc2VOdWxsYWJsZVV0ZjhDcHBTdHJpbmcoaW5wdXQsIHJlcGVhdGVkKS5hd2FpdAorICAgIH0KKworICAgIGFzeW5jIGZuIEdldENhbGxiYWNrKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgcmV0dXJuX251bGw6IGJvb2wsCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248YmluZGVyOjpTdHJvbmc8ZHluIElOYW1lZENhbGxiYWNrOjpJTmFtZWRDYWxsYmFjaz4+PiB7CisgICAgICAgIGlmIHJldHVybl9udWxsIHsKKyAgICAgICAgICAgIE9rKE5vbmUpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLkdldE90aGVyVGVzdFNlcnZpY2UoIkFCVDogYWx3YXlzIGJlIHRlc3RpbmciKS5hd2FpdC5tYXAoU29tZSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzeW5jIGZuIEZpbGxPdXRTdHJ1Y3R1cmVkUGFyY2VsYWJsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHBhcmNlbGFibGU6ICZtdXQgU3RydWN0dXJlZFBhcmNlbGFibGU6OlN0cnVjdHVyZWRQYXJjZWxhYmxlLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcGFyY2VsYWJsZS5zaG91bGRCZUplcnJ5ID0gIkplcnJ5Ii5pbnRvKCk7CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQ29udGFpblRocmVlRnMgPSB2ZWMhW3BhcmNlbGFibGUuZiwgcGFyY2VsYWJsZS5mLCBwYXJjZWxhYmxlLmZdOworICAgICAgICBwYXJjZWxhYmxlLnNob3VsZEJlQnl0ZUJhciA9IEJ5dGVFbnVtOjpCQVI7CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQmVJbnRCYXIgPSBJbnRFbnVtOjpCQVI7CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQmVMb25nQmFyID0gTG9uZ0VudW06OkJBUjsKKyAgICAgICAgcGFyY2VsYWJsZS5zaG91bGRDb250YWluVHdvQnl0ZUZvb3MgPSB2ZWMhW0J5dGVFbnVtOjpGT08sIEJ5dGVFbnVtOjpGT09dOworICAgICAgICBwYXJjZWxhYmxlLnNob3VsZENvbnRhaW5Ud29JbnRGb29zID0gdmVjIVtJbnRFbnVtOjpGT08sIEludEVudW06OkZPT107CisgICAgICAgIHBhcmNlbGFibGUuc2hvdWxkQ29udGFpblR3b0xvbmdGb29zID0gdmVjIVtMb25nRW51bTo6Rk9PLCBMb25nRW51bTo6Rk9PXTsKKworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzEgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpkZWNJbnQzMl8xOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzIgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpkZWNJbnQzMl8yOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzMgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpkZWNJbnQ2NF8xOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzQgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpkZWNJbnQ2NF8yOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzUgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpkZWNJbnQ2NF8zOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzYgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpkZWNJbnQ2NF80OworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzcgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpoZXhJbnQzMl8xOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzggPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpoZXhJbnQzMl8yOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzkgPSBDb25zdGFudEV4cHJlc3Npb25FbnVtOjpoZXhJbnQzMl8zOworICAgICAgICBwYXJjZWxhYmxlLmNvbnN0X2V4cHJzXzEwID0gQ29uc3RhbnRFeHByZXNzaW9uRW51bTo6aGV4SW50NjRfMTsKKworICAgICAgICBwYXJjZWxhYmxlLnNob3VsZFNldEJpdDBBbmRCaXQyID0gU3RydWN0dXJlZFBhcmNlbGFibGU6OkJJVDAgfCBTdHJ1Y3R1cmVkUGFyY2VsYWJsZTo6QklUMjsKKworICAgICAgICBwYXJjZWxhYmxlLnUgPSBTb21lKFVuaW9uOjpVbmlvbjo6TnModmVjIVsxLCAyLCAzXSkpOworICAgICAgICBwYXJjZWxhYmxlLnNob3VsZEJlQ29uc3RTMSA9IFNvbWUoVW5pb246OlVuaW9uOjpTKFVuaW9uOjpTMS50b19zdHJpbmcoKSkpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXBlYXRFeHRlbmRhYmxlUGFyY2VsYWJsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGVwOiAmRXh0ZW5kYWJsZVBhcmNlbGFibGUsCisgICAgICAgIGVwMjogJm11dCBFeHRlbmRhYmxlUGFyY2VsYWJsZSwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIGVwMi5hID0gZXAuYTsKKyAgICAgICAgZXAyLmIgPSBlcC5iLmNsb25lKCk7CisKKyAgICAgICAgbGV0IG15X2V4dCA9IGVwLmV4dC5nZXRfcGFyY2VsYWJsZTo6PE15RXh0PigpPzsKKyAgICAgICAgaWYgbGV0IFNvbWUobXlfZXh0KSA9IG15X2V4dCB7CisgICAgICAgICAgICBlcDIuZXh0LnNldF9wYXJjZWxhYmxlKG15X2V4dCk/OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXAyLmV4dC5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgYXN5bmMgZm4gUmV2ZXJzZUxpc3QoJnNlbGYsIGxpc3Q6ICZSZWN1cnNpdmVMaXN0KSAtPiBiaW5kZXI6OlJlc3VsdDxSZWN1cnNpdmVMaXN0PiB7CisgICAgICAgIGxldCBtdXQgcmV2ZXJzZWQ6IE9wdGlvbjxSZWN1cnNpdmVMaXN0PiA9IE5vbmU7CisgICAgICAgIGxldCBtdXQgY3VyOiBPcHRpb248JlJlY3Vyc2l2ZUxpc3Q+ID0gU29tZShsaXN0KTsKKyAgICAgICAgd2hpbGUgbGV0IFNvbWUobm9kZSkgPSBjdXIgeworICAgICAgICAgICAgcmV2ZXJzZWQgPSBTb21lKFJlY3Vyc2l2ZUxpc3QgeyB2YWx1ZTogbm9kZS52YWx1ZSwgbmV4dDogcmV2ZXJzZWQubWFwKEJveDo6bmV3KSB9KTsKKyAgICAgICAgICAgIGN1ciA9IG5vZGUubmV4dC5hc19yZWYoKS5tYXAofG58IG4uYXNfcmVmKCkpOworICAgICAgICB9CisgICAgICAgIC8vIGBsaXN0YCBpcyBhbHdheXMgbm90IGVtcHR5LCBzbyBpcyBgcmV2ZXJzZWRgLgorICAgICAgICBPayhyZXZlcnNlZC51bndyYXAoKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBSZXZlcnNlSUJpbmRlckFycmF5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgaW5wdXQ6ICZbU3BJQmluZGVyXSwKKyAgICAgICAgcmVwZWF0ZWQ6ICZtdXQgVmVjPE9wdGlvbjxTcElCaW5kZXI+PiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PFZlYzxTcElCaW5kZXI+PiB7CisgICAgICAgICpyZXBlYXRlZCA9IGlucHV0Lml0ZXIoKS5jbG9uZWQoKS5tYXAoU29tZSkuY29sbGVjdCgpOworICAgICAgICBPayhpbnB1dC5pdGVyKCkucmV2KCkuY2xvbmVkKCkuY29sbGVjdCgpKQorICAgIH0KKworICAgIGFzeW5jIGZuIFJldmVyc2VOdWxsYWJsZUlCaW5kZXJBcnJheSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGlucHV0OiBPcHRpb248JltPcHRpb248U3BJQmluZGVyPl0+LAorICAgICAgICByZXBlYXRlZDogJm11dCBPcHRpb248VmVjPE9wdGlvbjxTcElCaW5kZXI+Pj4sCisgICAgKSAtPiBiaW5kZXI6OlJlc3VsdDxPcHRpb248VmVjPE9wdGlvbjxTcElCaW5kZXI+Pj4+IHsKKyAgICAgICAgbGV0IGlucHV0ID0gaW5wdXQuZXhwZWN0KCJpbnB1dCBpcyBudWxsIik7CisgICAgICAgICpyZXBlYXRlZCA9IFNvbWUoaW5wdXQudG9fdmVjKCkpOworICAgICAgICBPayhTb21lKGlucHV0Lml0ZXIoKS5yZXYoKS5jbG9uZWQoKS5jb2xsZWN0KCkpKQorICAgIH0KKworICAgIGFzeW5jIGZuIEdldE9sZE5hbWVJbnRlcmZhY2UoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PGJpbmRlcjo6U3Ryb25nPGR5biBJT2xkTmFtZTo6SU9sZE5hbWU+PiB7CisgICAgICAgIE9rKElPbGROYW1lOjpCbk9sZE5hbWU6Om5ld19hc3luY19iaW5kZXIoT2xkTmFtZSwgcnQoKSwgQmluZGVyRmVhdHVyZXM6OmRlZmF1bHQoKSkpCisgICAgfQorCisgICAgYXN5bmMgZm4gR2V0TmV3TmFtZUludGVyZmFjZSgmc2VsZikgLT4gYmluZGVyOjpSZXN1bHQ8YmluZGVyOjpTdHJvbmc8ZHluIElOZXdOYW1lOjpJTmV3TmFtZT4+IHsKKyAgICAgICAgT2soSU5ld05hbWU6OkJuTmV3TmFtZTo6bmV3X2FzeW5jX2JpbmRlcihOZXdOYW1lLCBydCgpLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKSkKKyAgICB9CisKKyAgICBhc3luYyBmbiBHZXRDcHBKYXZhVGVzdHMoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PE9wdGlvbjxTcElCaW5kZXI+PiB7CisgICAgICAgIE9rKE5vbmUpCisgICAgfQorCisgICAgYXN5bmMgZm4gZ2V0QmFja2VuZFR5cGUoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PEJhY2tlbmRUeXBlPiB7CisgICAgICAgIE9rKEJhY2tlbmRUeXBlOjpSVVNUKQorICAgIH0KK30KKworc3RydWN0IEZvb0ludGVyZmFjZTsKKworaW1wbCBJbnRlcmZhY2UgZm9yIEZvb0ludGVyZmFjZSB7fQorCisjW2FzeW5jX3RyYWl0XQoraW1wbCBJRm9vSW50ZXJmYWNlOjpJRm9vSW50ZXJmYWNlQXN5bmNTZXJ2ZXIgZm9yIEZvb0ludGVyZmFjZSB7CisgICAgYXN5bmMgZm4gb3JpZ2luYWxBcGkoJnNlbGYpIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKyAgICBhc3luYyBmbiBhY2NlcHRVbmlvbkFuZFJldHVyblN0cmluZygmc2VsZiwgdTogJkJhelVuaW9uKSAtPiBiaW5kZXI6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgbWF0Y2ggdSB7CisgICAgICAgICAgICBCYXpVbmlvbjo6SW50TnVtKG4pID0+IE9rKG4udG9fc3RyaW5nKCkpLAorICAgICAgICB9CisgICAgfQorICAgIGFzeW5jIGZuIHJldHVybnNMZW5ndGhPZkZvb0FycmF5KCZzZWxmLCBmb29zOiAmW0Zvb10pIC0+IGJpbmRlcjo6UmVzdWx0PGkzMj4geworICAgICAgICBPayhmb29zLmxlbigpIGFzIGkzMikKKyAgICB9CisgICAgYXN5bmMgZm4gaWdub3JlUGFyY2VsYWJsZXNBbmRSZXBlYXRJbnQoCisgICAgICAgICZzZWxmLAorICAgICAgICBfaW5fZm9vOiAmRm9vLAorICAgICAgICBfaW5vdXRfZm9vOiAmbXV0IEZvbywKKyAgICAgICAgX291dF9mb286ICZtdXQgRm9vLAorICAgICAgICB2YWx1ZTogaTMyLAorICAgICkgLT4gYmluZGVyOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIE9rKHZhbHVlKQorICAgIH0KK30KKworc3RydWN0IE5lc3RlZFNlcnZpY2U7CisKK2ltcGwgSW50ZXJmYWNlIGZvciBOZXN0ZWRTZXJ2aWNlIHt9CisKKyNbYXN5bmNfdHJhaXRdCitpbXBsIElOZXN0ZWRTZXJ2aWNlOjpJTmVzdGVkU2VydmljZUFzeW5jU2VydmVyIGZvciBOZXN0ZWRTZXJ2aWNlIHsKKyAgICBhc3luYyBmbiBmbGlwU3RhdHVzKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgcDogJlBhcmNlbGFibGVXaXRoTmVzdGVkOjpQYXJjZWxhYmxlV2l0aE5lc3RlZCwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OlJlc3VsdD4geworICAgICAgICBpZiBwLnN0YXR1cyA9PSBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok9LIHsKKyAgICAgICAgICAgIE9rKElOZXN0ZWRTZXJ2aWNlOjpSZXN1bHQ6OlJlc3VsdCB7CisgICAgICAgICAgICAgICAgc3RhdHVzOiBQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSywKKyAgICAgICAgICAgIH0pCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPayhJTmVzdGVkU2VydmljZTo6UmVzdWx0OjpSZXN1bHQgeyBzdGF0dXM6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6T0sgfSkKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3luYyBmbiBmbGlwU3RhdHVzV2l0aENhbGxiYWNrKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgc3Q6IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1cywKKyAgICAgICAgY2I6ICZiaW5kZXI6OlN0cm9uZzxkeW4gSU5lc3RlZFNlcnZpY2U6OklDYWxsYmFjazo6SUNhbGxiYWNrPiwKKyAgICApIC0+IGJpbmRlcjo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHN0ID09IFBhcmNlbGFibGVXaXRoTmVzdGVkOjpTdGF0dXM6OlN0YXR1czo6T0sgeworICAgICAgICAgICAgY2IuZG9uZShQYXJjZWxhYmxlV2l0aE5lc3RlZDo6U3RhdHVzOjpTdGF0dXM6Ok5PVF9PSykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNiLmRvbmUoUGFyY2VsYWJsZVdpdGhOZXN0ZWQ6OlN0YXR1czo6U3RhdHVzOjpPSykKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnQoKSAtPiBiaW5kZXJfdG9raW86OlRva2lvUnVudGltZTx0b2tpbzo6cnVudGltZTo6UnVudGltZT4geworICAgIGxldCBydCA9IHRva2lvOjpydW50aW1lOjpCdWlsZGVyOjpuZXdfY3VycmVudF90aHJlYWQoKS5lbmFibGVfYWxsKCkuYnVpbGQoKS51bndyYXAoKTsKKyAgICBiaW5kZXJfdG9raW86OlRva2lvUnVudGltZShydCkKK30KKworZm4gbWFpbigpIHsKKyAgICBiaW5kZXI6OlByb2Nlc3NTdGF0ZTo6c2V0X3RocmVhZF9wb29sX21heF90aHJlYWRfY291bnQoMCk7CisgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OnN0YXJ0X3RocmVhZF9wb29sKCk7CisKKyAgICBsZXQgc2VydmljZV9uYW1lID0gPEJwVGVzdFNlcnZpY2UgYXMgSVRlc3RTZXJ2aWNlOjpJVGVzdFNlcnZpY2U+OjpnZXRfZGVzY3JpcHRvcigpOworICAgIGxldCBzZXJ2aWNlID0KKyAgICAgICAgQm5UZXN0U2VydmljZTo6bmV3X2FzeW5jX2JpbmRlcihUZXN0U2VydmljZTo6ZGVmYXVsdCgpLCBydCgpLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKTsKKyAgICBiaW5kZXI6OmFkZF9zZXJ2aWNlKHNlcnZpY2VfbmFtZSwgc2VydmljZS5hc19iaW5kZXIoKSkuZXhwZWN0KCJDb3VsZCBub3QgcmVnaXN0ZXIgc2VydmljZSIpOworCisgICAgbGV0IHZlcnNpb25lZF9zZXJ2aWNlX25hbWUgPSA8QnBGb29JbnRlcmZhY2UgYXMgSUZvb0ludGVyZmFjZTo6SUZvb0ludGVyZmFjZT46OmdldF9kZXNjcmlwdG9yKCk7CisgICAgbGV0IHZlcnNpb25lZF9zZXJ2aWNlID0KKyAgICAgICAgQm5Gb29JbnRlcmZhY2U6Om5ld19hc3luY19iaW5kZXIoRm9vSW50ZXJmYWNlLCBydCgpLCBCaW5kZXJGZWF0dXJlczo6ZGVmYXVsdCgpKTsKKyAgICBiaW5kZXI6OmFkZF9zZXJ2aWNlKHZlcnNpb25lZF9zZXJ2aWNlX25hbWUsIHZlcnNpb25lZF9zZXJ2aWNlLmFzX2JpbmRlcigpKQorICAgICAgICAuZXhwZWN0KCJDb3VsZCBub3QgcmVnaXN0ZXIgc2VydmljZSIpOworCisgICAgbGV0IG5lc3RlZF9zZXJ2aWNlX25hbWUgPQorICAgICAgICA8SU5lc3RlZFNlcnZpY2U6OkJwTmVzdGVkU2VydmljZSBhcyBJTmVzdGVkU2VydmljZTo6SU5lc3RlZFNlcnZpY2U+OjpnZXRfZGVzY3JpcHRvcigpOworICAgIGxldCBuZXN0ZWRfc2VydmljZSA9IElOZXN0ZWRTZXJ2aWNlOjpCbk5lc3RlZFNlcnZpY2U6Om5ld19hc3luY19iaW5kZXIoCisgICAgICAgIE5lc3RlZFNlcnZpY2UsCisgICAgICAgIHJ0KCksCisgICAgICAgIEJpbmRlckZlYXR1cmVzOjpkZWZhdWx0KCksCisgICAgKTsKKyAgICBiaW5kZXI6OmFkZF9zZXJ2aWNlKG5lc3RlZF9zZXJ2aWNlX25hbWUsIG5lc3RlZF9zZXJ2aWNlLmFzX2JpbmRlcigpKQorICAgICAgICAuZXhwZWN0KCJDb3VsZCBub3QgcmVnaXN0ZXIgc2VydmljZSIpOworCisgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OmpvaW5fdGhyZWFkX3Bvb2woKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YWJpbGl0eV90ZXN0L0FuZHJvaWQuYnAgYi90ZXN0cy9zdGFiaWxpdHlfdGVzdC9BbmRyb2lkLmJwCmluZGV4IGE4ODViY2IuLjk5M2YxMjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3N0YWJpbGl0eV90ZXN0L0FuZHJvaWQuYnAKKysrIGIvdGVzdHMvc3RhYmlsaXR5X3Rlc3QvQW5kcm9pZC5icApAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgIH0sCiAgICAgICAgIHJ1c3Q6IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAogICAgIHZlcnNpb25zOiBbIjEiXSwKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgICAgICBydXN0OiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKIH0KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgICAgICBydXN0OiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKICAgICB2ZXJzaW9uczogWyIxIl0sCmRpZmYgLS1naXQgYS90ZXN0cy92ZXJzaW9uZWQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9Gb28uYWlkbCBiL3Rlc3RzL3ZlcnNpb25lZC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCmluZGV4IGFjZjc2MjAuLjRiOGMzZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZlcnNpb25lZC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCisrKyBiL3Rlc3RzL3ZlcnNpb25lZC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0Zvby5haWRsCkBAIC0xLDUgKzEsNiBAQAogcGFja2FnZSBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzOwogCitASmF2YVN1cHByZXNzTGludCh7Ik5ld0FwaSJ9KQogcGFyY2VsYWJsZSBGb28gewogICAgIC8vIFYxIGlzIGVtcHR5CiAgICAgLy8gVjIKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZlcnNpb25lZC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbCBiL3Rlc3RzL3ZlcnNpb25lZC9hbmRyb2lkL2FpZGwvdmVyc2lvbmVkL3Rlc3RzL0lGb29JbnRlcmZhY2UuYWlkbAppbmRleCBiYjM4M2I4Li4wY2U5MTAxIDEwMDY0NAotLS0gYS90ZXN0cy92ZXJzaW9uZWQvYW5kcm9pZC9haWRsL3ZlcnNpb25lZC90ZXN0cy9JRm9vSW50ZXJmYWNlLmFpZGwKKysrIGIvdGVzdHMvdmVyc2lvbmVkL2FuZHJvaWQvYWlkbC92ZXJzaW9uZWQvdGVzdHMvSUZvb0ludGVyZmFjZS5haWRsCkBAIC0xLDYgKzEsOCBAQAogcGFja2FnZSBhbmRyb2lkLmFpZGwudmVyc2lvbmVkLnRlc3RzOwogaW1wb3J0IGFuZHJvaWQuYWlkbC52ZXJzaW9uZWQudGVzdHMuQmF6VW5pb247CiBpbXBvcnQgYW5kcm9pZC5haWRsLnZlcnNpb25lZC50ZXN0cy5Gb287CisKK0BKYXZhRGVsZWdhdG9yCiBpbnRlcmZhY2UgSUZvb0ludGVyZmFjZSB7CiAgICAgLy8gVjEKICAgICB2b2lkIG9yaWdpbmFsQXBpKCk7Cg==